private unsafe void ProcessImage(UnmanagedImage image, byte* mask, int maskLineSize)
{
// get image dimension
int width = image.Width;
int height = image.Height;
pixels = pixelsWithoutBlack = 0;
red = green = blue = gray = null;
redWithoutBlack = greenWithoutBlack = blueWithoutBlack = grayWithoutBlack = null;
int maskOffset = maskLineSize - width;
// check pixel format
if (image.PixelFormat == PixelFormat.Format8bppIndexed)
{
// alloc arrays
int[] g = new int[256];
int[] gwb = new int[256];
byte value;
int offset = image.Stride - width;
// do the job
byte* p = (byte*)image.ImageData.ToPointer();
if (mask == null)
{
// for each pixel
for (int y = 0; y < height; y++)
{
// for each pixel
for (int x = 0; x < width; x++, p++)
{
// get pixel value
value = *p;
g[value]++;
pixels++;
if (value != 0)
{
gwb[value]++;
pixelsWithoutBlack++;
}
}
p += offset;
}
}
else
{
// for each pixel
for (int y = 0; y < height; y++)
{
// for each pixel
for (int x = 0; x < width; x++, p++, mask++)
{
if (*mask == 0)
continue;
// get pixel value
value = *p;
g[value]++;
pixels++;
if (value != 0)
{
gwb[value]++;
pixelsWithoutBlack++;
}
}
p += offset;
mask += maskOffset;
}
}
// create historgram for gray level
gray = new Histogram(g);
grayWithoutBlack = new Histogram(gwb);
}
else
{
// alloc arrays
int[] r = new int[256];
int[] g = new int[256];
int[] b = new int[256];
int[] rwb = new int[256];
int[] gwb = new int[256];
int[] bwb = new int[256];
byte rValue, gValue, bValue;
int pixelSize = (image.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4;
int offset = image.Stride - width * pixelSize;
// do the job
byte* p = (byte*)image.ImageData.ToPointer();
if (mask == null)
{
// for each line
for (int y = 0; y < height; y++)
{
// for each pixel
for (int x = 0; x < width; x++, p += pixelSize)
{
// get pixel values
rValue = p[RGB.R];
gValue = p[RGB.G];
bValue = p[RGB.B];
r[rValue]++;
g[gValue]++;
b[bValue]++;
pixels++;
if ((rValue != 0) || (gValue != 0) || (bValue != 0))
{
rwb[rValue]++;
gwb[gValue]++;
bwb[bValue]++;
pixelsWithoutBlack++;
}
}
p += offset;
}
}
else
{
// for each line
for (int y = 0; y < height; y++)
{
// for each pixel
for (int x = 0; x < width; x++, p += pixelSize, mask++)
{
if (*mask == 0)
continue;
// get pixel values
rValue = p[RGB.R];
gValue = p[RGB.G];
bValue = p[RGB.B];
r[rValue]++;
g[gValue]++;
b[bValue]++;
pixels++;
if ((rValue != 0) || (gValue != 0) || (bValue != 0))
{
rwb[rValue]++;
gwb[gValue]++;
bwb[bValue]++;
pixelsWithoutBlack++;
}
}
p += offset;
mask += maskOffset;
}
}
// create histograms
red = new Histogram(r);
green = new Histogram(g);
blue = new Histogram(b);
redWithoutBlack = new Histogram(rwb);
greenWithoutBlack = new Histogram(gwb);
blueWithoutBlack = new Histogram(bwb);
}
}