libcaesium
Libcaesium is a simple library performing JPEG, PNG, WebP, TIFF and GIF (partial) compression/optimization written in Rust, with a C interface.
Usage example
Libcaesium exposes several functions for compressing and converting images, both from files and in-memory buffers.
Compress an image file
use CSParameters;
use compress;
let mut parameters = new;
parameters.keep_metadata = true;
parameters.jpeg.quality = 60;
let input_file_path = "input.jpg".to_string;
let output_file_path = "output.jpg".to_string;
let result = compress;
assert!;
Compress an image in memory
use CSParameters;
use compress_in_memory;
use fs;
let parameters = new;
let image_bytes = read.unwrap;
let compressed_bytes = compress_in_memory.unwrap;
// You can now write `compressed_bytes` to a file or use it as needed
Compress an image to a target size
use CSParameters;
use compress_to_size;
let mut parameters = new;
let input_file_path = "input.webp".to_string;
let output_file_path = "output.webp".to_string;
let max_output_size = 100_000; // 100 KB
let result = compress_to_size;
assert!;
Convert an image to another format
use ;
let parameters = new;
let input_file_path = "input.png".to_string;
let output_file_path = "output.jpg".to_string;
let result = convert;
assert!;
Convert an image in memory
use ;
use fs;
let parameters = new;
let image_bytes = read.unwrap;
let converted_bytes = convert_in_memory.unwrap;
// Use `converted_bytes` as needed
You can find more real-world usage in the examples folder.
To run an example, use:
Compilation
Compilation is available for all supported platforms: Windows, macOS and Linux.
[!NOTE] if you don't use the
--releaseflag, the PNG optimizations can take a very long time to complete, especially using the zopfli algorithm.
The result will be a dynamic library usable by external applications through its C interface.
Usage in C
You can find the C header file in the include folder in the project root directory.
Libcaesium exposes C functions, auto-detecting the input file type:
Compress an image file
struct CCSResult ;
Parameters
input_path- input file path (full filename)output_path- output file path (full filename)params- options struct, containing compression parameters (see below)
Return
A CCSResult struct
typedef struct CCSResult CCSResult;
If success is true the compression process ended successfully and error_message will be empty.
On failure, the error_message will be filled with a string containing a brief explanation of the error.
Compress an image in memory
struct CCSResult ;
Parameters
input_data- pointer to input image datainput_length- length of input data in bytesparams- options struct, containing compression parameters (see below)output- pointer to aCByteArraystruct that will be filled with the compressed data
Return
A CCSResult struct (see above).
After use, free the output buffer with c_free_byte_array.
Compress an image to a target size
struct CCSResult ;
Parameters
input_path- input file path (full filename)output_path- output file path (full filename)params- options struct, containing compression parameters (see below)max_output_size- the maximum output size, in bytesreturn_smallest- whether to return the smallest
Return
A CCSResult struct (see above).
Convert an image to another format
struct CCSResult ;
Parameters
input_path- input file path (full filename)output_path- output file path (full filename)format- target image format (see below)params- options struct, containing compression parameters (see below)
Return
A CCSResult struct (see above).
Memory management helpers
After using functions that allocate memory (such as c_compress_in_memory), you must free the returned buffers:
void ;
void ;
c_free_byte_arrayfrees the memory allocated for aCByteArray's data.c_free_stringfrees a string allocated by the library.
Compression options
The C options struct is as follows:
typedef struct CCSParameters CCSParameters;
keep_metadata: preserve image metadata (EXIF, etc.)jpeg_quality: JPEG quality (0-100)jpeg_chroma_subsampling: JPEG chroma subsampling (444,422,420,411)jpeg_progressive: enable progressive JPEGjpeg_optimize: enable JPEG optimizationjpeg_preserve_icc: allows to preserve ICC profile regardless ofkeep_metadatapng_quality: PNG quality (0-100)png_optimization_level: PNG optimization levelpng_force_zopfli: force Zopfli compression for PNGpng_optimize: enable PNG optimizationgif_quality: GIF quality (0-100)webp_quality: WebP quality (0-100)webp_lossless: enable WebP lossless modetiff_compression: TIFF compression (0=Uncompressed,1=Lzw,2=Deflate,3=Packbits)tiff_deflate_level: TIFF deflate level (1=Fast,6=Balanced,9=Best)width,height: resize output image (set to0to keep original size)
You can generate a C header file containing the options struct with the following command:
cbindgen --config cbindgen.toml --crate libcaesium --output include/libcaesium.h
Byte array struct
typedef struct CByteArray CByteArray;
data: pointer to the bufferlength: length of the buffer in bytes
Supported file types
typedef enum SupportedFileTypes SupportedFileTypes;
Compression vs Optimization
JPEG is a lossy format: that means you will always lose some information after each compression. So, compressing a file
with quality 100 for 10 times will result in an always different image, even though you can't really see the difference.
Libcaesium also supports optimization. This performs a lossless process, resulting in the
same exact image, but with a smaller size (10–12% usually).
GIF optimization is possible but currently not supported.
WebP's optimization is also possible, but it will probably result in a bigger output file as it's well suited to
losslessly convert from PNG or JPEG.