-1

我有一个BufferedImage里面有多个瓷砖。

我想要的是相互比较瓷砖,看看它们是否相同。

那么如何从缓冲图像中提取每个单独的图块中的数据,以便在哈希算法中使用它们来比较它们呢?

4

2 回答 2

2

您不想比较哈希值,只需逐个像素地浏览图像就很容易了。

  assert imageA.getWidth() == imageB.getWidth();
  assert imageA.getHeight() == imageB.getHeight();

  for (int x = 0; x < imageA.getWidth(); x++)
  {
     for (int y = 0; y < imageA.getHeight(); y++)
     {
        assert imageA.getRGB(x, y) == imageB.getRGB(x, y);
     }
  }
于 2012-11-15T18:10:25.083 回答
1

您可以为此使用MessageDigest 。从页面引用:

此 MessageDigest 类为应用程序提供消息摘要算法的功能,例如 SHA-1 或 SHA-256。消息摘要是一种安全的单向散列函数,它采用任意大小的数据并输出固定长度的散列值。

您可以搜索使用此类的示例,以了解如何使用不同的散列算法实现散列。您还可以使用其他为您简化工作的库,例如apache commons 中的DigestUtils。对于我们的案例,我将使用上面页面中的示例:

首先,获取瓦片的数据:我们检查构成瓦片的像素并读取 rgb 值。那将是一个整数。注意消息摘要的 API,您需要将其设为字节数组并更新摘要。您可以创建一个从 int 获取字节数组的方法。或者您可以将整数连接成一个字符串,并为整个字符串获取一个完整的数组,该数组表示图块中的所有整数。然后你从那个字符串中得到字节。请注意,我将使用硬编码值仅用于在第一个图块上进行演示,并且我不会处理异常等...:

StringBuilder firstImageRGBStr=new StringBuilder();
for (int i=0; i<32; i++)
 for (int j=0; j<32; j++)
   firstImageRGBStr.append(img.getRGB(i,j));


MessageDigest md = MessageDigest.getInstance("SHA");
byte[] firstImageDigest = md.digest(firstImageRGBStr.toString().getBytes());

现在您将字节数组存储为第一个图块的哈希值,以供将来比较。请注意,您不需要为每个图块创建新的 MessageDigest,因为在保存图块的哈希后,您可以使用reset()将消息摘要重用于另一个图块。

比较散列现在变成了包含散列的字节数组的比较。并注意 MessageDigest 类有一个静态方法,它比较两个摘要,它只是这样做isEqual()

于 2012-11-15T23:00:26.087 回答