Trabajo con imágenes en Rust: bibliotecas, herramientas y ejemplos prácticos
Rust es un lenguaje de programación de sistemas moderno que se utiliza cada vez más para tareas relacionadas con el procesamiento de gráficos e imágenes. Gracias a su alto rendimiento, gestión segura de la memoria y un rico ecosistema de crates, Rust es ideal para crear herramientas de procesamiento de imágenes: desde simples convertidores de formato hasta complejos filtros y algoritmos de visión por computadora.
En este artículo, revisaremos las bibliotecas clave para trabajar con imágenes en Rust, analizaremos sus capacidades y proporcionaremos ejemplos de código funcionales.
Bibliotecas principales para trabajar con imágenes
El ecosistema de Rust ofrece varios crates maduros para el procesamiento de imágenes. Los más populares son:
- image — biblioteca fundamental para cargar, guardar y realizar transformaciones básicas de imágenes. Soporta PNG, JPEG, GIF, BMP, ICO, TIFF y otros formatos.
- photon-rs — biblioteca de alto rendimiento para aplicar filtros y efectos fotográficos. Funciona en Rust y WebAssembly.
- imageproc — extensión de image que proporciona algoritmos avanzados: transformadas de Hough, segmentación, operaciones morfológicas.
- rusttype — biblioteca para trabajar con fuentes y renderizar texto en imágenes.
Instalación y configuración
Agregue las dependencias al archivo Cargo.toml:
[dependencies]image = "0.25"photon-rs = "0.3"imageproc = "0.25"Carga, cambio de tamaño y guardado de imágenes
Comencemos con un ejemplo básico: cargaremos una imagen, la reduciremos a la mitad y la guardaremos en otro formato.
use image::{DynamicImage, GenericImageView, ImageFormat};use std::fs::File;
fn main() -> Result<(), Box<dyn std::error::Error>> { // Cargamos la imagen let img = image::open("input.jpg")?; println!("Tamaño: {} x {}", img.width(), img.height());
// Escalamos a la mitad del tamaño original let resized = img.resize_exact( img.width() / 2, img.height() / 2, image::imageops::FilterType::Lanczos3 );
// Guardamos en formato PNG let mut output = File::create("output.png")?; resized.write_to(&mut output, ImageFormat::Png)?;
println!("¡Listo! Guardado como output.png"); Ok(())}Aplicación de filtros fotográficos con photon-rs
La biblioteca photon-rs permite aplicar filtros, corregir colores y añadir efectos rápidamente.
use photon_rs::PhotonImage;use photon_rs::transform::resize;use photon_rs::filters::filter;
fn main() { // Abrimos la imagen let mut img = photon_rs::open_image("input.jpg");
// Aplicamos el filtro "sepia" filter(&mut img, "sepia", 1.0);
// Cambiamos el brillo photon_rs::channels::brighten(&mut img, 30);
// Cambiamos el tamaño let resized = resize(&img, 800, 600, photon_rs::transform::SamplingFilter::Nearest);
// Guardamos el resultado photon_rs::save_image(resized, "output_photon.jpg"); println!("Filtro aplicado, guardado en output_photon.jpg");}Trabajo con píxeles y dibujo
A veces es necesario manipular píxeles directamente o dibujar primitivas. Para ello, usamos image junto con imageproc.
use image::{RgbImage, Rgb};use imageproc::drawing::draw_filled_circle_mut;
fn main() { // Creamos una imagen vacía de 400x300 con fondo blanco let mut img = RgbImage::new(400, 300);
// Pintamos el fondo de azul claro for pixel in img.pixels_mut() { *pixel = Rgb([200, 220, 255]); }
// Dibujamos un círculo rojo (x=200, y=150, radio=80) draw_filled_circle_mut( &mut img,\ También en la biblioteca
Trabajo con Excel en JavaScript (Node.js): bibliotecas y ejemplos
Contenedor de Inyección de Dependencias para Kotlin: Koin vs Kodein vs Dagger
Colas de tareas para Rust: descripción general y ejemplos de uso
Trabajo con YAML en Node.js: bibliotecas js-yaml y yaml