2 つの画像の差をバイト配列 (rgb 値) で返し、UDP 経由で送信するメソッドを実行しようとしています。コード: (今は関係ないので、この配列を送信する部分はありません)
public void getdiff(Bitmap lol,Bitmap lol2)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Rectangle rect = new Rectangle(0, 0, lol.Width, lol.Height);
BitmapData bmpData = lol.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
Rectangle rect2 = new Rectangle(0, 0, lol2.Width, lol2.Height);
BitmapData bmpData2 = lol2.LockBits(rect2, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
IntPtr ptr2 = bmpData2.Scan0;
int numBytes = bmpData.Stride * lol.Height;
byte[] rgbValues = new byte[numBytes];
int numBytes2 = bmpData2.Stride * lol2.Height;
byte[] rgbValues2 = new byte[numBytes2];
byte[] difference = new byte[numBytes];
Marshal.Copy(ptr, rgbValues, 0, numBytes);
Marshal.Copy(ptr2, rgbValues2, 0, numBytes2);
for (int counter = 0; counter < rgbValues.Length; counter++)
{
if (rgbValues[counter] != rgbValues2[counter])
{
difference[counter] = rgbValues[counter];
}
}
Marshal.Copy(rgbValues, 0, ptr, numBytes);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
textBox1.Text = ts.Milliseconds.ToString();
lol.UnlockBits(bmpData);
lol2.UnlockBits(bmpData2);
}
現在、2つの画像から2バイト配列があり、それらを比較するだけです。画像が異なる場合は、選択した画像から適切なRGB値を差分[]に書き込みます。問題は、RGB 値が両方の画像で等しい場合、この差分配列の適切な場所が 0 で埋められることです (トリプル 0 は白色を表します)。したがって、問題は、この違い[]をターゲット画像に「課す」場合、おそらくほとんどが白になることです。Marshal.Copy と Lockbits は非常に効率的であるため、使用したいと思っています。
質問: この画像の違いを保存して、読み取り/面付け時に「for」ループを掛けないようにするにはどうすればよいですか? 多分私はいくつかの方法を見逃していますか?私は LockBits と Marshal.Copy を使い続けたいと思っていますが、より良いアイデアがあれば、私と共有してください。