0

ビットマップが変更されたかどうかを確認する効率的な方法を探しています。私が現在取っているアプローチは、各画像の Bitmap クラスでメソッド copyPixelsToBuffer(Buffer dst) を使用することです。次に、これら 2 つのバッファーを比較して、違いがあるかどうかを確認します。

このシナリオでは、Bitmap クラスで提供される sameAs メソッドが役立つようには見えません。

私がそれを実装することを考えていた別の方法は、.getPixel() メソッドを使用して両方の画像を比較することですが、これは効率に欠けます。

4

3 に答える 3

0

画像が変更されたかどうかを効率的に検出しようとしている場合は、元の画像の SHA1 ハッシュを計算して保存することをお勧めします。次に、変更された可能性のある画像を比較するときは、新しい画像を開いてそれらのバイトをハッシュし、元の画像の 20 バイトのハッシュと比較するだけです。2 つの画像が同じ場合、ハッシュ値は同じになります。画像が異なる場合、SHA1 ハッシュも異なります。

EDIT(コメントフィードバックに基づく):システムが頻繁に多くの変更が発生することを期待している場合は、ハッシュのファイル内のビットの分散サンプルを取得できます。その数は、(過去のデータに基づいて) 変化すると予想されるピクセル数と、95% の統計的信頼区間を得るためにサンプリングする必要があるピクセル数によって異なります。

ファイルが同じであると言った場合は、すべてのビット(または完全なファイルの保存されたハッシュ)を比較することにフォールバックできます。これにより、多くの変更が予想され、ユーザーが実際に変更を行ったことを確認したいだけのシナリオのプロセスが高速化されます。

これにより、元のファイルのビットを参照する必要がある回数が制限されます。

于 2013-05-07T01:15:49.027 に答える
0

2 つのイメージ データ バッファーを簡単に比較するには、変更のバイナリ検索を実行できます。

これは、単純なピクセルごとのチェックを改善する可能性があります。これは、画像に対するほとんどの変更が、1 つのピクセルだけでなく、近接したピクセルのグループで行われるためです。

たとえば、配列の長さが 100 の場合、次の順序でインデックスを確認できます。

レベル 1 - 50

レベル 2 - 25、75

レベル 3 - 12、37、62、87

レベル 4 - 6、18、31、43、56、68、81、93

変化が見られたらやめましょう。最悪のシナリオでは、変更がなく、すべてのピクセルをチェックします。

何か他のものを探していた場合、またはそれを実装するのに助けが必要な場合はお知らせください。

于 2013-05-06T21:44:09.247 に答える