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:\Users\Public\Documents\LEADTOOLS Images"
End Class
             
   
     
            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:\Users\Public\Documents\LEADTOOLS Images";
}