java - 使用 ImageIO.read 给出修改后的图像

标签 java image javax.imageio

我正在使用 JLabel 中的图像做一些事情,我注意到我使用的一些图像(包含黑色的图像)在标签中比预期的更亮是。图片是通过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

关于为什么会发生这种情况有什么想法吗?

最佳答案

这是已知的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

关于java - 使用 ImageIO.read 给出修改后的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38469342/

相关文章:

java - 第 22 行 : No source code is available for type in html libgdx

mysql - 将图像存储在 MySQL 数据库中

image - 将一个Word文档插入另一个中时丢失的VBA图像

java - 使用pdfbox在java中将pdf文件转换为图像时缺少文本

java - ImageIO.read(URL) 需要很长时间

java - 使用 lambda 在 Java 流中调用带参数的构造函数

java - Android - 电影卡住时的动画 gif,仅显示图像的一小部分

java - 如何对多项式执行复杂的变量更改(在 Mathematica 中)

html - 以 HTML 格式在图片上可见的文本

java - 使用 ImageIO 创建动画 GIF?