计算两个位图之间差异的快速方法

本文关键字:方法 之间 位图 两个 计算 | 更新日期: 2023-09-27 17:50:54

可能重复:
比较两个大小相等的位图以确定它们是否相同的最快方法是什么?

我正在努力有效地计算两个位图之间的差异,并将任何匹配的像素设置为黑色。我试过这个:

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速度较慢,所以这还不够好。有人知道另一种(更快(的方法吗?

计算两个位图之间差异的快速方法

此方法使用不安全的代码,假设位图大小相同,每个像素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方法进行处理。

原始位图数据和锁定位图。

http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp

问题(缺少示例(。比较两个大小相等的位图以确定它们是否相同的最快方法是什么?

忘记如果你关闭调试模式的速度增加。abaut是10倍,但lockbit仍然更快。

几乎可以肯定,这个问题以前已经得到了回答。您应该使用:

位图。LockBits

此外,访问Width和Height(或具有相同信息的其他属性(也很慢,因此如果您想在循环中使用它们(而不是示例中的720和1280(,请将它们复制到本地变量中