1

私はここで解決策についてstackowerflowで多くの質問と回答を読みましたが、それでも私の問題を解決するのに役立つ解決策を見つけることができません。

だから私は2つの本当に大きな画像を持っています、そして私はそれらを比較する必要があります。

画像はで作成されていimageNamed:ないため、キャッシュされないため、機能し[image1 isEqual:image2] ないはずです。

私が理解しているようにそれらを比較する唯一の解決策はこれです:

- (BOOL)image:(UIImage *)image1 isEqualTo:(UIImage *)image2
{
    return [UIImagePNGRepresentation(image1) isEqual:UIImagePNGRepresentation(image2)];
}

ただし、画像のサイズが非常に大きいため、比較には時間がかかります。

上記の方法を使用して等しいかどうかを確認しないようにするのに役立つプロパティはありますか?

たとえば、私はimage1.sizeそれを取得して比較することができますがimage2.size、それらが等しくない場合は、上記のメソッドを実行する必要はありません。何か案は?ありがとうございました。

4

1 に答える 1

6

ポインタではなく、ピクセルの等式で画像を比較する必要がある場合は、次のように実行できます。

画像を作成するときに、すべての画像に対して何らかのハッシュを作成できます。たとえば、すべてのピクセル値の合計(多分、いくつかの巨大な数を法として;多分、ピクセル位置によって供給されます)。

次に、その値をに格納しますNSDictionary[image] = hashValue。次に、画像を比較するときは、最初に前述のようにサイズを比較し、次に、画像が等しい場合は、辞書からのハッシュを比較します。

それらが等しい場合、画像はおそらく等しいですが、100%確実であるために手動でチェックする必要があります。

手動チェックには時間がかかる場合があるため、MORE HASHES、異なるモジュロ、ハッシュのハッシュ、左上のピクセルの値(冗談ですが、誰が知っている...)など。

統計が多ければ多いほど、衝突が少なくなることは明らかです。実験の分野:)

それ以外の場合は、このようにポインタアドレスを比較してください

if(image1 == image2) { 
     ...
}
于 2013-03-13T15:41:28.953 に答える