private void RequestImageTransform() { if (originalImage == null || backgroundWorker.IsBusy) { return; } WorkerData workerData; IPixelTransform transform; IErrorDiffusion ditherer; Bitmap image; transform = GetPixelTransform(); ditherer = GetDitheringInstance(); image = ImageProcessor.DeepClone(originalImage.Image, PixelFormat.Format32bppArgb);//.CopyTo32bppArgb(); if (image == null) { return; } if (transform == null) { return; } Cursor.Current = Cursors.WaitCursor; this.UseWaitCursor = true; workerData = new WorkerData { Image = image, Transform = transform, Dither = ditherer }; if (InternalSettings.Use_Async_Dither) { backgroundWorker.RunWorkerAsync(workerData); } else { backgroundWorker_RunWorkerCompleted( backgroundWorker, new RunWorkerCompletedEventArgs(DitherHelper.GetTransformedImage(workerData), null, false)); } }
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { WorkerData data; data = (WorkerData)e.Argument; // need to keep track of the worker and event args // so that we can check for cancel in the function data.Worker = sender as BackgroundWorker; data.Args = e; Bitmap btmp = DitherHelper.GetTransformedImage(data); if (e.Cancel == true) { btmp?.Dispose(); return; } e.Result = btmp; }
static void Main(string[] args) { string fileName, outName; bool createScanFile = false; Size autoSizeOutImage = Size.Empty; AskGetDitherResult dither = new AskGetDitherResult(); if (args.Length > 0) { fileName = args[0]; if (File.Exists(fileName)) { outName = Path.GetFileNameWithoutExtension(fileName) + "_convert.png"; } else { fileName = GetFileName(); outName = Path.GetFileNameWithoutExtension(fileName) + "_convert.png"; } switch (args.Length) { case 2: autoSizeOutImage = ParseSize(args[1]); break; case 3: int w = -1, h = -1; autoSizeOutImage = new Size(-1, -1); if (int.TryParse(args[1], out w)) { autoSizeOutImage.Width = w; } if (int.TryParse(args[2], out h)) { autoSizeOutImage.Height = h; } if (autoSizeOutImage.Width == -1 || autoSizeOutImage.Height == -1) { autoSizeOutImage = Size.Empty; break; } break; } } else { fileName = GetFileName(); outName = Path.GetFileNameWithoutExtension(fileName) + "_convert.png"; Console.WriteLine(""); autoSizeOutImage = AskGetSize(); Console.WriteLine(""); dither = AskGetDithering(); createScanFile = AskCreateScanFile(); } Bitmap data = LoadImage(fileName); if (data == null) { Console.WriteLine("there was an error loading image, program will exit"); Console.ReadLine(); return; } if (autoSizeOutImage != Size.Empty) { Bitmap newScaled = new Bitmap(autoSizeOutImage.Width, autoSizeOutImage.Height); using (Graphics g = Graphics.FromImage(newScaled)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.DrawImage(data, new Rectangle(0, 0, autoSizeOutImage.Width, autoSizeOutImage.Height), new Rectangle(0, 0, data.Width, data.Height), GraphicsUnit.Pixel); } data.Dispose(); data = newScaled; } Console.WriteLine("\nconverting..."); // user wants dithering if (dither.DitherAlgorithm != null) { // request image tansform disposes of the input image so we don't need to // do anythign special to dispose of the unused data using (Bitmap bmp = DitherHelper.RequestImageTransform(data, dither.Transform, dither.DitherAlgorithm)) { if (createScanFile) { CreateScanFile(bmp, outName); } bmp.Save(outName, ImageFormat.Png); } } else { Color color; Bitmap newBitmap = new Bitmap(data.Width, data.Height); using (Graphics g = Graphics.FromImage(newBitmap)) { for (int x = 0; x < data.Width; x++) { for (int y = 0; y < data.Height; y++) { color = data.GetPixel(x, y); newBitmap.SetPixel(x, y, dye[closestColor2(dye, color)]); } } g.DrawImage(newBitmap, new Point(0, 0)); } if (createScanFile) { CreateScanFile(newBitmap, outName); } newBitmap.Save(outName, ImageFormat.Png); data.Dispose(); } Console.WriteLine("done.\n"); Console.WriteLine(outName); //Console.ReadLine(); }