C# I';我试图用锁定位比较两幅图像,但它没有';不行-为什么?

C# I';我试图用锁定位比较两幅图像,但它没有';不行-为什么?,c#,winforms,C#,Winforms,方法如下: public static Bitmap FastComparison(Bitmap bmp1,Bitmap bmp2) { Bitmap bmp3 = new Bitmap(512,512); PixelFormat pxf = PixelFormat.Format24bppRgb; Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);

方法如下:

public static Bitmap FastComparison(Bitmap bmp1,Bitmap bmp2)
{
            Bitmap bmp3 = new Bitmap(512,512);
            PixelFormat pxf = PixelFormat.Format24bppRgb;
            Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
            BitmapData bmpData1 = bmp1.LockBits(rect, ImageLockMode.ReadWrite, pxf);
            BitmapData bmpData2 = bmp2.LockBits(rect, ImageLockMode.ReadWrite, pxf);
            BitmapData bmpData3 = bmp3.LockBits(rect, ImageLockMode.ReadWrite, pxf);

            IntPtr ptr1 = bmpData1.Scan0;
            IntPtr ptr2 = bmpData2.Scan0;
            IntPtr ptr3 = bmpData3.Scan0;

            int numBytes = bmpData1.Stride * bmp1.Height;
            byte[] rgbValues1 = new byte[numBytes];
            Marshal.Copy(ptr1, rgbValues1, 0, numBytes);
            bmp1.UnlockBits(bmpData1);

            byte[] rgbValues2 = new byte[numBytes];
            Marshal.Copy(ptr2, rgbValues2, 0, numBytes);
            bmp2.UnlockBits(bmpData2);


            for (int counter = 0; counter < rgbValues1.Length; counter += 3)
            {
                int  dr, dg, db;
                dr = (int)rgbValues1[counter] - (int)rgbValues2[counter];
                dg = (int)rgbValues1[counter + 1] - (int)rgbValues2[counter + 1];
                db = (int)rgbValues1[counter + 2] - (int)rgbValues2[counter + 2];

                int error = dr * dr + dg * dg + db * db;
                if (error < tolerancenumeric)
                {
                    rgbValues1[counter] = 0;
                    rgbValues1[counter + 1] = 0;
                    rgbValues1[counter + 2] = 0;
                }

            }
            Marshal.Copy(rgbValues1, 0, ptr3, numBytes);
            return bmp1;
}
我想要的是改变公差,这样最终我会得到一个结果,即图像变量bmp1将只在黑色背景上有云

我做错了什么

这是我现在改变的新方法。现在我得到的只是黑色图像:

public static Bitmap FastComparison(Bitmap bmp1,Bitmap bmp2)
        {
            Bitmap bmp3 = new Bitmap(512,512);
            PixelFormat pxf = PixelFormat.Format24bppRgb;
            Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
            BitmapData bmpData1 = bmp1.LockBits(rect, ImageLockMode.ReadWrite, pxf);
            BitmapData bmpData2 = bmp2.LockBits(rect, ImageLockMode.ReadWrite, pxf);
            BitmapData bmpData3 = bmp3.LockBits(rect, ImageLockMode.ReadWrite, pxf);

            IntPtr ptr1 = bmpData1.Scan0;
            IntPtr ptr2 = bmpData2.Scan0;
            IntPtr ptr3 = bmpData3.Scan0;

            int numBytes = bmpData1.Stride * bmp1.Height;
            byte[] rgbValues1 = new byte[numBytes];
            Marshal.Copy(ptr1, rgbValues1, 0, numBytes);
            bmp1.UnlockBits(bmpData1);

            byte[] rgbValues2 = new byte[numBytes];
            Marshal.Copy(ptr2, rgbValues2, 0, numBytes);
            bmp2.UnlockBits(bmpData2);


            for (int counter = 0; counter < rgbValues1.Length; counter += 3)
            {
                int  dr, dg, db;
                dr = (int)rgbValues1[counter] - (int)rgbValues2[counter];
                dg = (int)rgbValues1[counter + 1] - (int)rgbValues2[counter + 1];
                db = (int)rgbValues1[counter + 2] - (int)rgbValues2[counter + 2];

                int error = tolerancenumeric * tolerancenumeric + tolerancenumeric + tolerancenumeric + tolerancenumeric * tolerancenumeric;//dr * dr + dg * dg + db * db;
                if (error < tolerancenumeric)
                {

                }
                else
                {
                    rgbValues1[counter] = 0;
                    rgbValues1[counter + 1] = 0;
                    rgbValues1[counter + 2] = 0;
                }

            }
            Marshal.Copy(rgbValues1, 0, ptr3, numBytes);
            bmp3.UnlockBits(bmpData3);
            return bmp3;
        }
