110,545
社区成员
发帖
与我相关
我的任务
分享
private void compareResult(Bitmap b1, Bitmap b2)
{
if (b1.Width != b2.Width || b1.Height != b2.Height)
{
return;
}
Color c1;
Color c2;
int r, g, b;
Bitmap bResult = new Bitmap(b1.Width, b1.Height);
for (int x = 0; x < b1.Width; x++)
{
for (int y = 0; y < b1.Height; y++)
{
c1 = b1.GetPixel(x, y);
c2 = b2.GetPixel(x, y);
if ((c1.R ^ c2.R) != 0 || (c1.G ^ c2.G) != 0 || (c1.B ^ c2.B) != 0)
{
bResult.SetPixel(x, y, Color.Red);
}
else
{
r = Convert.ToInt32(c1.R) - 50 >= 0 ? Convert.ToInt32(c1.R) - 50 : 0;
g = Convert.ToInt32(c1.G) - 50 >= 0 ? Convert.ToInt32(c1.G) - 50 : 0;
b = Convert.ToInt32(c1.B) - 50 >= 0 ? Convert.ToInt32(c1.B) - 50 : 0;
bResult.SetPixel(x, y, Color.FromArgb(r, g, b));
}
}
}
PictureBox1.Image = (Image)bResult;
}
private Bitmap compareResultFast(Bitmap b1, Bitmap b2)
{
if (b1.Width != b2.Width || b1.Height != b2.Height)
return null;
var fmt = PixelFormat.Format32bppArgb;
var result = new Bitmap(b1);
var rect = new Rectangle(0, 0, b1.Width, b1.Height);
BitmapData d1 = null, d2 = null;
try
{
d1 = result.LockBits(rect, ImageLockMode.ReadWrite, fmt);
d2 = b2.LockBits(rect, ImageLockMode.ReadOnly, fmt);
UnsafeBitmapCompare(d1.Scan0, d2.Scan0, d1.Height * d1.Stride);
}
finally
{
if (d1 != null)
result.UnlockBits(d1);
if (d2 != null)
b2.UnlockBits(d2);
}
return result;
}
private unsafe void UnsafeBitmapCompare(IntPtr dest, IntPtr src, int length)
{
var dp = (uint*)dest; var sp = (uint*)src;
var end = dp + length / 4;
while (dp < end)
{
if (*dp == *sp || ((*dp >> 24 == 0) && (*sp >> 24 == 0)))
{
var r = (int)((*dp >> 16) & 0xFF) - 50;
var g = (int)((*dp >> 8) & 0xFF) - 50;
var b = (int)(*dp & 0xFF) - 50;
r = r > 0 ? r : 0; g = g > 0 ? g : 0; b = b > 0 ? b : 0;
*dp = (*dp & 0xFF000000) | (uint)(r << 16) | (uint)(g << 8) | (uint)b;
}
else
*dp = 0xFFFF0000;
dp++; sp++;
}
}