【问题标题】:Using ImageIO.read gives a modified image使用 ImageIO.read 给出修改后的图像
【发布时间】:2016-07-19 22:08:10
【问题描述】:

我正在对JLabels 中的图像进行一些处理,我注意到我使用的一些图像(包含黑色的图像)在标签中比他们应该的要亮。图片是通过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);

结果:

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

【问题讨论】:

    标签: java image javax.imageio


    【解决方案1】:

    这是一个已知的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() 的问题在于它可以正确读取 RGB with Alpha,但不能正确读取 Grayscale with Alpha

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

    【讨论】:

    • 谢谢;有趣的是,您的两个链接(错误和其他答案)都引用了 JPEG,而我的链接是 PNG。
    • 抱歉,我找不到任何与 PNG 相关的参考资料,但我现在发现了一些有趣的东西。请检查编辑。
    • 也很有趣;我非常感谢额外的研究。恐怕我不能再投票了,否则我会的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多