【发布时间】:2017-06-16 23:02:10
【问题描述】:
如何在java中将图像保存为java.awt.image.IndexColorModel PNG?我正在使用 ImageIO 加载索引颜色 png,使用 Catalino 库对其进行操作,不幸的是,该库将颜色空间转换为 java.awt.image.DirectColorModel。
现在我想以与原始图像完全相同的格式保存结果。我尝试了以下sn-p的代码。
private static void testIndexedColor() throws IOException {
FastBitmap input = new FastBitmap("test.png");
BufferedImage bi = new BufferedImage(input.getWidth(), input.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
bi.getGraphics().drawImage(input.toBufferedImage(), 0, 0, null);
ImageIO.write(bi, "PNG", new File("test_result.png"));
}
但结果白色背景中出现了奇怪的浅灰色像素伪影,PPI下降。如何正确转换回索引颜色模式而不会造成质量损失和失真?
【问题讨论】:
-
这里发生的情况是,您的
biBufferedImage是使用默认IndexColorModel创建的(恰好与256 色“网络安全”调色板的颜色相同)。您需要从input获取IndexColorModel或某种形式的调色板条目。如果这是不可能的,作为最坏的情况,您可以使用ImageIO再次读取输入文件以获取它(更慢),甚至使用某种形式的颜色减少(最慢)为修改后的图像重新创建“最佳”调色板.不确定 PPI 发生了什么(或者这是否重要)。 -
PS:你指的库是Catalano框架吗?
-
另外值得一提的是,特定的图像是黑白的。当我在 gimp 模式下打开它时说它是索引颜色。但是,如果我使用 ImageIO 将此图像加载到 BufferedImage 并立即使用 ImageIO 将相同的 BufferedImage 写入文件,则该模式现在是神秘的灰度。我什至不确定灰度和索引颜色是否相互排斥,或者灰度图像是否可以使用调色板?为什么会发生这种转换?
-
您介意分享PNG吗?在 Java 中
IndexColorModel始终使用 sRGB 颜色空间。但这并不能阻止颜色全是灰色。所以这真的取决于你定义的“灰度”。当没有与文件中的颜色数据匹配的ColorModel类,或者如果这样的ColorModel不切实际(慢)时,通常会发生转换(在Java ImageIO 中,我不知道Gimp 的细节)。 -
我的更新版本对您有帮助吗?
标签: java graphics png bufferedimage javax.imageio