使用ImageIO.read可以提供修改后的图像

时间:2016-07-19 22:08:11

标签: java image javax.imageio

我正在使用JLabel s中的图像做一些事情,我注意到我使用的一些图像(包含黑色的图像)在标签中比它们应该更亮。图像是通过ImageIO#read(File)加载的。仅通过ImageIcon构造函数加载的图像看起来很正常。

这是我为这张图片拼凑的小测试:

Test image

JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
frame.setSize(320, 320);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

URL imageURL = new URL("https://wiki.factorio.com/images/Crude-oil.png");

frame.add(new JLabel(new ImageIcon(ImageIO.read(imageURL))));

frame.add(new JLabel(new ImageIcon(imageURL)));

frame.setVisible(true);

结果:

Result

关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:2)

这是一个已知的bug,当ImageIO.read()无法找到图像的正确颜色模型时会发生这种情况。

相反,构造函数ImageIcon(Url)在使用Toolkit.getDefaultToolkit().getImage(Url)检索图像时正确显示图像。

此错误也可能发生在其他图像扩展上。请参阅this

修改

向下滚动并比较以下链接中 PNG 部分中的颜色类型

http://regex.info/exif.cgi?imgurl=https://wiki.factorio.com/images/Crude-oil.png

http://regex.info/exif.cgi?imgurl=http://www.sherv.net/cm/emoticons/hand-gestures/victory-fingers-black-smiley-emoticon.png

除了两个图像都是PNG之外,您会看到两种颜色类型都不同。 ImageIO.read()的问题在于它可以正确读取带Alpha 的RGB,但不能带Alpha的灰度

我还发现ImageIO.read().getType()为第一张图片返回0 = TYPE_CUSTOM,为第二张图片返回6 = TYPE_4BYTE_ABGR。对于类型无法识别的图像,通常会返回 TYPE_CUSTOM