我目前正在实现一种接受两个位图对象的方法。我们可以假设所述对象具有相同的尺寸等。该方法的返回是像素变化的列表(这存储在自制对象中)。这是以迭代方式开发的,因此当前的实现是一个基本的实现......只需处理每个像素并将其与对应的像素进行比较。这种生成更改的方法比可接受的要慢(500 毫秒左右),因此我正在寻找更快的过程。
我想到的想法是将图像分解为条带并在新线程上运行每个比较,或者首先将屏幕区域作为对象进行比较,然后仅根据需要进行详细检查。
当前代码供您理解...
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));
}
}
}
正如您将从代码中推断出的,相关类的概念是获取屏幕截图并根据之前获取的屏幕截图生成像素更改列表。
你绝对应该看看Lockbits https://web.archive.org/web/20141229164101/http://bobpowell.net/lockingbits.aspx操作位图数据的方法。
它比 GetPixel/SetPixel 快几个数量级。
EDIT:
Check 这个链接 https://social.msdn.microsoft.com/Forums/en-US/bd0eec9e-f811-4fab-a245-08b2882d005c/how-to-compare-grapical-bitmap-data?forum=vbgeneral对于一些代码(尽管是在 VB 中,但你应该明白)几乎可以满足你的要求。它只是检查两个位图是否相等并返回 true 或 false。您可以更改该函数,以便每个像素检查都会在必要时添加到您的 _pixelChanges 列表中,并返回此列表而不是布尔值。
此外,如果交换迭代器循环,速度可能会更快。即让内循环迭代 X,外循环迭代 Y。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)