我在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
答案 0 :(得分:1)
PNG文件之间的区别在于使用mountainMap305.png
块索引PLTE
(颜色类型调色板),并使用包含调色板索引的tRNS
块为调色板添加透明度。
mountainMap41.png
是灰度(彩色类型灰度),并使用包含灰度值的tRNS
块为所有像素添加透明度。 Oracle的当前PNGImageReader
不支持后者(带有RGB值的tRNS
也不支持)。灰度或RGB仅支持完整的Alpha通道。
您可以自己修复此问题,方法是将图像更改为具有alpha的合适图像类型,然后查看图像元数据并替换匹配此颜色的所有像素。但是我不确定这是否正确,如果图像中的值已经进行了伽马/色彩校正......