2010-08-08 80 views
4

我目前正在实现一个方法来接受两个位图对象。我们可以假设所说的对象具有相同的尺寸等。该方法的返回是一个像素变化列表(它存储在一个自制对象中)。这是以迭代的方式开发的,所以当前的实现是基本的实现......只是简单地处理每个像素并将其与其对应物进行比较。这种产生变化的方法比可接受的(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)); 
      } 
     } 
    } 

,你从代码有问题之类的概念是采取截图,并生成从以前拍摄的屏幕截图像​​素更改的列表中扣除。

回答

3

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

它比GetPixel/SetPixel快几个数量级。

编辑:
检查this link一段代码(尽管在VB,但你应该得到的漂移),几乎你想要做什么。它只是检查两个位图是否相等,并返回true或false。您可以更改函数,以便每个像素检查在必要时添加到您的_pixelChanges列表中,并返回此列表而不是布尔值。

另外,如果你交换迭代器循环,它可能会更快。即让内部循环在X上迭代,并且外部循环在Y上迭代。

+0

谢谢,有关如何在Lockbits下实现上述内容的任何建议,我们将不胜感激......但现在,我的大脑已经坏掉了,并使用我自己的大脑! – Nick 2010-08-08 11:02:01

+0

谢谢安迪我现在已经很好地实施了。 – Nick 2010-08-08 18:36:20

+0

没有probs。只是为了好奇,它快多少? – Andy 2010-08-08 18:38:55

3

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