Provides methods to optimize one image or a directory of images in one of the supported formats.
public class ImageOptimizer
Public Class ImageOptimizer
public ref class ImageOptimizer
If the image is a 16-bit, 24-bit, 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-bit, 4-bit, or 8-bits per pixel, the Percent and Distance are used. For more information, refer to Image Optimization Using The ImageOptimizer Class.
This example will optimize a PNG image file and then save it to a separate folder
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";
}
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
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document