private RGBdata ProcessBitmap(Bitmap a) { BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); IntPtr ptr = bmpData.Scan0; RGBdata data = new RGBdata(); unsafe { byte *p = (byte *)(void *)ptr; int offset = bmpData.Stride - a.Width * 3; int width = a.Width * 3; for (int y = 0; y < a.Height; ++y) { for (int x = 0; x < width; ++x) { data.r += p[0]; //gets red values data.g += p[1]; //gets green values data.b += p[2]; //gets blue values ++p; } p += offset; } } a.UnlockBits(bmpData); return(data); }
public double GetSimilarity(Bitmap a, Bitmap b) { RGBdata dataA = ProcessBitmap(a); RGBdata dataB = ProcessBitmap(b); double result = 0; int averageA = 0; int averageB = 0; int maxA = 0; int maxB = 0; maxA = ((a.Width * 3) * a.Height); maxB = ((b.Width * 3) * b.Height); switch (dataA.GetLargest()) //Find dominant color to compare { case 1: { averageA = Math.Abs(dataA.r / maxA); averageB = Math.Abs(dataB.r / maxB); result = (averageA - averageB) / 2; break; } case 2: { averageA = Math.Abs(dataA.g / maxA); averageB = Math.Abs(dataB.g / maxB); result = (averageA - averageB) / 2; break; } case 3: { averageA = Math.Abs(dataA.b / maxA); averageB = Math.Abs(dataB.b / maxB); result = (averageA - averageB) / 2; break; } } result = Math.Abs((result + 100) / 100); if (result > 1.0) { result -= 1.0; } return(result); }
private RGBdata ProcessBitmap(Bitmap a) { BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); IntPtr ptr = bmpData.Scan0; RGBdata data = new RGBdata(); unsafe { byte* p = (byte*)(void*)ptr; int offset = bmpData.Stride - a.Width * 3; int width = a.Width * 3; for (int y = 0; y < a.Height; ++y) { for (int x = 0; x < width; ++x) { data.r += p[0]; //gets red values data.g += p[1]; //gets green values data.b += p[2]; //gets blue values ++p; } p += offset; } } a.UnlockBits(bmpData); return data; }