公共静态位图快速比较(位图bmp1、位图bmp2)
{
位图bmp3=新位图(512512);
PixelFormat pxf=PixelFormat.Format24bppRgb;
矩形rect=新矩形(0,0,bmp1.宽度,bmp1.高度);
BitmapData bmpData1=bmp1.LockBits(rect,ImageLockMode.ReadWrite,pxf);
BitmapData bmpData2=bmp2.LockBits(rect,ImageLockMode.ReadWrite,pxf);
BitmapData bmpData3=bmp3.LockBits(rect,ImageLockMode.ReadWrite,pxf);
IntPtr ptr1=bmpData1.Scan0;
IntPtr ptr2=bmpData2.Scan0;
IntPtr ptr3=bmpData3.Scan0;
int numBytes=bmpData1.步幅*bmp1.高度;
字节[]rgbValues1=新字节[numBytes];
封送处理副本(ptr1,rgbValues1,0,numBytes);
bmp1.解锁位(bmpData1);
字节[]rgbValues2=新字节[numBytes];
封送处理副本(ptr2,rgbValues2,0,numBytes);
bmp2.解锁位(bmpData2);
对于(int计数器=0;计数器
似乎没有为超出公差的像素设置任何像素值。在其他情况下,将其设置为黑色。黑色实际上是默认值,因此您只需要设置“错误”像素

另外,您应该返回bmp3(顺便说一句,它需要解锁),而不是bmp1


最后,bmp3的大小应为bmp1或bmp2(需要相同)。

“不起作用”不是一个很好的描述。。。嗯,描述。告诉我们你期望什么,告诉我们你收到了什么。出了什么问题?如果差异超出公差,将设置什么像素值?这里有一些非常明显的错误。最糟糕的是当结果存储在bmp3中时返回bmp1,而不是解锁bmp3。我希望bmp1是一个雷达图像,内部有云,当使用表1中的numericupdown更改公差时,我将看到越来越多的云。Jefferson我更改了方法(用更改更新了我的问题),但我猜在IF中将像素/颜色设置为rgbValues1是错误的。你能告诉我如何修复它吗?bmp3是512512,它的大小是bmp1和BMP2,关于
rgbValues1[计数器]=dr;rgbValues1[计数器+1]=dg;rgbValues1[计数器+2]=db?或者从bmp1复制值(在覆盖rgbvalue1之前)。为什么rgbValues1[counter]=dr;不起作用?计数器和dr都是int类型,但我得到的错误是它不能将字节转换为int。可能是另一种方法:使用
rgbValues1[counter]=(byte)dr;
a.s.o。
public static Bitmap FastComparison(Bitmap bmp1,Bitmap bmp2)
        {
            Bitmap bmp3 = new Bitmap(512,512);
            PixelFormat pxf = PixelFormat.Format24bppRgb;
            Rectangle rect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
            BitmapData bmpData1 = bmp1.LockBits(rect, ImageLockMode.ReadWrite, pxf);
            BitmapData bmpData2 = bmp2.LockBits(rect, ImageLockMode.ReadWrite, pxf);
            BitmapData bmpData3 = bmp3.LockBits(rect, ImageLockMode.ReadWrite, pxf);

            IntPtr ptr1 = bmpData1.Scan0;
            IntPtr ptr2 = bmpData2.Scan0;
            IntPtr ptr3 = bmpData3.Scan0;

            int numBytes = bmpData1.Stride * bmp1.Height;
            byte[] rgbValues1 = new byte[numBytes];
            Marshal.Copy(ptr1, rgbValues1, 0, numBytes);
            bmp1.UnlockBits(bmpData1);

            byte[] rgbValues2 = new byte[numBytes];
            Marshal.Copy(ptr2, rgbValues2, 0, numBytes);
            bmp2.UnlockBits(bmpData2);


            for (int counter = 0; counter < rgbValues1.Length; counter += 3)
            {
                int  dr, dg, db;
                dr = (int)rgbValues1[counter] - (int)rgbValues2[counter];
                dg = (int)rgbValues1[counter + 1] - (int)rgbValues2[counter + 1];
                db = (int)rgbValues1[counter + 2] - (int)rgbValues2[counter + 2];

                int error = tolerancenumeric * tolerancenumeric + tolerancenumeric + tolerancenumeric + tolerancenumeric * tolerancenumeric;//dr * dr + dg * dg + db * db;
                if (error < tolerancenumeric)
                {

                }
                else
                {
                    rgbValues1[counter] = 0;
                    rgbValues1[counter + 1] = 0;
                    rgbValues1[counter + 2] = 0;
                }

            }
            Marshal.Copy(rgbValues1, 0, ptr3, numBytes);
            bmp3.UnlockBits(bmpData3);
            return bmp3;
        }