private async void OnThresholdButtonClick(object sender, RoutedEventArgs eventArgs) { if (mainWindow.Working) { return; } if (mainWindow.CurrentBitmap != null && mainWindow.ColorPalette.Count > 0) { mainWindow.Working = true; statusText.Text = "Thresholding image"; Bitmap bitmap = await Task.Run(() => Ditherer.ClosestColor(mainWindow.CurrentBitmap, mainWindow.ColorPalette.ToArray())); mainWindow.ChangeMainImage(bitmap); statusText.Text = ""; mainWindow.Working = false; } }
private async void OnRandomButtonClick(object sender, RoutedEventArgs eventArgs) { if (mainWindow.Working) { return; } if (mainWindow.CurrentBitmap != null && mainWindow.ColorPalette.Count > 0) { mainWindow.Working = true; statusText.Text = "Dithering image"; float bias = (float)randomBiasNumeric.Value; Bitmap bitmap = await Task.Run(() => Ditherer.RandomDither(mainWindow.CurrentBitmap, mainWindow.ColorPalette.ToArray(), bias)); mainWindow.ChangeMainImage(bitmap); statusText.Text = ""; mainWindow.Working = false; } }
private async void OnMinAvgErrButtonClick(object sender, RoutedEventArgs eventArgs) { if (mainWindow.Working) { return; } if (mainWindow.CurrentBitmap != null && mainWindow.ColorPalette.Count > 0) { mainWindow.Working = true; statusText.Text = "Dithering image"; float[] errorMatrix = new float[12]; for (int i = 0; i < errorMatrix.Length; i++) { errorMatrix[i] = (float)(twoRowErrorNumeric[i].Value / twoRowErrorMultiplierNumeric.Value); } Bitmap bitmap = await Task.Run(() => Ditherer.MinAvgErrDither(mainWindow.CurrentBitmap, mainWindow.ColorPalette.ToArray(), errorMatrix)); mainWindow.ChangeMainImage(bitmap); statusText.Text = ""; mainWindow.Working = false; } }
static float DitherOneImage(Bitmap srcData, Bitmap dstData, DitherPattern pattern, Color transparentColorKey) { Ditherer ditherer = new Ditherer(srcData.Width, srcData.Height); for (int x = 0; x < srcData.Width; x++) { for (int y = 0; y < srcData.Height; y++) { Color c = srcData.GetPixel(x, y); if (c == transparentColorKey || c.A == 0) { dstData.SetPixel(x, y, Color.FromArgb(0)); } else { dstData.SetPixel(x, y, ditherer.Dither(x, y, c, pattern)); } } } return(ditherer.RootMeanSquaredError); }
private async void OnOrderedButtonClick(object sender, RoutedEventArgs eventArgs) { if (mainWindow.Working) { return; } if (mainWindow.CurrentBitmap != null && mainWindow.ColorPalette.Count > 0) { mainWindow.Working = true; statusText.Text = "Dithering image"; float[,] matrix = new float[4, 4]; for (int i = 0; i < orderedMatrixNumeric.Length; i++) { matrix[i % 4, i / 4] = ((float)orderedMatrixNumeric[i].Value) / orderedMatrixNumeric.Length; } //todo: configurable size Bitmap bitmap = await Task.Run(() => Ditherer.OrderedDither(mainWindow.CurrentBitmap, mainWindow.ColorPalette.ToArray(), matrix)); mainWindow.ChangeMainImage(bitmap); statusText.Text = ""; mainWindow.Working = false; } }