複数BufferedImage
のタイルが入ったものがあります。
私が望むのは、タイルを互いに比較して、それらが同一であるかどうかを確認することです。
では、バッファリングされた画像から個々のタイルからデータを抽出し、ハッシュ アルゴリズムでそれらを比較するために使用するにはどうすればよいでしょうか?
複数BufferedImage
のタイルが入ったものがあります。
私が望むのは、タイルを互いに比較して、それらが同一であるかどうかを確認することです。
では、バッファリングされた画像から個々のタイルからデータを抽出し、ハッシュ アルゴリズムでそれらを比較するために使用するにはどうすればよいでしょうか?
ハッシュを比較する必要はありません。画像をピクセルごとに調べるだけで十分簡単です。
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);
}
}
これにはMessageDigestを使用できます。ページからの引用:
このMessageDigestクラスは、SHA-1やSHA-256などのメッセージダイジェストアルゴリズムの機能をアプリケーションに提供します。メッセージダイジェストは、任意のサイズのデータを取得して固定長のハッシュ値を出力する安全な一方向ハッシュ関数です。
このクラスの使用例を検索して、さまざまなハッシュアルゴリズムでハッシュを実装する方法を確認できます。また、apache commonsのDigestUtilsなど、作業を簡素化する他のライブラリを使用することもできます。私たちの場合、上のページの例を使用します。
まず、タイルのデータを取得します。タイルを構成するピクセルを調べて、rgb値を読み取ります。それはintになります。メッセージダイジェストのAPIに気付いたら、それをバイト配列にしてダイジェストを更新する必要があります。intからバイト配列を取得するメソッドを作成することもできます。または、intを文字列に連結して、タイル内のすべての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());
ここで、将来の比較のために、バイト配列を最初のタイルのハッシュとして格納します。タイルのハッシュを保存した後、 reset()を使用して別のタイルのメッセージダイジェストを再利用できるため、タイルごとに新しいMessageDigestを作成する必要はないことに注意してください。
ハッシュを比較することは、ハッシュを含むバイト配列の比較になります。また、MessageDigestクラスには、isEqual()を実行する2つのダイジェストを比較する静的メソッドがあることに注意してください。