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