Die obigen Lösungen funktionierten nicht für mich, wenn ich zwei Bilder hatte, die sich nur in der Farbtiefe unterschieden - eine war 32bpp und die andere war 8bpp. Die Lösung, die ich ankam, benutzte LockBits, um alle Bilder in 32bpp zu konvertieren, Marshal.Copy(), um die Daten in ein Array zu bekommen und dann einfach die Arrays zu vergleichen.
/// <summary>
/// Compares two images for pixel equality
/// </summary>
/// <param name="fname1">first image file</param>
/// <param name="fname2">second image file</param>
/// <returns>true if images are identical</returns>
public static string PageCompare(string fname1, string fname2) {
try {
using (Bitmap bmp1 = new Bitmap(fname1))
using (Bitmap bmp2 = new Bitmap(fname2)) {
if (bmp1.Height != bmp2.Height || bmp1.Width != bmp2.Width)
return false;
// Convert image to int32 array with each int being one pixel
int cnt = bmp1.Width * bmp1.Height * 4/4;
BitmapData bmData1 = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
BitmapData bmData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Int32[] rgbValues1 = new Int32[cnt];
Int32[] rgbValues2 = new Int32[cnt];
// Copy the ARGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(bmData1.Scan0, rgbValues1, 0, cnt);
System.Runtime.InteropServices.Marshal.Copy(bmData2.Scan0, rgbValues2, 0, cnt);
bmp1.UnlockBits(bmData1);
bmp2.UnlockBits(bmData2);
for (int i = 0; i < cnt; ++i) {
if (rgbValues1[i] != rgbValues2[i])
return false;
}
}
}
catch (Exception ex) {
return false;
}
// We made it this far so the images must match
return true;
}
Welche Art von Vergleich machen Sie? Möchten Sie prüfen, ob es sich um identische Kopien handelt? oder möchten Sie überprüfen, ob es sich um ähnliche Bilder handelt? Die erste ist einfach zu machen und die zweite ist ein bisschen schwieriger. – Niyaz