当前位置: 首页 > 面试题库 >

有没有一种简单的方法可以比较BufferedImage实例?

慕意致
2023-03-14
问题内容

我正在研究Java应用程序的一部分,该应用程序将图像作为字节数组,将其读入java.awt.image.BufferedImage实例,然后将其传递给第三方库进行处理。

对于单元测试,我想获取一个图像(从磁盘上的文件中获取),并断言它等于代码处理过的同一图像。

  • 我的 预期 BufferedImage是使用从磁盘上的PNG文件读取的ImageIO.read(URL)
  • 我的 测试 代码将相同的文件读入A,BufferedImage并将其作为PNG写入字节数组,以提供给被测系统。

当被测系统将字节数组写入新数组时,BufferedImage我想断言这两个映像在某种意义上是相等的。equals()Object当然是)使用(继承自)。比较BufferedImage.toString()值也不起作用,因为输出字符串包含对象引用信息。

有人知道捷径吗?我宁愿不要在大型​​应用程序的一小部分中引入用于单个单元测试的第三方库。


问题答案:

这是最好的方法。无需保留变量来判断图像是否仍然相等。如果条件为假,只需立即返回假。短路评估可帮助节省比较失败后在像素上循环的时间,就像trumpetlick的回答中那样。

/**
 * Compares two images pixel by pixel.
 *
 * @param imgA the first image.
 * @param imgB the second image.
 * @return whether the images are both the same or not.
 */
public static boolean compareImages(BufferedImage imgA, BufferedImage imgB) {
  // The images must be the same size.
  if (imgA.getWidth() != imgB.getWidth() || imgA.getHeight() != imgB.getHeight()) {
    return false;
  }

  int width  = imgA.getWidth();
  int height = imgA.getHeight();

  // Loop over every pixel.
  for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
      // Compare the pixels for equality.
      if (imgA.getRGB(x, y) != imgB.getRGB(x, y)) {
        return false;
      }
    }
  }

  return true;
}


 类似资料:
  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。

  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask- principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask- principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会

  • 问题内容: 我非常喜欢Visual Studio在完成已编写的代码和所引用的ALSO代码(各种库/程序集)时为您提供注释文档/参数名称的方式。 在完成代码或将方法悬停在方法上时,是否有一种简单的方法可以在Eclipse中获取内联javadoc /参数名称?通过插件?通过某些设置?使用大量的库(就像在Java中经常发生的那样)然后当您将其放在源jar中时,必须去网站或本地javadoc位置查找信息,

  • 问题内容: 在PHP中,有没有一种简单的方法可以将数字转换为单词?举例来说, 27 到 27 。 问题答案: 我在网上找到了一些(2007/2008)源代码,它具有版权,但是我可以自由使用它,并根据需要对其进行修改,因此将其放在此处并在CC-Wiki下重新许可:

  • 问题内容: 上面显示了以下错误: 因此,我必须这样做: 但是,没有简单的方法可以做到这一点吗? 问题答案: 要删除列表中元素的首次出现,只需使用: 请注意,它不会删除所有出现的元素。为此使用列表理解。

  • 问题内容: 我正在尝试将字符串转换为。我不是在尝试解析主机名:字符串是ipv4地址。有工作吗?还是我必须手动解析它? 问题答案: 这样做更好,因为无论传递什么字符串,它都不会进行DNS查找。