protected override unsafe void ProcessFilter(UnmanagedImage sourceData, UnmanagedImage destinationData)
{
int pixelSize = Image.GetPixelFormatSize(sourceData.PixelFormat) / 8;
// get width and height
int width = sourceData.Width;
int height = sourceData.Height;
int srcOffset = sourceData.Stride - width * pixelSize;
int dstOffset = destinationData.Stride - width;
RGB rgb = new RGB();
YCbCr ycbcr = new YCbCr();
// do the job
byte* src = (byte*)sourceData.ImageData.ToPointer();
byte* dst = (byte*)destinationData.ImageData.ToPointer();
byte v = 0;
// for each row
for (int y = 0; y < height; y++)
{
// for each pixel
for (int x = 0; x < width; x++, src += pixelSize, dst++)
{
rgb.Red = src[RGB.R];
rgb.Green = src[RGB.G];
rgb.Blue = src[RGB.B];
// convert to YCbCr
Accord.Imaging.YCbCr.FromRGB(rgb, ycbcr);
switch (channel)
{
case YCbCr.YIndex:
v = (byte)(ycbcr.Y * 255);
break;
case YCbCr.CbIndex:
v = (byte)((ycbcr.Cb + 0.5) * 255);
break;
case YCbCr.CrIndex:
v = (byte)((ycbcr.Cr + 0.5) * 255);
break;
}
*dst = v;
}
src += srcOffset;
dst += dstOffset;
}
}
}