Trabajo con imágenes en Rust: resize y crop con la biblioteca image
\n\nRust es un lenguaje de programación de sistemas moderno que está ganando popularidad en tareas que requieren alto rendimiento y seguridad. Una de estas tareas es el procesamiento de imágenes. En este artículo, veremos en detalle cómo cambiar el tamaño (resize) y recortar (crop) imágenes en Rust utilizando la potente y conveniente biblioteca image. Aprenderá cómo instalar la biblioteca, cargar una imagen, aplicar transformaciones y guardar el resultado.
Instalación y vinculación de la biblioteca image
\n\nLa biblioteca image es el estándar de facto para trabajar con imágenes rasterizadas en el ecosistema de Rust. Soporta múltiples formatos (PNG, JPEG, GIF, BMP, WEBP y otros) y proporciona un amplio conjunto de funciones para el procesamiento.
Para comenzar, agregue la dependencia en el archivo Cargo.toml:
[dependencies]\nimage = "0.25"\n\nDespués de esto, puede importar los módulos necesarios en el código:
\n\nuse std::path::Path;\nuse image::{open, DynamicImage, GenericImageView, imageops::FilterType};\n\nCarga y guardado de imágenes
\n\nEl primer paso es cargar una imagen desde un archivo. La biblioteca detectará automáticamente el formato por la extensión. Veamos un ejemplo básico:
\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n // Cargamos la imagen\n let img = open("input.jpg")?;\n println!("Tamaño: {:?}", img.dimensions());\n // Guardamos en otro formato\n img.save("output.png")?;\n Ok(())\n}\n\nEl método open() devuelve un DynamicImage — una enumeración que puede almacenar la imagen en uno de varios formatos internos (RGB8, RGBA8, Gray8, etc.). El método dimensions() devuelve una tupla (u32, u32) — el ancho y el alto.
Cambio de tamaño (resize)
\n\nLa función resize() recibe un nuevo ancho, alto y el tipo de filtro. El filtro afecta la calidad del resultado y la velocidad de ejecución. Estos son los filtros principales:
- \n
- Nearest — rápido, pero de baja calidad (pixelación). \n
- Lanczos3 — alta calidad, pero más lento. \n
- CatmullRom — buen equilibrio entre velocidad y calidad. \n
- Gaussian — desenfoca la imagen al reducirla. \n
Ejemplo de cambio de tamaño a 800x600 píxeles:
\n\nuse image::imageops::FilterType;\n\nfn resize_example() -> Result<(), Box<dyn std::error::Error>> {\n let img = open("input.jpg")?;\n let resized = img.resize(800, 600, FilterType::Lanczos3);\n resized.save("resized.jpg")?;\n println!("Nuevo tamaño: {:?}", resized.dimensions());\n Ok(())\n}\n\nSi necesita mantener las proporciones, use resize_to_fill() (rellena el área, recortando el sobrante) o resize_to_fit() (ajusta dentro de las dimensiones dadas, añadiendo espacios vacíos). Ejemplo:
// Ajustar dentro de un rectángulo de 400x400, manteniendo las proporciones\nlet fitted = img.resize_to_fit(400, 400, FilterType::CatmullRom);\nfitted.save("fitted.jpg")?;\n\n// Rellenar el rectángulo de 400x400, recortando los bordes\nlet filled = img.resize_to_fill(400, 400, FilterType::Lanczos3);\nfilled.save("filled.jpg")?;\n\nRecorte de imagen (crop)
\n\nEl recorte se realiza con el método crop(), que recibe las coordenadas de la esquina superior izquierda (x, y), así como el ancho y alto del área. Importante: las coordenadas y dimensiones no deben exceder los límites de la imagen original, de lo contrario se producirá un pánico.
Ejemplo de recorte de la parte central de tamaño 300x200:
\n\nfn crop_example() -> Result<(), Box<dyn std::error::Error>> {\n let img = open("input.jpg")?;\n let (width, height) = img.dimensions() También en la biblioteca
Planificador de tareas Swift: GCD, OperationQueue y Timer en iOS/macOS
RxSwift para Swift: guía completa con ejemplos
Trabajo con archivos ZIP en TypeScript: biblioteca JSZip y utilidades
Cast para Go: guía completa con ejemplos prácticos
Generación de PDF en Java: resumen de las bibliotecas iText, Apache PDFBox, OpenPDF