Provides methods to optimize one image or a directory of images in one of the supported formats.
Syntax
Visual Basic (Declaration) | |
---|
Public Class 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 Basic | Copy Code |
---|
Public Sub TestPngImageOptimizer()
RasterCodecs.Startup()
Dim Codecs As RasterCodecs = New RasterCodecs()
Dim inputFileName As String = LeadtoolsExamples.Common.ImagesPath.Path + "Image1.png"
Dim outputFolder As String = LeadtoolsExamples.Common.ImagesPath.Path + "OptimizedImages"
Dim optimizer As ImageOptimizer = New ImageOptimizer()
Dim options As ImageOptimizerOptions = ImageOptimizerOptions.Default
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)
Marshal.FreeHGlobal(bufferPtr)
If (Not Directory.Exists(outputFolder)) Then
Directory.CreateDirectory(outputFolder)
End If
Dim outputFileName As String = Path.Combine(outputFolder, Path.GetFileName(inputFileName))
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
Marshal.FreeHGlobal(optBuffer.Data)
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
RasterCodecs.Shutdown()
End Sub
Private Sub LoadFileIntoPointer(ByVal fileName As String, ByRef ptr As IntPtr, ByRef size As Integer)
Using fs As FileStream = File.OpenRead(fileName)
size = CType(fs.Length, Integer)
ptr = Marshal.AllocHGlobal(size)
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
Do
bytesToRead = Math.Min(bufferSize, bytesLeft)
If (bytesToRead > 0) Then
fs.Read(buffer, 0, bytesToRead)
Marshal.Copy(buffer, 0, tempPtr, bytesToRead)
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 = LeadtoolsExamples.Common.ImagesPath.Path + "Image1.png"; string outputFolder = LeadtoolsExamples.Common.ImagesPath.Path + "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
Inheritance Hierarchy
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