2016-11-17 164 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