【问题标题】:c# bitmap block comparisonc# 位图块比较
【发布时间】:2016-08-16 13:47:24
【问题描述】:

我尝试在 2 张图像之间比较 100x100 像素的小块。 我在LockBits 操作之后使用本机memcmp pinvoke 调用,这是我的代码:

    private void CompareBlock(Bitmap bmp1,Bitmap bmp2)
    {
        Rectangle lockRect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
        BitmapData bmData = bmp1.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
        BitmapData bmData2 = bmp2.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
        IntPtr scan0 = bmData.Scan0;
        IntPtr scan02 = bmData2.Scan0;
        int BytesPerPixel = 4;//images are 32bpprgb
        Size BlockSize = new Size(100,100);
        if (memcmp(scan0, scan02, (BlockSize.Width * BlockSize.Height * BytesPerPixel))==0)//need to compare only the the first 100x100 pixels block.
        {
          Console.WriteLine("Equal");
            //do somthing with the block;
        }
    }

我不确定我做错了什么,但程序实际上进入了条件,并打印了"Equal",这是不正确的(根据给定的图像)。

如果有任何帮助,我将不胜感激。

谢谢。

//代码更新测试

      private void CompareBlock(Bitmap bmp1,Bitmap bmp2)
    {
        Rectangle lockRect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
        BitmapData bmData = bmp1.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
        BitmapData bmData2 = bmp2.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
        IntPtr scan0 = bmData.Scan0;
        IntPtr scan02 = bmData2.Scan0;
        int BytesPerPixel = 4;
        Size BlockSize = new Size(100,100);

        for (int y = 0; y < BlockSize.Height; y++)
        {
            if (memcmp(scan0, scan02, BlockSize.Width * BytesPerPixel) == 0)//need to compare only the the first 100x100 pixels block.
            {
                scan0 = IntPtr.Add(scan0, stride);//not sure about that advancement
                scan02 = IntPtr.Add(scan02, stride2);//not sure about that advancement

                //do somthing with the block;
            }
            else
                break;
        }
    }

【问题讨论】:

  • 我几天前向需要锁定位图的人推荐了this project。它可能会帮助您解决问题。

标签: c# image-processing bitmap


【解决方案1】:

我不认为您的代码在做您认为的那样。

BitmapData 的 Scan0 值给出了位图中第一个像素的地址。然后遍历 X 字节 (BlockSize.Width * BlockSize.Height * BytesPerPixel) 的内存空间,即 100 x 100 x 32。

这不会给你一个 100x100 的块,而只是前几行扫描线。您需要使用 BitmapData.Stride 属性进行一些算术运算来计算扫描线中有多少像素。您只需要每条扫描线的前 100xBytesPerPixel 字节,然后前进内存指针以跳过直到下一条扫描线的开头。

【讨论】:

  • 我更新了代码..这是你的意思吗?我必须遍历每一行来比较一个块? :( 我不确定当前的代码是否可以正常工作……你能看看吗?
  • 是的,这是正确的做法。您必须迭代每一行。位图数据不是保存在二维数组中,而是保存在一系列扫描线中(位深度乘以位图宽度可能更长——这就是我们使用步幅的原因——这为我们提供了单个扫描线的准确内存占用位图的行。
  • 我必须在这里做长时间的工作...需要比较我屏幕的每个块...对于整个屏幕。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2018-07-17
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多