使用IndexColorModel时出现意外的颜色映射

时间:2017-04-27 08:12:01

标签: java image-processing bufferedimage alpha-transparency colormap

我有一些旧的Java 6代码,用于将黑色,白色和透明图像转换为具有两种不透明颜色和透明色的新调色板。

int[] cmap = { 0x000000, 0x6c4eee, 0x2e00a4 };
IndexColorModel icm = new IndexColorModel(2, cmap.length, cmap, 0, false, 0, DataBuffer.TYPE_BYTE);

BufferedImage orig = loadImage("image.png");
BufferedImage result = new BufferedImage(orig.getWidth(), orig.getHeight(), BufferedImage.TYPE_BYTE_INDEXED, icm);

Graphics2D g = (Graphics2D) result.getGraphics();
try {
    g.setComposite(AlphaComposite.Src);
    g.drawImage(orig, 0, 0, null);
} finally {
    g.dispose();
}

源图像仅包含黑色,白色和透明像素。我希望透明像素将映射到透明色,白色像素将映射到较浅的颜色(0x6c4eee),黑色像素将映射到较暗的颜色(0x2e00a4)。但是,与this question类似,源图像中的黑色和透明像素都映射到透明色。

有一些奇怪的事情让我想知道这是不是一个错误:

  • 如果我手动使用BufferedImage.setRGB()在新图像中设置像素颜色,则颜色会按预期转换。
  • 此代码过去在旧计算机上按预期工作。

任何人都可以解释这种行为吗?这是一个错误吗?如果是这样,是否有一个已知的解决方法? (我无法找到有关IndexColorModel的颜色转换应该如何工作的文档,因此很难说出“正确”的行为究竟是什么。)

更新:我发现this OpenJDK bug似乎相似,但建议的解决方法(使用BufferedImage(ColorModel, WritableRaster, boolean, Hashtable))并没有解决我的问题。

0 个答案:

没有答案