我正在尝试有效地计算两个位图之间的差异,并将任何匹配的像素设置为黑色。我试过这个:
for (int x = 0; x < 1280; x++)
{
for (int y = 0; y < 720; y++)
{
if (bitmap.GetPixel(x, y) == bitmap2.GetPixel(x, y))
{
bitmap2.SetPixel(x, y, Color.Black);
}
}
}
但事实证明GetPixel和SetPixel很慢,所以这并不能很好地运作。有人知道另一种(更快)的方法吗?
答案 0 :(得分:4)
此方法使用不安全的代码,假设位图大小相同,每个像素为4个字节。
Rectangle bounds = new Rectangle(0,0,bitmapA.Width,bitmapA.Height);
var bmpDataA = bitmapA.LockBits(bounds, ImageLockMode.ReadWrite, bitmapA.PixelFormat);
var bmpDataB = bitmapB.LockBits(bounds, ImageLockMode.ReadWrite, bitmapB.PixelFormat);
const int height = 720;
int npixels = height * bmpDataA.Stride/4;
unsafe {
int * pPixelsA = (int*)bmpDataA.Scan0.ToPointer();
int * pPixelsB = (int*)bmpDataB.Scan0.ToPointer();
for ( int i = 0; i < npixels; ++i ) {
if (pPixelsA[i] != pPixelsB[i]) {
pPixelsB[i] = Color.Black.ToArgb();
}
}
}
bitmapA.UnlockBits(bmpDataA);
bitmapB.UnlockBits(bmpDataB);
对于安全方法,请将像素数据复制到数组缓冲区,以便使用InteropServices.Marshal.Copy
方法进行处理。
答案 1 :(得分:2)
原始位图数据和LockBitmap。
http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp
忘记如果关闭速度增加调试模式。 abaut 10x但是lockbit仍然更快。
答案 2 :(得分:1)
几乎可以肯定这已经得到了回答。你应该使用:
同样访问宽度和高度(或具有相同信息的其他属性)也很慢,因此如果要在循环中使用它们(而不是在示例中使用720和1280),请将它们复制到局部变量。