我正在使用 JLabel
中的图像做一些事情,我注意到我使用的一些图像(包含黑色的图像)在标签中比预期的更亮是。图片是通过ImageIO#read(File)
加载的。仅通过 ImageIcon
构造函数加载的图像看起来很正常。
这是我针对此图像进行的一个小测试:
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);
结果:
关于为什么会发生这种情况有什么想法吗?
最佳答案
这是已知的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
除了两个图像都是 PNG 之外,您会发现两种颜色类型都不同。 ImageIO.read()
的问题的问题是它可以正确读取带 Alpha 的 RGB,但不能正确读取带 Alpha 的灰度。
我还发现ImageIO.read().getType()
返回 0 = TYPE_CUSTOM对于第一张图像,6 = TYPE_4BYTE_ABGR对于第二个。对于类型无法识别的图像,通常会返回 TYPE_CUSTOM。
关于java - 使用 ImageIO.read 给出修改后的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38469342/