以像素为单位快速比较两个Bitmap对象

时间:2010-08-08 10:43:14

标签: c# bitmap

我目前正在实现一个接受两个位图对象的方法。我们可以假设所述对象具有相同的尺寸等。该方法的返回是像素变化的列表(这存储在自制对象中)。这是以迭代的方式开发的,因此当前的实现是一个基本的...只需通过每个像素并将其与其对应物进行比较。这种产生变化的方法比可接受的速度慢(500ms左右),因此我正在寻找更快的过程。

我想到的想法是将图像分解为条带并在新线程上运行每个比较,或者首先将屏幕区域作为对象进行比较,然后根据需要进行详细检查。

您理解的当前代码......

   for (int x = 0; x < screenShotBMP.Width; x++)
   {
       for (int y = 0; y < screenShotBMP.Height; y++)
       {
           if (screenShotBMP.GetPixel(x, y) != _PreviousFrame.GetPixel(x, y))
           { 
             _pixelChanges.Add(new PixelChangeJob(screenShotBMP.GetPixel(x,y), x, y));
           }
       }
   }

正如您将从代码中扣除的那样,该类的概念是截取屏幕截图并从之前拍摄的屏幕截图中生成像素更改列表。

2 个答案:

答案 0 :(得分:3)

您一定要查看操作位图数据的Lockbits方法。

比GetPixel / SetPixel快几个数量级。

修改
检查this link是否有一些代码(虽然在VB中,但你应该得到漂移)几乎可以达到你想要的效果。它只是检查两个位图是否相等并返回true或false。您可以更改函数,以便在必要时将每个像素检查添加到_pixelChanges列表中,并返回此列表而不是布尔值。

此外,如果您更换迭代器循环,它可能会更快。即让内循环遍历X,外循环迭代Y.

答案 1 :(得分:3)

将BitBlt与选项XOR ....一起使用。应该快得多。