public int PngQualityFactor { get; set; }
The PngQualityFactor can be a value between 0 and 10 where:
The Default value is 9.
The PngQualityFactor is used only if the original image format is RasterImageFormat.Png. Bits per pixel: 1, 4, 8, 24, 32, 48, and 64.
using Leadtools;using Leadtools.Codecs;using Leadtools.ImageOptimization;public void TestPngImageOptimizer(){// Initialize the RasterCodecs classRasterCodecs codecs = new RasterCodecs();// The input and output locationstring inputFileName = Path.Combine(LEAD_VARS.ImagesDir, "LittleGFlyingAlpha.png");string outputFolder = Path.Combine(LEAD_VARS.ImagesDir, "OptimizedImages");// Initialize a new Optimizer objectImageOptimizer optimizer = new ImageOptimizer();// Optimization OptionsImageOptimizerOptions options = ImageOptimizerOptions.Default;// Set custom optimization optionsoptions.Distance = 20;options.Percent = 15;options.PngQualityFactor = 4;IntPtr bufferPtr;int bufferSize = 0;LoadFileIntoPointer(inputFileName, out bufferPtr, out bufferSize);if (IntPtr.Zero != bufferPtr && bufferSize > 0){RasterNativeBuffer optBuffer = optimizer.OptimizeBuffer(codecs, bufferPtr, bufferSize, options, null);// Free orgBuffer.PointerBuffer, since it won't be needed anymore.Marshal.FreeHGlobal(bufferPtr);// Save this image into the output folder// Make sure the output folder existsif (!Directory.Exists(outputFolder))Directory.CreateDirectory(outputFolder);// Get the name of the output file from the input filestring outputFileName = Path.Combine(outputFolder, Path.GetFileName(inputFileName));// Save the optimized buffer to the output fileusing (FileStream fs = File.Create(outputFileName)){byte[] optArray = new byte[optBuffer.Length];Marshal.Copy(optBuffer.Data, optArray, 0, optArray.Length);fs.Write(optArray, 0, optArray.Length);}// Free optBuffer.PointerBuffer, since it won't be needed anymore.Marshal.FreeHGlobal(optBuffer.Data);// Compare the original image size with the optimized size.long orgSize = new FileInfo(inputFileName).Length;long optSize = new FileInfo(outputFileName).Length;int percentage = (int)((double)optSize * 100.0 / orgSize);string message = string.Format("Original image size: {0} KB{1}Optimized image size: {2} KB{1}Percentage: {3}%",orgSize / 1024, Environment.NewLine, optSize / 1024,100 - percentage);MessageBox.Show(message);}//shutdown the RasterCodecs class.}// This method opens an image file and loads it into IntPtr.private void LoadFileIntoPointer(string fileName, out IntPtr ptr, out int size){using (FileStream fs = File.OpenRead(fileName)){// Allocate memory to load the filesize = (int)fs.Length;ptr = Marshal.AllocHGlobal(size);// Load in 32K chunksconst int bufferSize = 32 * 1024;byte[] buffer = new byte[bufferSize];int bytesToRead;int bytesLeft = (int)fs.Length;IntPtr tempPtr = ptr; // where we aredo{// read a chunkbytesToRead = Math.Min(bufferSize, bytesLeft);if (bytesToRead > 0){fs.Read(buffer, 0, bytesToRead);// copy into our bufferMarshal.Copy(buffer, 0, tempPtr, bytesToRead);// move the temp pointertempPtr = new IntPtr(tempPtr.ToInt64() + bytesToRead);bytesLeft -= bytesToRead;}}while (bytesToRead > 0);}}static class LEAD_VARS{public const string ImagesDir = @"C:\LEADTOOLS23\Resources\Images";}