- codecs
- The Leadtools.Codecs.RasterCodecs object used internally in the optimization operation.
- buffer
- The original image buffer in memory as System.IntPtr array. The image format in memory should be one of the following supported formats:
- RasterImageFormat.Jpeg, Bits per pixel: 8 for grayscale, 24 for color.
- RasterImageFormat.Jpeg411, Bits per pixel: 8 for grayscale, 24 for color.
- RasterImageFormat.Jpeg422, Bits per pixel: 8 for grayscale, 24 for color.
- RasterImageFormat.ExifJpeg411, Bits per pixel: 24 (color only).
- RasterImageFormat.ExifJpeg422, Bits per pixel: 24 (color only).
- RasterImageFormat.Gif, Bits per pixel: 1, 2, 3, 4, 5, 6, 7, and 8.
- RasterImageFormat.Png, Bits per pixel: 1, 4, 8, 24, and 32.
- RasterImageFormat.Bmp, Bits per pixel: 1, 4, 8, 16, 24, and 32.
- RasterImageFormat.BmpRle, Bits per pixel: 4, and 8.
- length
- The size, in bytes, of the buffer parameter in memory.
- options
- The options used in the optimization process.
- progressCallback
- Optional callback function that provides information about the progress of the optimization process.
Visual Basic (Declaration) | |
---|---|
Overloads Public Function OptimizeBuffer( _ ByVal codecs As RasterCodecs, _ ByVal buffer As IntPtr, _ ByVal length As Long, _ ByVal options As ImageOptimizerOptions, _ ByVal progressCallback As ImageOptimizerProgress _ ) As RasterNativeBuffer |
Visual Basic (Usage) | Copy Code |
---|---|
Dim instance As ImageOptimizer Dim codecs As RasterCodecs Dim buffer As IntPtr Dim length As Long Dim options As ImageOptimizerOptions Dim progressCallback As ImageOptimizerProgress Dim value As RasterNativeBuffer value = instance.OptimizeBuffer(codecs, buffer, length, options, progressCallback) |
C# | |
---|---|
public RasterNativeBuffer OptimizeBuffer( RasterCodecs codecs, IntPtr buffer, long length, ImageOptimizerOptions options, ImageOptimizerProgress progressCallback ) |
C++/CLI | |
---|---|
public: RasterNativeBuffer OptimizeBuffer( RasterCodecs^ codecs, IntPtr buffer, int64 length, ImageOptimizerOptions options, ImageOptimizerProgress^ progressCallback ) |
Parameters
- codecs
- The Leadtools.Codecs.RasterCodecs object used internally in the optimization operation.
- buffer
- The original image buffer in memory as System.IntPtr array. The image format in memory should be one of the following supported formats:
- RasterImageFormat.Jpeg, Bits per pixel: 8 for grayscale, 24 for color.
- RasterImageFormat.Jpeg411, Bits per pixel: 8 for grayscale, 24 for color.
- RasterImageFormat.Jpeg422, Bits per pixel: 8 for grayscale, 24 for color.
- RasterImageFormat.ExifJpeg411, Bits per pixel: 24 (color only).
- RasterImageFormat.ExifJpeg422, Bits per pixel: 24 (color only).
- RasterImageFormat.Gif, Bits per pixel: 1, 2, 3, 4, 5, 6, 7, and 8.
- RasterImageFormat.Png, Bits per pixel: 1, 4, 8, 24, and 32.
- RasterImageFormat.Bmp, Bits per pixel: 1, 4, 8, 16, 24, and 32.
- RasterImageFormat.BmpRle, Bits per pixel: 4, and 8.
- length
- The size, in bytes, of the buffer parameter in memory.
- options
- The options used in the optimization process.
- progressCallback
- Optional callback function that provides information about the progress of the optimization process.
Return Value
A Leadtools.RasterNativeBuffer structure that contains the image optimized buffer in memory.This example will optimize a Png image file and then save it to a separate folder
Visual Basic | Copy 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"; } |
For more information, refer to Image Optimization Using The ImageOptimizer Class.
Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7