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