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:
Based on quality values
pub unsafe extern "C"
Parameters
input_path- input file path (full filename)output_path- output file path (full filename)parameters- options struct, containing compression parameters (see below)
Return
A CCSResult struct
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.
Based on output size
pub unsafe extern "C"
Parameters
input_path- input file path (full filename)output_path- output file path (full filename)parameters- 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
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.
Based on convert output
pub unsafe extern "C"
Parameters
input_path- input file path (full filename)output_path- output file path (full filename)format- target image format (see below)parameters- options struct, containing compression parameters (see below)
Return
A CCSResult struct
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.
Compression options
The C options struct is slightly different from the Rust one:
The option description is the same as the Rust counterpart.
Valid values for jpeg_chroma_subsampling are [444, 422, 420, 411]. Any other value will be ignored and will be used
as
the default option.
Valid values for tiff_compression are [0 (Uncompressed), 1 (Lzw), 2 (Deflate), 3 (Packbits)]. Any other value will
be ignored and 0 will be used.
Valid values for tiff_deflate_level are [1 (Fast), 6 (Balanced), 9 (Best)]. Any other value will be ignored and
Best
will be used.
Supported file types
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.