LEADTOOLS Image Processing (Leadtools.ImageOptimization assembly) Send comments on this topic. | Back to Introduction - All Topics | Help Version 17.0.3.29
ImageOptimizer Class
See Also  Members  
Leadtools.ImageOptimization Namespace : ImageOptimizer Class



Provides methods to optimize one image or a directory of images in one of the supported formats.

Object Model

ImageOptimizer Class

Syntax

Visual Basic (Declaration) 
Public Class ImageOptimizer 
Visual Basic (Usage)Copy Code
Dim instance As ImageOptimizer
C# 
public class ImageOptimizer 
C++/CLI 
public ref class ImageOptimizer 

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
   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
C#Copy Code
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";
}

Remarks

If the image is a 16-, 24-, or 32-bit image, the real number of colors used in the image is calculated and when possible the image is saved with lower bits per pixel. If the image is 1-, 4-, or 8-bits per pixel, the Percent and Distance are used.

For more information, refer to Image Optimization Using The ImageOptimizer Class.

Inheritance Hierarchy

System.Object
   Leadtools.ImageOptimization.ImageOptimizer

Requirements

Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7

See Also