public static void Threshold()

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;
                }
            }
        }