PngQualityFactor Property

Summary
Gets or sets the value that represents the quality factor to be used in the image optimization operation.
Syntax
C#
VB
C++
public int PngQualityFactor { get; set; } 
  
Public Property PngQualityFactor As Integer 
public: 
property int PngQualityFactor { 
   int get(); 
   void set (    int ); 
} 

Property Value

The PngQualityFactor can be a value between 0 and 10 where:

  • 0 = default compression
  • 1 = fastest compression
  • .
  • .
  • .
  • 9 = highest compression ratio
  • 10 = no compression

The Default value is 9.

Remarks

The PngQualityFactor is used only if the original image format is RasterImageFormat.Png. Bits per pixel: 1, 4, 8, 24, 32, 48, and 64.

Example
C#
VB
using Leadtools; 
using Leadtools.Codecs; 
using Leadtools.ImageOptimization; 
 
public void TestPngImageOptimizer() 
{ 
   // Initialize the RasterCodecs class 
   RasterCodecs codecs = new RasterCodecs(); 
 
   // The input and output location 
   string inputFileName = Path.Combine(LEAD_VARS.ImagesDir, "LittleGFlyingAlpha.png"); 
   string outputFolder = Path.Combine(LEAD_VARS.ImagesDir, "OptimizedImages"); 
 
   // Initialize a new Optimizer object 
   ImageOptimizer optimizer = new ImageOptimizer(); 
 
   // Optimization Options 
   ImageOptimizerOptions options = ImageOptimizerOptions.Default; 
 
   // Set custom optimization options 
   options.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 exists 
      if (!Directory.Exists(outputFolder)) 
         Directory.CreateDirectory(outputFolder); 
 
      // Get the name of the output file from the input file 
      string outputFileName = Path.Combine(outputFolder, Path.GetFileName(inputFileName)); 
 
      // Save the optimized buffer to the output file 
      using (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 file 
      size = (int)fs.Length; 
      ptr = Marshal.AllocHGlobal(size); 
 
      // Load in 32K chunks 
      const int bufferSize = 32 * 1024; 
      byte[] buffer = new byte[bufferSize]; 
 
      int bytesToRead; 
      int bytesLeft = (int)fs.Length; 
      IntPtr tempPtr = ptr;   // where we are 
      do 
      { 
         // read a chunk 
         bytesToRead = Math.Min(bufferSize, bytesLeft); 
         if (bytesToRead > 0) 
         { 
            fs.Read(buffer, 0, bytesToRead); 
 
            // copy into our buffer 
            Marshal.Copy(buffer, 0, tempPtr, bytesToRead); 
 
            // move the temp pointer 
            tempPtr = new IntPtr(tempPtr.ToInt64() + bytesToRead); 
 
            bytesLeft -= bytesToRead; 
         } 
      } 
      while (bytesToRead > 0); 
   } 
} 
 
static class LEAD_VARS 
{ 
   public const string ImagesDir = @"C:\LEADTOOLS21\Resources\Images"; 
} 
Imports Leadtools 
Imports Leadtools.Codecs 
Imports Leadtools.ImageOptimization 
'''Imports Leadtools.Support.Examples 
 
Public Sub TestPngImageOptimizer() 
   ' Initialize the RasterCodecs class 
   Dim Codecs As RasterCodecs = New RasterCodecs() 
 
   ' The input and output location 
   Dim inputFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "LittleGFlyingAlpha.png") 
   Dim outputFolder As String = Path.Combine(LEAD_VARS.ImagesDir, "OptimizedImages") 
 
   ' Initialize a new Optimizer object 
   Dim optimizer As ImageOptimizer = New ImageOptimizer() 
 
   ' Optimization Options 
   Dim options As ImageOptimizerOptions = ImageOptimizerOptions.Default 
 
   '' Set custom optimization options 
   options.Distance = 20 
   options.Percent = 15 
   options.PngQualityFactor = 4 
 
   Dim bufferPtr As IntPtr 
   Dim bufferSize As Integer = 0 
   LoadFileIntoPointer(inputFileName, bufferPtr, bufferSize) 
 
   If (IntPtr.Zero <> bufferPtr AndAlso bufferSize > 0) Then 
      Dim optBuffer As RasterNativeBuffer = optimizer.OptimizeBuffer(Codecs, bufferPtr, bufferSize, options, Nothing) 
 
      ' 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 exists 
      If (Not Directory.Exists(outputFolder)) Then 
         Directory.CreateDirectory(outputFolder) 
      End If 
 
      ' Get the name of the output file from the input file 
      Dim outputFileName As String = Path.Combine(outputFolder, Path.GetFileName(inputFileName)) 
 
      ' Save the optimized buffer to the output file 
      Using fs As FileStream = File.Create(outputFileName) 
 
         Dim optArray(CInt(optBuffer.Length)) As Byte 
 
         Marshal.Copy(optBuffer.Data, optArray, 0, optArray.Length) 
         fs.Write(optArray, 0, optArray.Length) 
      End Using 
 
      ' Free optBuffer.PointerBuffer, since it won't be needed anymore. 
      Marshal.FreeHGlobal(optBuffer.Data) 
 
      ' Compare the original image size with the optimized size. 
      Dim orgSize As Long = New FileInfo(inputFileName).Length 
      Dim optSize As Long = New FileInfo(outputFileName).Length 
      Dim percentage As Integer = CType(CType(optSize * 100.0 / orgSize, Double), Integer) 
 
      Dim message As String = String.Format( 
         "Original image size: {0} KB{1}Optimized image size: {2} KB{1}Percentage: {3}%", 
         orgSize / 1024, Environment.NewLine, optSize / 1024, 
         100 - percentage) 
      Console.WriteLine(message) 
   End If 
 
   'shutdown the RasterCodecs class. 
End Sub 
 
' This method opens an image file and loads it into IntPtr. 
Private Sub LoadFileIntoPointer(ByVal fileName As String, ByRef ptr As IntPtr, ByRef size As Integer) 
   Using fs As FileStream = File.OpenRead(fileName) 
      ' Allocate memory to load the file 
      size = CType(fs.Length, Integer) 
      ptr = Marshal.AllocHGlobal(size) 
 
      ' Load in 32K chunks 
      Const bufferSize As Integer = 32 * 1024 
      Dim buffer(bufferSize) As Byte 
 
      Dim bytesToRead As Integer 
 
      Dim bytesLeft As Integer = CType(fs.Length, Integer) 
      Dim tempPtr As IntPtr = ptr   ' where we are 
      Do 
         ' read a chunk 
         bytesToRead = Math.Min(bufferSize, bytesLeft) 
         If (bytesToRead > 0) Then 
            fs.Read(buffer, 0, bytesToRead) 
 
            ' copy into our buffer 
            Marshal.Copy(buffer, 0, tempPtr, bytesToRead) 
 
            ' move the temp pointer 
            tempPtr = New IntPtr(tempPtr.ToInt64() + bytesToRead) 
 
            bytesLeft -= bytesToRead 
         End If 
      Loop While (bytesToRead > 0) 
   End Using 
End Sub 
 
Public NotInheritable Class LEAD_VARS 
   Public Const ImagesDir As String = "C:\LEADTOOLS21\Resources\Images" 
End Class 
Requirements

Target Platforms

Help Version 21.0.2021.6.30
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.