2

我正在编写一个函数来获取 Visual Studio 2010 中两个位图图像之间的差异。我有一个将两个位图图像作为参数的函数,我使用解锁位来获取每个像素的数据,两个图像的分辨率和尺寸都相同。

当我只对一个图像使用解锁位时,它工作得很好,但是当我在同一个函数中同时使用它时,它会给出一个异常

位图区域已锁定

代码

    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 回答