6

異なるビットマップの SHA1 ハッシュを計算したい (SHA は強制されない)。問題は、基本的に同じビットマップ (キャプチャ) がいくつかあることですが、名前は頻繁に変更されます。

私はこれを見つけました:

Android/Java および C# で SHA256 ハッシュを計算する

しかし、それは私が望んでいた解決策ではありません。

Bitmap.hashCode() は、Integer のみを生成します。

このオブジェクトの整数ハッシュ コードを返します。規約により、equals(Object) が true を返す 2 つのオブジェクトは、同じハッシュ コード値を返す必要があります。これは、通常、Object のサブクラスが両方のメソッドをオーバーライドするか、どちらのメソッドもオーバーライドしないことを意味します。

オブジェクトのハッシュ コードは必要ありません。ビットマップ コンテンツのハッシュコードが必要です。ありがとう!

4

5 に答える 5

7

Android 3.1 以降 (API レベル 12) には、ピクセルを比較し、2 つが同じ画像を表している場合に返すメソッドがBitmap呼び出されます。sameAs()これはネイティブ コードで実行されるため、比較的高速です。

下位の API レベルをターゲットにする必要がある場合は、2 つのオブジェクトの各ピクセルを反復処理して一致するかどうかを確認するメソッドを作成する必要があります。これは、Java コードで行うと非常に集中的なプロセスになるため、ネイティブ コードで比較を行うためにアプリケーションから呼び出すことができる NDK を使用して小さなルーチンを作成することを検討してください (NDK にはビットマップ API があるため、簡単に比較できます)。ピクセルバッファを取得します)。

Java でこれを行うことを選択した場合getPixels()は、2 つの画像を比較できるピクセル データの配列を取得するのに役立ちます。

HTH

于 2012-06-20T21:49:15.447 に答える
2

Arrays.hashCode、およびを使用して、ビットマップ ハッシュを計算するためのよりネイティブな方法を次に示します。bitmap.getPixels

int hash(Bitmap bitmap){
   int[] buffer = new int[bitmap.getWidth(), bitmap.getHeight()];
   bitmap.getPixels(buffer, 0, 0, 0, 0, bitmap.getWidth(), bitmap.getHeight());
   return Arrays.hashCode(buffer);
}
于 2019-04-09T18:49:01.597 に答える
1

Bitmap の Pixel のみを使用して、独自の関数を作成してみることができます。

public long hashBitmap(Bitmap bmp){
  long hash = 31 //or a higher prime at your choice
  for(int x = 0; x < bmp.getWidth(); x++){
    for (int y = 0; y < bmp.getHeight(); y++){
      hash *= (bmp.getPixel(x,y) + 31);
    }
  }
  return hash;
}

2 つの画像を比較するだけの場合は、このルーチンを最適化して、1 秒ごとまたは x ピクセルごとにハッシュすることができます

于 2012-06-20T21:50:57.683 に答える