Leadtools.ImageOptimization Send comments on this topic. | Back to Introduction - All Topics | Help Version 15.8.31
OptimizeBuffer Method
See Also  Example
Leadtools.ImageOptimization Namespace > ImageOptimizer Class : OptimizeBuffer Method




Optimizes a supported image format buffer using the passed optimization options.

Overload List

OverloadDescription
OptimizeBuffer(RasterCodecs,IntPtr,Int32,ImageOptimizerOptions,ImageOptimizerProgress) Optimizes a supported image format buffer using the passed optimization options.  
OptimizeBuffer(RasterCodecs,Byte[],Int32,Int32,ImageOptimizerOptions,ImageOptimizerProgress) Optimizes a supported image format buffer using the passed optimization options.  

Example

This example will optimize a Png image file and then save it to a separate folder

Visual BasicCopy Code
Public Sub TestPngImageOptimizer()
   ' Initialize the RasterCodecs class
   RasterCodecs.Startup()
   Dim Codecs As RasterCodecs = New RasterCodecs()

   ' The input and output location
   Dim inputFileName As String = "C:\Program Files\LEAD Technologies\LEADTOOLS 15\Images\Image1.png"
   Dim outputFolder As String = "C:\Program Files\LEAD Technologies\LEADTOOLS 15\Images\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(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.
   RasterCodecs.Shutdown()
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
C#Copy Code
public void TestPngImageOptimizer( ) 

   // Initialize the RasterCodecs class 
   RasterCodecs.Startup(); 
   RasterCodecs codecs = new RasterCodecs(); 
 
   // The input and output location 
   string inputFileName = @"C:\Program Files\LEAD Technologies\LEADTOOLS 15\Images\Image1.png"; 
   string outputFolder = @"C:\Program Files\LEAD Technologies\LEADTOOLS 15\Images\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. 
   RasterCodecs.Shutdown(); 

 
// 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); 
   } 
}

Remarks

Requirements

Target Platforms: Microsoft .NET Framework 2.0, Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

See Also