绘制两个位图差异的结果位图时出现问题

时间:2018-07-16 08:28:51

标签: image image-processing image-compression

我想将一个位图与另一个位图(参考位图)进行比较,并在最终的位图中绘制出所有差异。 使用下面的代码,我只能绘制差异区域,而不能绘制确切的颜色。

这是我的代码

Bitmap ResultantBitMap = new Bitmap(bitMap1.Height, bitMap2.Height);

        BitmapData bitMap1Data = bitMap1.LockBits(new Rectangle(0, 0, bitMap1.Width, bitMap1.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        BitmapData bitMap2Data = bitMap2.LockBits(new Rectangle(0, 0, bitMap2.Width, bitMap2.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        BitmapData bitMapResultantData = ResultantBitMap.LockBits(new Rectangle(0, 0, ResultantBitMap.Width, ResultantBitMap.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        IntPtr scan0 = bitMap1Data.Scan0;
        IntPtr scan02 = bitMap2Data.Scan0;
        IntPtr scan0ResImg1 = bitMapResultantData.Scan0;


        int bitMap1Stride = bitMap1Data.Stride;
        int bitMap2Stride = bitMap2Data.Stride;
        int ResultantImageStride = bitMapResultantData.Stride;

        for (int y = 0; y < bitMap1.Height; y++)
        {
            //define the pointers inside the first loop for parallelizing
            byte* p = (byte*)scan0.ToPointer();
            p += y * bitMap1Stride;

            byte* p2 = (byte*)scan02.ToPointer();
            p2 += y * bitMap2Stride;

            byte* pResImg1 = (byte*)scan0ResImg1.ToPointer();
            pResImg1 += y * ResultantImageStride;

            for (int x = 0; x < bitMap1.Width; x++)
            {
                //always get the complete pixel when differences are found                   
                if (Math.Abs(p[0] - p2[0]) >= 20 || Math.Abs(p[1] - p2[1]) >= 20 || Math.Abs(p[2] - p2[2]) >= 20)
                {
                    pResImg1[0] = p2[0];// B
                    pResImg1[1] = p2[1];//R
                    pResImg1[2] = p2[2];//G
                    pResImg1[3] = p2[3];//A    (Opacity)
                }

                p += 4;
                p2 += 4;
                pResImg1 += 4;
            }
        }

        bitMap1.UnlockBits(bitMap1Data);
        bitMap2.UnlockBits(bitMap2Data);
        ResultantBitMap.UnlockBits(bitMapResultantData);

        ResultantBitMap.Save(@"c:\\abcd\abcd.jpeg");

我想要的是具有参考图像准确颜色的差异图像。

enter image description here

1 个答案:

答案 0 :(得分:0)

在不知道所有这些库调用和“ + = 4”是什么的情况下很难说出是怎么回事,但是,您确定p和p2对应于图表的第一张和第二张图片吗?

此外,您的“ Format32bppArgb”格式建议[0]对应于alpha,而不是红色。也许这也有问题。