FromRGB() public static method

Convert from RGB to YCbCr color space (Rec 601-1 specification).
public static FromRGB ( RGB rgb ) : YCbCr
rgb RGB Source color in RGB color space.
return YCbCr
        private unsafe void ProcessImage(UnmanagedImage image)
        {
            this.CheckSourceFormat(image.PixelFormat);
            int width  = image.Width;
            int height = image.Height;

            this.pixels = this.pixelsWithoutBlack = 0;
            int[] numArray  = new int[0x100];
            int[] numArray2 = new int[0x100];
            int[] numArray3 = new int[0x100];
            int[] numArray4 = new int[0x100];
            int[] numArray5 = new int[0x100];
            int[] numArray6 = new int[0x100];
            RGB   rgb       = new RGB();
            YCbCr ycbcr     = new YCbCr();
            int   num3      = (image.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4;
            int   num4      = image.Stride - (width * num3);
            byte *numPtr    = (byte *)image.ImageData.ToPointer();

            for (int i = 0; i < height; i++)
            {
                int num6 = 0;
                while (num6 < width)
                {
                    rgb.Red   = numPtr[2];
                    rgb.Green = numPtr[1];
                    rgb.Blue  = numPtr[0];
                    YCbCr.FromRGB(rgb, ycbcr);
                    numArray[(int)(ycbcr.Y * 255.0)]++;
                    numArray2[(int)((ycbcr.Cb + 0.5) * 255.0)]++;
                    numArray3[(int)((ycbcr.Cr + 0.5) * 255.0)]++;
                    this.pixels++;
                    if (((ycbcr.Y != 0.0) || (ycbcr.Cb != 0.0)) || (ycbcr.Cr != 0.0))
                    {
                        numArray4[(int)(ycbcr.Y * 255.0)]++;
                        numArray5[(int)((ycbcr.Cb + 0.5) * 255.0)]++;
                        numArray6[(int)((ycbcr.Cr + 0.5) * 255.0)]++;
                        this.pixelsWithoutBlack++;
                    }
                    num6++;
                    numPtr += num3;
                }
                numPtr += num4;
            }
            this.yHistogram              = new ContinuousHistogram(numArray, new DoubleRange(0.0, 1.0));
            this.cbHistogram             = new ContinuousHistogram(numArray2, new DoubleRange(-0.5, 0.5));
            this.crHistogram             = new ContinuousHistogram(numArray3, new DoubleRange(-0.5, 0.5));
            this.yHistogramWithoutBlack  = new ContinuousHistogram(numArray4, new DoubleRange(0.0, 1.0));
            this.cbHistogramWithoutBlack = new ContinuousHistogram(numArray5, new DoubleRange(-0.5, 0.5));
            this.crHistogramWithoutBlack = new ContinuousHistogram(numArray6, new DoubleRange(-0.5, 0.5));
        }
Beispiel #2
0
        private unsafe void ProcessImage(UnmanagedImage image, byte *mask, int maskLineSize)
        {
            int width  = image.Width;
            int height = image.Height;

            pixels = (pixelsWithoutBlack = 0);
            int[] array  = new int[256];
            int[] array2 = new int[256];
            int[] array3 = new int[256];
            int[] array4 = new int[256];
            int[] array5 = new int[256];
            int[] array6 = new int[256];
            RGB   rGB    = new RGB();
            YCbCr yCbCr  = new YCbCr();
            int   num    = (image.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4;
            int   num2   = image.Stride - width * num;
            int   num3   = maskLineSize - width;
            byte *ptr    = (byte *)image.ImageData.ToPointer();

            if (mask == null)
            {
                for (int i = 0; i < height; i++)
                {
                    int num4 = 0;
                    while (num4 < width)
                    {
                        rGB.Red   = ptr[2];
                        rGB.Green = ptr[1];
                        rGB.Blue  = *ptr;
                        YCbCr.FromRGB(rGB, yCbCr);
                        array[(int)(yCbCr.Y * 255f)]++;
                        array2[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++;
                        array3[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++;
                        pixels++;
                        if ((double)yCbCr.Y != 0.0 || (double)yCbCr.Cb != 0.0 || (double)yCbCr.Cr != 0.0)
                        {
                            array4[(int)(yCbCr.Y * 255f)]++;
                            array5[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++;
                            array6[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++;
                            pixelsWithoutBlack++;
                        }
                        num4++;
                        ptr += num;
                    }
                    ptr += num2;
                }
            }
            else
            {
                for (int j = 0; j < height; j++)
                {
                    int num5 = 0;
                    while (num5 < width)
                    {
                        if (*mask != 0)
                        {
                            rGB.Red   = ptr[2];
                            rGB.Green = ptr[1];
                            rGB.Blue  = *ptr;
                            YCbCr.FromRGB(rGB, yCbCr);
                            array[(int)(yCbCr.Y * 255f)]++;
                            array2[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++;
                            array3[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++;
                            pixels++;
                            if ((double)yCbCr.Y != 0.0 || (double)yCbCr.Cb != 0.0 || (double)yCbCr.Cr != 0.0)
                            {
                                array4[(int)(yCbCr.Y * 255f)]++;
                                array5[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++;
                                array6[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++;
                                pixelsWithoutBlack++;
                            }
                        }
                        num5++;
                        ptr += num;
                        mask++;
                    }
                    ptr  += num2;
                    mask += num3;
                }
            }
            yHistogram              = new ContinuousHistogram(array, new Range(0f, 1f));
            cbHistogram             = new ContinuousHistogram(array2, new Range(-0.5f, 0.5f));
            crHistogram             = new ContinuousHistogram(array3, new Range(-0.5f, 0.5f));
            yHistogramWithoutBlack  = new ContinuousHistogram(array4, new Range(0f, 1f));
            cbHistogramWithoutBlack = new ContinuousHistogram(array5, new Range(-0.5f, 0.5f));
            crHistogramWithoutBlack = new ContinuousHistogram(array6, new Range(-0.5f, 0.5f));
        }