2

Visual Studio 2010 で 2 つのビットマップ イメージの違いを取得する関数を作成しています。パラメータとして 2 つのビットマップ イメージを取得する関数があり、ロック解除ビットを使用して各ピクセルのデータを取得します。両方のイメージの解像度と寸法は同じです。

1 つのイメージのみにロック解除ビットを使用するとうまく機能しますが、同じ関数で同時に両方に使用すると例外が発生します。

ビットマップ領域はすでにロックされています

コード:

    public Bitmap Invert(Bitmap b,Bitmap c)
    {

        BitmapData bmData = 
            b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height),
                       ImageLockMode.ReadWrite, 
                       System.Drawing.Imaging.PixelFormat.Format24bppRgb);

       int stride = bmData.Stride;
        System.IntPtr Scan0 = bmData.Scan0;

        // for image 2
       BitmapData data2 = 
           c.LockBits(new System.Drawing.Rectangle(0, 
                                                   0, 
                                                   c.Width,
                                                   c.Height),
                      ImageLockMode.ReadWrite,
                      System.Drawing.Imaging.PixelFormat.Format24bppRgb);

      int  stride1 = data2.Stride;
        System.IntPtr Scan1 = data2.Scan0;
        unsafe
        {
            byte* p = (byte*)(void*)Scan0;
            byte* q = (byte*)(void*)Scan1;
            nOffset = stride - b.Width * 3;
            nWidth = b.Width * 3;
            for (y = 0; y < b.Height; ++y)
            {
                for (x = 0; x < nWidth; ++x)
                {
                    p[0] = (byte)(p[0]-q[0]);
                    ++p;
                    ++q;
                }
                p += nOffset;
                q += nOffset;
            }
        }

        b.UnlockBits(bmData);
        c.UnlockBits(data2);
        return b;
    }
4

1 に答える 1

0

画像を比較するだけでよいため、読み取りモードでのみ開くことをお勧めします。

BitmapData data2 =   c.LockBits(new System.Drawing.Rectangle(0, 
                                               0, 
                                               c.Width,
                                               c.Height),
                    ImageLockMode.ReadOnly,
                    System.Drawing.Imaging.PixelFormat.Format24bppRgb);
于 2013-12-31T06:16:07.023 に答える