private static void PrepareProcessing(string file) { string newFile = file.Replace(Program.baseDir, Program.outputDir); string filePNG = newFile.Replace(".paa", ".png"); filePNG = filePNG.Replace(".pac", ".png"); filePNG = filePNG.Replace(Program.baseDir, ""); string filePNGPreview = newFile.Replace(".paa", "_preview.png"); filePNGPreview = filePNGPreview.Replace(".pac", "_preview.png"); filePNGPreview = filePNGPreview.Replace(Program.baseDir, ""); Directory.CreateDirectory(Path.GetDirectoryName(filePNG) ?? throw new FileNotFoundException()); if (File.Exists(filePNG)) { lock (DataLock) alreadyFound++; return; } Program.LOG("File Found: " + file); WorkTask data = new WorkTask(file, filePNG, filePNGPreview); lock (DataLock) { InQueue++; } switch (Program.processingMethod) { case Program.Method.ThreadPool: ThreadPool.QueueUserWorkItem(ProcessPAAConvert, data); break; case Program.Method.Thread: lock (WorkQueue) WorkQueue.Enqueue(data); break; default: ProcessPAAConvert(data); break; } }
private static void ProcessPAAConvert(object input) { try { lock (DataLock) { runningTasks++; UpdateTitle(); } WorkTask data = (WorkTask)input; string filePath = data.inputPath; Program.LOG("Process File: " + filePath); //get raw pixel color data in ARGB32 format string ext = Path.GetExtension(filePath); bool isPac = ext != null && ext.Equals(".pac", StringComparison.OrdinalIgnoreCase); using (FileStream paaStream = File.OpenRead(filePath)) { PAA paa = new PAA(paaStream, isPac); byte[] pixels = PAA.GetARGB32PixelData(paa, paaStream); //create a BitmapSource List <Color> colors = paa.Palette.Colors.Select(c => Color.FromArgb(c.A8, c.R8, c.G8, c.B8)).ToList(); BitmapPalette bitmapPalette = colors.Count > 0 ? new BitmapPalette(colors) : null; BitmapSource bms = BitmapSource.Create(paa.Width, paa.Height, 300, 300, PixelFormats.Bgra32, bitmapPalette, pixels, paa.Width * 4); using (FileStream pngStream = File.OpenWrite(data.outputPath)) { PngBitmapEncoder pngEncoder = new PngBitmapEncoder(); BitmapFrame bmf = BitmapFrame.Create(bms); int size = 256; float percentWidth = Math.Min(size / (float)bmf.PixelWidth, 1); float percentHeight = Math.Min(size / (float)bmf.PixelHeight, 1); float percent = percentHeight < percentWidth ? percentHeight : percentWidth; if (bmf.PixelWidth > size || bmf.PixelHeight > size) { bmf = FastResize(bmf, percent, percent); } pngEncoder.Frames.Add(bmf); pngEncoder.Save(pngStream); size = 64; percentWidth = Math.Min(size / (float)bmf.PixelWidth, 1); percentHeight = Math.Min(size / (float)bmf.PixelHeight, 1); percent = percentHeight < percentWidth ? percentHeight : percentWidth; if (bmf.PixelWidth > size || bmf.PixelHeight > size) { using (FileStream pngStreamPreview = File.OpenWrite(data.previewOutputPath)) { PngBitmapEncoder pngEncoderPreview = new PngBitmapEncoder(); bmf = FastResize(bmf, percent, percent); pngEncoderPreview.Frames.Add(bmf); pngEncoderPreview.Save(pngStreamPreview); } } } } // Memory Cleanup Program.LOG("Processing Done: " + filePath); } catch (Exception) { } finally { lock (DataLock) { done++; runningTasks--; UpdateTitle(); } GC.Collect(); } }