我嘗試比較兩個圖像之間的100x100像素的小塊。 我用LockBits
操作之後本地memcmp
PInvoke的電話,這是我的代碼:c#位圖塊比較
private void CompareBlock(Bitmap bmp1,Bitmap bmp2)
{
Rectangle lockRect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
BitmapData bmData = bmp1.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
BitmapData bmData2 = bmp2.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr scan0 = bmData.Scan0;
IntPtr scan02 = bmData2.Scan0;
int BytesPerPixel = 4;//images are 32bpprgb
Size BlockSize = new Size(100,100);
if (memcmp(scan0, scan02, (BlockSize.Width * BlockSize.Height * BytesPerPixel))==0)//need to compare only the the first 100x100 pixels block.
{
Console.WriteLine("Equal");
//do somthing with the block;
}
}
我不知道我做錯了什麼,但這個程序實際上進入狀態,並打印"Equal"
這是不正確(根據給定的圖像)。
我將不勝感激任何幫助。
謝謝。
//代碼更新的測試
private void CompareBlock(Bitmap bmp1,Bitmap bmp2)
{
Rectangle lockRect = new Rectangle(0, 0, bmp1.Width, bmp1.Height);
BitmapData bmData = bmp1.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
BitmapData bmData2 = bmp2.LockBits(lockRect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr scan0 = bmData.Scan0;
IntPtr scan02 = bmData2.Scan0;
int BytesPerPixel = 4;
Size BlockSize = new Size(100,100);
for (int y = 0; y < BlockSize.Height; y++)
{
if (memcmp(scan0, scan02, BlockSize.Width * BytesPerPixel) == 0)//need to compare only the the first 100x100 pixels block.
{
scan0 = IntPtr.Add(scan0, stride);//not sure about that advancement
scan02 = IntPtr.Add(scan02, stride2);//not sure about that advancement
//do somthing with the block;
}
else
break;
}
}
幾天前,我推薦[此項目](http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp)給需要鎖定位圖的人。它可能有助於解決您的問題。 –