【问题标题】:BufferedImage comparison showing weird behaviourBufferedImage 比较显示奇怪的行为
【发布时间】:2017-11-24 05:28:23
【问题描述】:

我正在使用它来与 BufferedImage 进行比较

private boolean compareImages(BufferedImage actualImage, BufferedImage expectedImage) {
    for (int x = 0; x < expectedImage.getWidth(); x++) {
        for (int y = 0; y < expectedImage.getHeight();y++) {
            if (actualImage.getRGB(x, y) != expectedImage.getRGB(x, y)) {
                return false;
            }
        }
    }
    return true;
}

图片类型为PNG时有效,图片类型为JPEG/JPG时无效

这是我尝试运行此代码的方式:-`

BufferedImage resizedImage = Scalr.resize(originalImage,50,50);
ImageIO.write(resizedImage,new File("a.jpg"));
BufferedImage bufferedImage = ImageIO.read(new File("a.jpg"));
assertTrue(compareImages(resizedImage, bufferedImage));

这对于 JPG/JPEG 及其怪异而失败。

PS:我正在使用这个库 'Scalr' 来调整图像大小

【问题讨论】:

  • 你在哪里初始化actualImage in assertTrue(compareImages(actualImage, file));?并且a.jpg 不起作用,除非a 有一个名为jpgString 字段。
  • 这段代码的目的是什么?它应该逐个像素地直接比较(没有任何epsilon)吗?如果你比较例如。 jpg 和 png 从相同的源图像创建,您的代码现在会告诉它们是不同的。这是期望的行为吗?
  • @AndyTurner 有多个错别字..我已经更正了..
  • @KrzysztofCichocki 这段代码的目的是生成一个调整大小的 JPEG,以后可以在测试中使用它以确保调整大小按预期进行。只是添加它并不意味着比较跨格式
  • 您的测试只测试ImageIO.read() 的输出应该与ImageIO.write() 的输入相匹配。是否正确(或根本)调整大小无关紧要。你确定这是你要测试的吗?正如其他人所提到的,这肯定不适用于 JPEG。如果您生成静态图像以供以后在测试中使用,则格式无关紧要,因此您不妨使用 PNG。正如 Krzysztof 所说,您可能应该在比较中添加一些容错(并分成 R、G、B 和 A,并分别比较每个组件)。

标签: java javax.imageio


【解决方案1】:

请记住 jpeg 是一种有损格式,然后将图像写入 jpeg 文件(例如对其进行编码)可能会修改图像,因此将其取回可能不会导致原始图像...

【讨论】:

  • 哦.. 有什么办法可以确保它不会发生吗?
  • @Harshil 不要使用 jpeg。
  • @Harshil 唉。即使尝试将图像质量设置为 100% 也不能保证不会造成任何损失……
  • 我希望我不必这样做。但我必须开发这种调整 JPEG/JPG 和 PNG 图像大小的功能。因此我几乎不能跳过它:(
  • @Jean-BaptisteYunès 好的。我还在想办法。你对使用 ImageWriter 有什么看法?正如这里提到的stackoverflow.com/questions/17015197/…
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
相关资源
最近更新 更多