Пример #1
0
        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));
            }
        }
Пример #2
0
        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;
        }
Пример #3
0
        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();
        }