ImageIO 没有正确解析有效的 .png?

ImageIO does not parse valid .png correctly?

我在 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 的转换功能创建的,它 returns 该图像的第一个像素具有 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

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

另一方面,

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

您可以自行解决此问题,方法是将图像更改为具有 alpha 的合适图像类型,然后查看图像元数据并替换与该颜色匹配的所有像素。但我不确定这是否正确,如果图像中的值已经 gamma/color 更正...