refilelabs-image

A Rust library for advanced image manipulation and format conversion. Provides tools for loading image metadata, converting images, resizing images, and retrieving raw pixel data.
Used under the hood at re;file labs to power all image processing features.
Installation
[dependencies]
refilelabs-image = "0.2.5"
Features
- Load image metadata (dimensions, EXIF, GPS)
- Retrieve raw RGBA pixel data
- Convert images between formats
- Resize images to exact pixel dimensions
- Custom conversion settings (e.g. SVG rasterization size)
Note: The native Rust API (#[cfg(not(feature = "wasm"))]) excludes save_metadata, which requires wasm-bindgen types. For JavaScript/WASM usage see the npm package.
API Reference
convert_image
pub fn convert_image(
file: &[u8],
src_type: &str,
target_type: &str,
convert_settings: &Option<Settings>,
) -> Result<Vec<u8>, WasmImageError>
Converts an image from one format to another.
load_metadata
pub fn load_metadata(file: &[u8], src_type: &str) -> Result<Metadata, WasmImageError>
Extracts dimensions and EXIF metadata from an image file.
resize_image
pub fn resize_image(
file: &[u8],
src_type: &str,
width: u32,
height: u32,
) -> Result<Vec<u8>, WasmImageError>
Resizes an image to exact pixel dimensions using the Lanczos3 filter. Preserves the source format. SVG input is rasterized to PNG.
get_pixels
pub fn get_pixels(file: &[u8], src_type: &str) -> Result<ImageData, WasmImageError>
Decodes an image to raw RGBA pixel data.
Data Structures
Metadata
pub struct Metadata {
pub width: u32,
pub height: u32,
pub other: Option<HashMap<String, String>>, pub gps: Option<HashMap<String, String>>, pub errors: Option<Vec<String>>, }
ImageData
pub struct ImageData {
pub width: u32,
pub height: u32,
pub aspect_ratio: f32,
pub color_depth: u8,
pub pixels: Vec<u8>, }
Settings
Format-specific conversion settings. Currently supports SVG rasterization size.
Usage Example
use refilelabs_image::{convert_image, get_pixels, load_metadata, resize_image};
use std::fs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let file = fs::read("input.png")?;
let src_type = "image/png";
let metadata = load_metadata(&file, src_type)?;
println!("{}x{}", metadata.width, metadata.height);
if let Some(gps) = metadata.gps {
println!("GPS: {:?}", gps);
}
let converted = convert_image(&file, src_type, "image/webp", &None)?;
fs::write("output.webp", converted)?;
let resized = resize_image(&file, src_type, 800, 600)?;
fs::write("output_resized.png", resized)?;
let pixels = get_pixels(&file, src_type)?;
println!("{} RGBA pixels", pixels.pixels.len() / 4);
Ok(())
}
License
MIT