使用具有Alpha透明度的图像中的ImageIO保存具有索引透明度的GIF

时间:2011-12-20 09:20:13

标签: java transparency gif bufferedimage javax.imageio

我有一个带alpha透明度的BufferedImage,我需要保存为具有索引透明度的GIF。没有半像素像素,因此应该可以进行转换。

使用http://gman.eichberger.de/2007/07/transparent-gifs-in-java.html下的代码,我定义了透明度颜色(例如绿色,不是当前图像的一部分)并使其透明。工作正常,但它混合了颜色表,所有颜色看起来很糟糕(虽然我只使用3种不同的颜色)。

有没有办法调整这个或者另一种方法将这样的ARGB图像转换为索引的图像而没有明显的质量损失?

我的图像构建方式:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = (Graphics2D)image.getGraphics();
graphics.setColor(backgroundColor);
graphics.fillRect(0, 0, width, height);
// Some more painting here
graphics.dispose();

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用ImageIO处理透明度,尤其是在保存为GIF图像时,这是一场噩梦。 ImageIO中的透明度支持对于不同的图像格式甚至是相同的图像格式但不同的变化是不完整的。

如果你已经有一个二进制透明的BufferedImage,我有一个颜色量化工具和一个GIF encoder来保存为具有透明度的GIF。如果图像的实际颜色小于256,则不应用量化。否则,颜色将减少到小于256,但保留透明色。可以在量化过程中应用抖动,因此得到的图像大小可能比平常大。

以下屏幕截图显示了两个图像:左边的图像是具有Alpha通道透明度的原始PNG图像,而右边的图像是从同一PNG图像转换的透明GIF图像。 GIF图像实际上减少到128种颜色,但质量很好。 (PNG:49K,GIF:17K)

enter image description here

图片来源:http://svg2rlg.googlecode.com/svn-history/r2/trunk/test-suite/png/butterfly.png