private void makeGrayScale()
        {
            Color color;
            int   grayscale;
            int   rows = InputImage.Height;
            int   cols = InputImage.Width;

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    color                 = InputImage.GetPixel(i, j);
                    grayscale             = (int)(color.R * 0.299) + (int)(color.G * 0.587) + (int)(color.B * 0.114); // make each pixel to gray
                    GrayScaleValues[i, j] = grayscale;
                }
            }
        }
예제 #2
0
        public bool Convert(CancellationToken?token)
        {
            width  = InputImage.Width;
            height = InputImage.Height;
            HSLColor[,] tempHSLPixels = new HSLColor[width, height];
            lock (lockRGB)
            {
                RGBPixels = new Color[width, height];
                for (int x = 0; x < width; ++x)
                {
                    for (int y = 0; y < height; ++y)
                    {
                        RGBPixels[x, y] = InputImage.GetPixel(x, y);
                    }
                }
            }
            var tempImage = new WriteableBitmap(width, height,
                                                InputImage.HorizontalResolution, InputImage.VerticalResolution,
                                                System.Windows.Media.PixelFormats.Bgra32, null);
            int bytesPerPixel = tempImage.Format.BitsPerPixel / 8;
            int bytesAmount   = width * height * bytesPerPixel;

            byte[] pixels      = new byte[bytesAmount]; //масив пікселів для вихідного зображення
            int    bytesPerRow = width * bytesPerPixel;

            for (int x = 0; x < width; ++x)
            {
                for (int y = 0; y < height; ++y)
                {
                    if (token != null && token.Value.IsCancellationRequested)
                    {
                        return(false);
                    }
                    var rgbColor = InputImage.GetPixel(x, y); //отримуємо колір піксела
                    var hslColor = new HSLColor();
                    //перетворюємо значення кольорів так, щоб вони були в межах [0;1]
                    float r = rgbColor.R / 255.0f;
                    float g = rgbColor.G / 255.0f;
                    float b = rgbColor.B / 255.0f;
                    //шукаємо максимальне та мінімальне значення
                    float cMax = Math.Max(Math.Max(r, g), b);
                    float cMin = Math.Min(Math.Min(r, g), b);
                    //шукаємо розмах
                    float delta = cMax - cMin;
                    //рахуємо Hue в градусах
                    if (delta == 0.0f)  //якщо всі компоненти RGB мають рівне значення
                    {
                        hslColor.H = 0; //встановимо тон 0
                    }
                    else
                    {
                        if (cMax == r) //якщо найбільшим є значення компоненти R
                        {
                            if (g >= b)
                            {
                                hslColor.H = (short)(60 * (g - b) / delta);
                            }
                            else
                            {
                                hslColor.H = (short)(60 * (g - b) / delta + 360);
                            }
                        }
                        else if (cMax == g) //якщо найбільшим є значення компоненти G
                        {
                            hslColor.H = (short)(60 * (b - r) / delta + 120);
                        }
                        else //якщо найбільшим є значення компоненти B
                        {
                            hslColor.H = (short)(60 * (r - g) / delta + 240);
                        }
                    }
                    //рахуємо Saturation у відсотках
                    hslColor.S = (byte)(delta / (1 - Math.Abs(1 - (cMax + cMin))) * 100);
                    //рахуємо Lightness у відсотках
                    hslColor.L          = (byte)((cMax + cMin) * 50); //те саме, що ((cMax + cMin) / 2 * 100)
                    tempHSLPixels[x, y] = hslColor;                   //записуємо колір в масив
                    //конвертація назад в RGB
                    int   pixelOffset = (y * width + x) * 4;
                    Color newRgbColor = HSLtoRGB(hslColor);
                    pixels[pixelOffset]     = newRgbColor.B; //записуємо результат конвертації в масив
                    pixels[pixelOffset + 1] = newRgbColor.G;
                    pixels[pixelOffset + 2] = newRgbColor.R;
                    pixels[pixelOffset + 3] = 255;
                }
            }
            if (token != null && token.Value.IsCancellationRequested)
            {
                return(false);
            }
            lock (lockHSL)
            {
                HSLPixels = tempHSLPixels;
            }
            tempImage.WritePixels(new Int32Rect(0, 0, width, height), pixels, bytesPerRow, 0);
            if (token != null && token.Value.IsCancellationRequested)
            {
                return(false);
            }
            Image = tempImage;
            //робимо копію кольорів в масив original (пригодиться під час редагування яскравості)
            originalHSLPixels = new HSLColor[width, height];
            for (int x = 0; x < width; ++x)
            {
                for (int y = 0; y < height; ++y)
                {
                    originalHSLPixels[x, y] = HSLPixels[x, y].DeepCopy();
                }
            }
            return(true);
        }