ImageIO无法正确解析有效的.png?

时间:2015-10-01 10:27:20

标签: java image imagemagick javax.imageio

我在Java中有一个函数,它使用ImageIO.read()来读取文件并检测它是否完全透明:

private static boolean isFullyAlpha(File f) throws IOException {
    BufferedImage img = ImageIO.read(f);
    for (int y = 0; y < img.getHeight(); y++) {
        for (int x = 0; x < img.getWidth(); x++) {
            if (((img.getRGB(x, y) >> 24) & 0xFF) != 0) {
                println( f.name + " " + ((img.getRGB(x, y) >> 24) & 0xFF) + " " + x + " " + y)
                return false;
            }
        }
    }
    return true;
}

如果我尝试通过裁剪图像来读取使用ImageMagick转换功能创建的非常简单的文件,则返回该图像的第一个像素具有255个alpha(根本不透明),而它适用于其他图片。

ImageIO错误的文件:https://dl.dropboxusercontent.com/u/9186429/imageTest/mountainMap41.png

Java的ImageIO有问题吗?如果是,哪个库可以正确解析此图像?像Paint.NET或Gimp这样的图像编辑器正确地解释了这个图像。

注意:此功能正确解析的文件:
https://dl.dropboxusercontent.com/u/9186429/imageTest/mountainMap305.png

1 个答案:

答案 0 :(得分:1)

PNG文件之间的区别在于使用mountainMap305.png块索引PLTE(颜色类型调色板),并使用包含调色板索引的tRNS块为调色板添加透明度。

另一方面,

mountainMap41.png是灰度(彩色类型灰度),并使用包含灰度值的tRNS块为所有像素添加透明度。 Oracle的当前PNGImageReader不支持后者(带有RGB值的tRNS也不支持)。灰度或RGB仅支持完整的Alpha通道。

您可以自己修复此问题,方法是将图像更改为具有alpha的合适图像类型,然后查看图像元数据并替换匹配此颜色的所有像素。但是我不确定这是否正确,如果图像中的值已经进行了伽马/色彩校正......