0

2枚の画像を比較してみました。このために、2 つの PreentScreens を次々に使用します (同一です)。ピクセル比較を使用してこの画面を比較すると、次のようになります。

public static CompareResult Compare(Bitmap bmp1, Bitmap bmp2)
{
    CompareResult cr = CompareResult.ciCompareOk;

    if (bmp1.Size != bmp2.Size)
    {
        cr = CompareResult.ciSizeMismatch;
    }
    else
    {
        for (int x = 0; x < bmp1.Width 
             && cr == CompareResult.ciCompareOk; x++)
        {
            for (int y = 0; y < bmp1.Height 
                         && cr == CompareResult.ciCompareOk; y++)
            {
                if (bmp1.GetPixel(x, y) != bmp2.GetPixel(x, y))
                    cr = CompareResult.ciPixelMismatch;
            }
        }
    }
    return cr;
}

正しい結果が得られます-比較は同一ですが、時間がかかり、このビットマップをハッシュして値を比較しようとすると、間違った結果が得られます。画像をそれ自体と比較すると、すべて問題ありません。何が間違っている可能性がありますか?ハッシュ比較のコードは次のとおりです。

public enum CompareResult
        {
            ciCompareOk,
            ciPixelMismatch,
            ciSizeMismatch
        };

        public static CompareResult Compare(Bitmap bmp1, Bitmap bmp2)
        {
            CompareResult cr = CompareResult.ciCompareOk;

            //Test to see if we have the same size of image
            if (bmp1.Size != bmp2.Size)
            {
                cr = CompareResult.ciSizeMismatch;
            }
            else
            {
                //Convert each image to a byte array
                System.Drawing.ImageConverter ic = 
                       new System.Drawing.ImageConverter();
                byte[] btImage1 = new byte[1];
                btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType());
                byte[] btImage2 = new byte[1];
                btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType());

                //Compute a hash for each image
                SHA256Managed shaM = new SHA256Managed();
                byte[] hash1 = shaM.ComputeHash(btImage1);
                byte[] hash2 = shaM.ComputeHash(btImage2);

                //Compare the hash values
                for (int i = 0; i < hash1.Length && i < hash2.Length 
                                  && cr == CompareResult.ciCompareOk; i++)
                {
                    if (hash1[i] != hash2[i])
                        cr = CompareResult.ciPixelMismatch;
                }
            }
            return cr;
        }
4

1 に答える 1

1

イメージ オブジェクトを C# .NET と比較する方法の重複の可能性はありますか? サンプルコードが含まれています。

もう 1 つの便利なリンクは、Dominic Green によるこのブログ投稿です。コードはやや小さく、SHA256 ハッシュの代わりに Base64 ハッシュを使用します。これはかなり高速ですが、画像の比較は簡単な操作ではないことに注意してください。

しかし、質問自体に戻ると、両方の画像が等しいという確信はありますか? 2つの画像にわずかな違いがある可能性はありますか? マウスカーソルの移動、時計表示の更新、...

于 2012-10-03T10:56:19.633 に答える