protected unsafe override void ProcessFilter(UnmanagedImage image)
{
int width = image.Width;
int height = image.Height;
int pixelSize = System.Drawing.Image.GetPixelFormatSize(image.PixelFormat) / 8;
int stride = image.Stride;
int offset = stride - image.Width * pixelSize;
// Get image means
double Rmean = 0, Gmean = 0, Bmean = 0;
byte* src = (byte*)image.ImageData.ToPointer();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++, src += pixelSize)
{
Rmean += src[RGB.R];
Gmean += src[RGB.G];
Bmean += src[RGB.B];
}
src += offset;
}
double size = width * height;
Rmean /= size;
Gmean /= size;
Bmean /= size;
double mean = (Rmean + Gmean + Bmean) / 3.0;
double kr = mean / Rmean;
double kg = mean / Gmean;
double kb = mean / Bmean;
src = (byte*)image.ImageData.ToPointer();
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++, src += pixelSize)
{
double r = kr * src[RGB.R];
double g = kg * src[RGB.G];
double b = kb * src[RGB.B];
src[RGB.R] = (byte)(r > 255 ? 255 : r);
src[RGB.G] = (byte)(g > 255 ? 255 : g);
src[RGB.B] = (byte)(b > 255 ? 255 : b);
}
src += offset;
}
}
}