gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:06:38 25 4
gpt4 key购买 nike

我在 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

最佳答案

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

另一方面,

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

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

关于java - ImageIO 无法正确解析有效的 .png?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32885235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com