コード例 #1
0
        internal static async Task Run()
        {
            TimeTaken.Start();
            foreach (FileInfo inFile in SourceFiles)
            {
                FileInfo outFile = new FileInfo(inFile.FullName.Replace(inFile.DirectoryName, Program.Settings.DestinationDirectory.FullName)
                                                .Replace(inFile.Extension, "." + Program.Settings.ConvertToNonAlphaValue.ToString().ToLower()));

                if (!inFile.Extension.ContainsAny(".png", ".jpg", ".bmp", ".gif"))
                {
                    if (Program.Settings.CopySkippedFiles)
                    {
                        await FileSystemHelper.Copy(inFile, new FileInfo(outFile.FullName.Replace(outFile.Extension, inFile.Extension)), true);
                    }
                    IncompatibleFilesCopiedOver++;
                    if (!Program.CommandMode)
                    {
                        Program.Form.IncrementOverallProgress();
                    }
                    continue;
                }

                if (!Program.CommandMode)
                {
                    Program.Form.Invoke((MethodInvoker) delegate()
                    {
                        Program.Form.CurrentFileLabel.Text = "File: " + inFile.Name;
                    });
                }

                using (FileStream inStream = await FileIOHelper.OpenStream(inFile))
                {
                    byte[] imgData = new byte[inStream.Length];
                    await inStream.ReadAsync(imgData);

                    using MemoryStream memStr = new MemoryStream(imgData);
                    using Bitmap map          = new Bitmap(memStr);
                    bool isAlphaPresent = map.PixelFormat == PixelFormat.Format16bppArgb1555 || map.PixelFormat == PixelFormat.Format32bppArgb ||
                                          map.PixelFormat == PixelFormat.Format32bppPArgb || map.PixelFormat == PixelFormat.Format64bppArgb ||
                                          map.PixelFormat == PixelFormat.Format64bppPArgb;

                    if (Program.Settings.DownsizeLargerResolutionImages && (map.Width <= Program.Settings.TargetImageWidth || map.Height <= Program.Settings.TargetImageHeight))
                    {
                        if (Program.Settings.CopySkippedFiles)
                        {
                            await FileSystemHelper.Copy(inFile, new FileInfo(outFile.FullName.Replace(outFile.Extension, inFile.Extension)), true);
                        }
                        if (!Program.CommandMode)
                        {
                            Program.Form.IncrementOverallProgress();
                        }
                        continue;
                    }

                    if (map.Width != map.Height && Program.Settings.OnlyPassSquareImages)
                    {
                        if (!Program.CommandMode)
                        {
                            Program.Form.IncrementOverallProgress();
                        }
                        continue;
                    }

                    if (Program.Settings.UseAlphaFormatOnly || isAlphaPresent)
                    {
                        outFile = new FileInfo(inFile.FullName.Replace(inFile.DirectoryName, Program.Settings.DestinationDirectory.FullName)
                                               .Replace(inFile.Extension, "." + Program.Settings.ConvertToAlphaValue.ToString().ToLower()));
                    }

                    using FileStream outStream = outFile.Create();
                    using (Image image = Image.Load(imgData, out IImageFormat format))
                    {
                        string ConvertToAlphaString    = Program.Settings.ConvertToAlphaValue.ToString();
                        string ConvertToNonAlphaString = Program.Settings.ConvertToNonAlphaValue.ToString();

                        image.Mutate(c =>
                        {
                            c.Resize(Program.Settings.TargetImageWidth != 0 ? Program.Settings.TargetImageWidth : map.Width, Program.Settings.TargetImageHeight != 0 ? Program.Settings.TargetImageHeight : map.Height);
                        });

                        if (Program.Settings.UseAlphaFormatOnly || isAlphaPresent)
                        {
                            ConvertTransparentFormat();
                        }
                        else
                        {
                            ConvertNonTransparentFormat();
                        }
                        ProcessedImageCount++;

                        void ConvertNonTransparentFormat()
                        {
                            if (ConvertToNonAlphaString == "JPG")
                            {
                                image.SaveAsJpeg(outStream, new JpegEncoder
                                {
                                    Quality = 100 - Program.Settings.CompressionLevel
                                });
                                LogConversionState();
                            }
                            else if (ConvertToNonAlphaString == "BMP")
                            {
                                image.SaveAsBmp(outStream);
                                LogConversionState();
                            }
                        }

                        void ConvertTransparentFormat()
                        {
                            if (ConvertToAlphaString == "PNG")
                            {
                                image.SaveAsPng(outStream, new PngEncoder
                                {
                                    CompressionLevel = Program.Settings.CompressionLevel == 0 ? PngCompressionLevel.Level0 :
                                                       Program.Settings.CompressionLevel == 10 ? PngCompressionLevel.Level1 :
                                                       Program.Settings.CompressionLevel == 20 ? PngCompressionLevel.Level2 :
                                                       Program.Settings.CompressionLevel == 30 ? PngCompressionLevel.Level3 :
                                                       Program.Settings.CompressionLevel == 40 ? PngCompressionLevel.Level4 :
                                                       Program.Settings.CompressionLevel == 50 ? PngCompressionLevel.Level5 :
                                                       Program.Settings.CompressionLevel == 60 ? PngCompressionLevel.Level6 :
                                                       Program.Settings.CompressionLevel == 70 ? PngCompressionLevel.Level7 :
                                                       Program.Settings.CompressionLevel == 80 ? PngCompressionLevel.Level8 :
                                                       Program.Settings.CompressionLevel == 90 ? PngCompressionLevel.Level9 : PngCompressionLevel.Level9
                                });
                                LogConversionState();
                            }
                            else if (ConvertToAlphaString == "GIF")
                            {
                                image.SaveAsGif(outStream);
                                LogConversionState();
                            }
                        }

                        void LogConversionState()
                        {
                            if (Program.Settings.TargetImageWidth != 0 || Program.Settings.TargetImageHeight != 0 && outFile.Extension != inFile.Extension)
                            {
                                AddLog("Resized " + inFile.Name + " to " + Program.Settings.TargetImageWidth + "x" + Program.Settings.TargetImageHeight + " & converted to " + outFile.Extension.ToUpper()[1..] + " | Reduction " + GetPercentageReduction().ToString("0.00") + "%.");
                            }