예제 #1
0
        public static YCbCrPixel Convert(RgbPixel rgb)
        {
            var yChannel  = 0.299 * rgb.R + 0.587 * rgb.G + 0.114 * rgb.B;
            var cbChannel = -0.168935 * rgb.R - 0.331665 * rgb.G + 0.50059 * rgb.B;
            var crChannel = 0.499813 * rgb.R - 0.418531 * rgb.G - 0.081282 * rgb.B;

            var yCbCr = new YCbCrPixel(yChannel, cbChannel, crChannel);

            return(yCbCr);
        }
예제 #2
0
        public void DecodeImage(IDownSampler downSampler, QuantizeMethod quantizeMethod, int quantizeParameter)
        {
            GetQuantizeds(quantizeMethod, quantizeParameter, out var quantizedY, out var quantizedCb, out var quantizedCr);

            var iQuantizedY  = new double[256, 256];
            var iQuantizedCb = new double[128, 128];
            var iQuantizedCr = new double[128, 128];

            if (quantizeMethod == QuantizeMethod.ZigZag)
            {
                iQuantizedY  = quantizedY.GetIQuantizeUsingZigZagMethod(quantizeParameter);
                iQuantizedCb = quantizedCb.GetIQuantizeUsingZigZagMethod(quantizeParameter);
                iQuantizedCr = quantizedCr.GetIQuantizeUsingZigZagMethod(quantizeParameter);
            }

            if (quantizeMethod == QuantizeMethod.Method2)
            {
                iQuantizedY  = quantizedY.GetIQuantizeUsingMethod2(quantizeParameter);
                iQuantizedCb = quantizedCb.GetIQuantizeUsingMethod2(quantizeParameter);
                iQuantizedCr = quantizedCr.GetIQuantizeUsingMethod2(quantizeParameter);
            }

            if (quantizeMethod == QuantizeMethod.JpegQuality)
            {
                iQuantizedY  = quantizedY.GetIQuantizeUsingJpegQualityMethod(quantizeParameter);
                iQuantizedCb = quantizedCb.GetIQuantizeUsingJpegQualityMethod(quantizeParameter);
                iQuantizedCr = quantizedCr.GetIQuantizeUsingJpegQualityMethod(quantizeParameter);
            }

            var iDctY  = dct.GetIDiscreteCosineTransform(iQuantizedY);
            var iDctCb = dct.GetIDiscreteCosineTransform(iQuantizedCb);
            var iDctCr = dct.GetIDiscreteCosineTransform(iQuantizedCr);

            var upSampledCb = downSampler.GetUpSampledMatrix(iDctCb);
            var upSampledCr = downSampler.GetUpSampledMatrix(iDctCr);

            var yCbCrPixels = new YCbCrPixel[256, 256];

            for (int i = 0; i < 256; i++)
            {
                for (int j = 0; j < 256; j++)
                {
                    yCbCrPixels[i, j] = new YCbCrPixel
                    {
                        Y  = (byte)iDctY[i, j],
                        Cb = (byte)upSampledCb[i, j],
                        Cr = (byte)upSampledCr[i, j]
                    };
                }
            }

            ReconstructedImage = GetBitmapFromYCbCrPixels(yCbCrPixels);
        }
예제 #3
0
        private YCbCrPixel[,] GetYCbCrPixelsFromImage(Bitmap image)
        {
            var pixels = new YCbCrPixel[256, 256];

            for (int i = 0; i < 256; i++)
            {
                for (int j = 0; j < 256; j++)
                {
                    pixels[i, j] = pixelMapper.GetYCbCrPixelFromRgb(image.GetPixel(i, j));
                }
            }

            return(pixels);
        }
        public static YCbCrPixel[,] Convert(RgbPixel[,] matrix)
        {
            var height          = matrix.GetLength(0);
            var width           = matrix.GetLength(1);
            var convertedMatrix = new YCbCrPixel[height, width];

            for (var i = 0; i < height; i++)
            {
                for (var j = 0; j < width; j++)
                {
                    convertedMatrix[i, j] = RgbToYCbCrConverter.Convert(matrix[i, j]);
                }
            }
            return(convertedMatrix);
        }
예제 #5
0
        public Color GetRgbFromYCbCrPixel(YCbCrPixel yCbCrPixel)
        {
            //var red = yCbCrPixel.Y + 0.000 * (yCbCrPixel.Cb - 128) + 1.371 * (yCbCrPixel.Cr - 128);
            //var green = yCbCrPixel.Y - 0.336 * (yCbCrPixel.Cb - 128) - 0.698 * (yCbCrPixel.Cr - 128);
            //var blue = yCbCrPixel.Y + 1.732 * (yCbCrPixel.Cb - 128) + 0.000 * (yCbCrPixel.Cr - 128);

            var red   = yCbCrPixel.Y + 1.402 * (yCbCrPixel.Cr - 128);
            var green = yCbCrPixel.Y - 0.344136 * (yCbCrPixel.Cb - 128) - 0.714136 * (yCbCrPixel.Cr - 128);
            var blue  = yCbCrPixel.Y + 1.772 * (yCbCrPixel.Cb - 128);

            var normalizedRed   = Normalize(red, 0, 255);
            var normalizedGreen = Normalize(green, 0, 255);
            var normalizedBlue  = Normalize(blue, 0, 255);

            return(Color.FromArgb(normalizedRed, normalizedGreen, normalizedBlue));
        }