in Sources/Imaging/Microsoft.Psi.Imaging/ImageExtensions.cs [2071:2233]
public static void Threshold(this Image srcImage, Image destImage, int threshold, int maxvalue, Threshold type)
{
if (srcImage.PixelFormat != destImage.PixelFormat)
{
throw new ArgumentOutOfRangeException("destImage.PixelFormat", "destination image pixel format doesn't match source image pixel format");
}
unsafe
{
int bytesPerPixel = srcImage.PixelFormat.GetBytesPerPixel();
byte* srcRow = (byte*)srcImage.ImageData.ToPointer();
byte* dstRow = (byte*)destImage.ImageData.ToPointer();
for (int i = 0; i < srcImage.Height; i++)
{
byte* srcCol = srcRow;
byte* dstCol = dstRow;
for (int j = 0; j < srcImage.Width; j++)
{
int r = 0, g = 0, b = 0, a = 255;
switch (srcImage.PixelFormat)
{
case PixelFormat.BGRA_32bpp:
b = srcCol[0];
g = srcCol[1];
r = srcCol[2];
a = srcCol[3];
break;
case PixelFormat.BGRX_32bpp:
b = srcCol[0];
g = srcCol[1];
r = srcCol[2];
break;
case PixelFormat.BGR_24bpp:
b = srcCol[0];
g = srcCol[1];
r = srcCol[2];
break;
case PixelFormat.Gray_16bpp:
r = g = b = a = ((ushort*)srcCol)[0];
break;
case PixelFormat.Gray_8bpp:
r = g = b = a = srcCol[0];
break;
case PixelFormat.RGB_24bpp:
r = srcCol[0];
g = srcCol[1];
b = srcCol[2];
break;
case PixelFormat.RGBA_64bpp:
r = ((ushort*)srcCol)[0];
g = ((ushort*)srcCol)[1];
b = ((ushort*)srcCol)[2];
a = ((ushort*)srcCol)[3];
break;
case PixelFormat.Undefined:
default:
throw new ArgumentException(Image.ExceptionDescriptionUnexpectedPixelFormat);
}
switch (type)
{
case Imaging.Threshold.Binary:
r = (r > threshold) ? maxvalue : 0;
g = (g > threshold) ? maxvalue : 0;
b = (b > threshold) ? maxvalue : 0;
a = (a > threshold) ? maxvalue : 0;
break;
case Imaging.Threshold.BinaryInv:
r = (r > threshold) ? 0 : maxvalue;
g = (g > threshold) ? 0 : maxvalue;
b = (b > threshold) ? 0 : maxvalue;
a = (a > threshold) ? 0 : maxvalue;
break;
case Imaging.Threshold.Truncate:
r = (r > threshold) ? threshold : r;
g = (g > threshold) ? threshold : g;
b = (b > threshold) ? threshold : b;
a = (a > threshold) ? threshold : a;
break;
case Imaging.Threshold.ToZero:
r = (r > threshold) ? r : 0;
g = (g > threshold) ? g : 0;
b = (b > threshold) ? b : 0;
a = (a > threshold) ? a : 0;
break;
case Imaging.Threshold.ToZeroInv:
r = (r > threshold) ? 0 : r;
g = (g > threshold) ? 0 : g;
b = (b > threshold) ? 0 : b;
a = (a > threshold) ? 0 : a;
break;
default:
throw new ArgumentException(Image.ExceptionDescriptionUnexpectedPixelFormat);
}
switch (destImage.PixelFormat)
{
case PixelFormat.BGRA_32bpp:
dstCol[0] = (byte)b;
dstCol[1] = (byte)g;
dstCol[2] = (byte)r;
dstCol[3] = (byte)a;
break;
case PixelFormat.BGRX_32bpp:
dstCol[0] = (byte)b;
dstCol[1] = (byte)g;
dstCol[2] = (byte)r;
dstCol[3] = (byte)a;
break;
case PixelFormat.BGR_24bpp:
dstCol[0] = (byte)b;
dstCol[1] = (byte)g;
dstCol[2] = (byte)r;
break;
case PixelFormat.Gray_16bpp:
((ushort*)dstCol)[0] = (ushort)r;
break;
case PixelFormat.Gray_8bpp:
dstCol[0] = (byte)r;
break;
case PixelFormat.RGB_24bpp:
dstCol[0] = (byte)r;
dstCol[1] = (byte)g;
dstCol[2] = (byte)b;
break;
case PixelFormat.RGBA_64bpp:
((ushort*)dstCol)[0] = (ushort)r;
((ushort*)dstCol)[1] = (ushort)g;
((ushort*)dstCol)[2] = (ushort)b;
((ushort*)dstCol)[3] = (ushort)a;
break;
default:
throw new ArgumentException(Image.ExceptionDescriptionUnexpectedPixelFormat);
}
srcCol += bytesPerPixel;
dstCol += bytesPerPixel;
}
srcRow += srcImage.Stride;
dstRow += destImage.Stride;
}
}
}