有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个带有alpha透明度的BuffereImage,我需要将其保存为带有索引透明度的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) 个答案

  1. # 1 楼答案

    使用ImageIO处理透明度,尤其是当保存为GIF图像时,简直是噩梦。ImageIO中的透明度支持对于不同的图像格式,甚至对于相同的图像格式,但不同的变体,都是不完整的

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

    下面的屏幕截图显示了两幅图像:左边的一幅是原始PNG图像,具有alpha通道透明度,而右边的一幅是从同一PNG图像转换而来的透明GIF图像。GIF图像实际上减少到128种颜色,但质量非常好。(巴布亚新几内亚:49K,GIF:17K)

    enter image description here

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