0

重複の可能性:
2つの同じサイズのビットマップを比較して、それらが同一であるかどうかを判断するための最速の方法は何ですか?

2つのビットマップ間の差を効率的に計算し、一致するピクセルを黒に設定しようとしています。私はこれを試しました:

for (int x = 0; x < 1280; x++)
{
    for (int y = 0; y < 720; y++)
    {
        if (bitmap.GetPixel(x, y) == bitmap2.GetPixel(x, y))
        {
            bitmap2.SetPixel(x, y, Color.Black);
        }
    }
}

しかし、GetPixelとSetPixelは遅いので、これは実際には十分に機能しません。誰かがこれを行うための代替の(より速い)方法を知っていますか?

4

3 に答える 3

4

この方法では、ビットマップが同じサイズでピクセルあたり4バイトであると想定して、安全でないコードを使用します。

Rectangle bounds = new Rectangle(0,0,bitmapA.Width,bitmapA.Height);
var bmpDataA = bitmapA.LockBits(bounds, ImageLockMode.ReadWrite, bitmapA.PixelFormat);
var bmpDataB = bitmapB.LockBits(bounds, ImageLockMode.ReadWrite, bitmapB.PixelFormat);

const int height = 720;
int npixels = height * bmpDataA.Stride/4;
unsafe {
    int * pPixelsA = (int*)bmpDataA.Scan0.ToPointer();
    int * pPixelsB = (int*)bmpDataB.Scan0.ToPointer();

    for ( int i = 0; i < npixels; ++i ) {
        if (pPixelsA[i] != pPixelsB[i]) {
             pPixelsB[i] = Color.Black.ToArgb();
        }
    }
}
bitmapA.UnlockBits(bmpDataA);
bitmapB.UnlockBits(bmpDataB);

安全な方法として、ピクセルデータを配列バッファーにコピーして、そのInteropServices.Marshal.Copy方法を使用して処理します。

于 2013-01-08T03:08:18.187 に答える
2

生のビットマップデータとLockBitmap。

http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp

質問(例がありません)。 2つの同じサイズのビットマップを比較して、それらが同一であるかどうかを判断するための最速の方法は何ですか?

デバッグモードをオフにして速度を上げる場合は忘れてください。abaut 10xですが、lockbitはまだ高速です。

于 2013-01-08T02:48:45.863 に答える
1

これが以前に答えられたことはほぼ確実です。次のものを使用する必要があります。

Bitmap.LockBits

また、WidthとHeight(または同じ情報を持つ他のプロパティ)へのアクセスも遅いため、ループで使用する場合は(例の720と1280ではなく)ローカル変数にコピーします。

于 2013-01-08T02:48:57.183 に答える