2016-11-17 121 views
-1

我在Java Spring中創建了一個應該返回包含透明背景中文本的圖像的方法。我一直在尋找一段時間,但我找不到答案。透明背景上的純文本

我認爲這是一個很好的方式使用Graphics2D但我無法找到神奇的公式。以下示例不起作用:

@RequestMapping(value= "/test", method = RequestMethod.GET) 
public void dynamicImage(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    response.setContentType("image/jpg"); 

    ServletOutputStream out = response.getOutputStream(); 

    BufferedImage image = new BufferedImage(200, 40, BufferedImage.TYPE_BYTE_INDEXED); 

    Graphics2D graphics = image.createGraphics(); 
    graphics.setComposite(AlphaComposite.Clear); 
    graphics.fillRect(0,0, 200, 40); 

    // I know ... I am using Comic Sans for testing ... 
    Font font = new Font("Comic Sans MS", Font.BOLD, 30); 
    graphics.setFont(font); 

    graphics.setColor(Color.RED); 

    graphics.drawString("Hello World!", 5, 30); 

    graphics.dispose(); 

    // Use PNG Decoder 
    //JPEGCodec.createJPEGEncoder(out).encode(image); 

    out.close(); 
} 
+0

@嚇人-袋熊我要求一個圖像是透明的。它不能是JPG我很高興與PNG的例子。 – Tk421

+0

也許http://stackoverflow.com/questions/28522368/how-can-i-generate-a-transparent-gif-in-java –

+0

@嚇人的袋熊我試過這種例子。文字和背景變得透明。 – Tk421

回答

2

存在一些問題。首先,你需要創建一個圖像緩存,可以支持阿爾法:

BufferedImage image = new BufferedImage(200, 40, BufferedImage.TYPE_INT_ARGB); 

其次,清理你忘了設置合成規則回到SrcOver背景之後。但是,不需要清除背景(它被初始化爲透明),所以我們可以離開這一步。

的與校正(和添加的抗鋸齒提示)的代碼看起來是這樣的:

@RequestMapping(value= "/test", method = RequestMethod.GET) 
    public void dynamicImage(HttpServletRequest request, HttpServletResponse response) throws IOException { 
     response.setContentType("image/png"); 
     ServletOutputStream out = response.getOutputStream(); 

     // Create an image buffer that supports alpha 
     BufferedImage image = new BufferedImage(200, 40, BufferedImage.TYPE_INT_ARGB); 

     // Create a graphics context and turn antialiasing on 
     Graphics2D graphics = image.createGraphics(); 
     graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 

     // Comic Sans FTW 
     Font font = new Font("Comic Sans MS", Font.BOLD, 30); 
     graphics.setFont(font); 
     graphics.setColor(Color.RED); 
     graphics.drawString("Hello World!", 5, 30); 

     // Dispose of the context 
     graphics.dispose(); 

     // Encode to png 
     ImageIO.write(image, "PNG", out); 
    } 
+0

感謝您的意見。瞭解整個過程非常有幫助。 – Tk421