首页 > 解决方案 > 绘制两个位图差异的结果位图的问题

问题描述

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

这是我的代码

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");

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

在此处输入图像描述

标签: imageimage-processingimage-compression

解决方案


如果不知道所有这些库调用和“+= 4”是什么,很难说出发生了什么,但是,您确定 p 和 p2 对应于图表的第一张和第二张图像吗?

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


推荐阅读