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") + "%."); }