예제 #1
0
        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;
            }
        }
예제 #2
0
        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();
            }
        }