0

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 を使い続けたいと思っていますが、より良いアイデアがあれば、私と共有してください。

4

0 に答える 0