Trabajo con imágenes en Rust: la biblioteca image y más

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con imágenes en Rust: desde la carga hasta el filtrado



Rust es un lenguaje de sistemas moderno que está ganando popularidad no solo en el desarrollo web y la programación de sistemas, sino también en el ámbito del procesamiento multimedia. Gracias a su rendimiento y seguridad, Rust es ideal para tareas relacionadas con imágenes. En este artículo, exploraremos las bibliotecas y herramientas clave que permiten trabajar eficientemente con gráficos rasterizados.



Biblioteca principal: image



La biblioteca image es el estándar de facto para trabajar con imágenes en el ecosistema de Rust. Soporta decenas de formatos (PNG, JPEG, GIF, BMP, WebP, TIFF y otros) y proporciona una API conveniente para cargar, procesar y guardar imágenes.



Instalación — agréguela en Cargo.toml:



[dependencies]image = "0.25"


Carga y guardado de imágenes



Veamos las operaciones básicas: abrir un archivo, cambiar su tamaño y guardarlo en otro formato.



use image::{DynamicImage, GenericImageView};use std::path::Path;

fn main() { // Cargamos la imagen let img = image::open("input.jpg").expect("No se pudo abrir el archivo");

// Mostramos información println!("Tamaño: {}x{}", img.width(), img.height()); println!("Modo de color: {:?}", img.color());

// Cambiamos el tamaño a 200x200 (manteniendo la proporción) let resized = img.resize(200, 200, image::imageops::FilterType::Lanczos3);

// Guardamos en PNG resized.save("output.png").expect("Error al guardar");}


Operaciones básicas de procesamiento



La biblioteca image proporciona el módulo imageops con un conjunto de filtros y transformaciones listos para usar.



  • Rotación y reflexión:


use image::DynamicImage;

fn rotate_and_flip(img: &DynamicImage) { // Rotación de 90 grados en sentido horario let rotated = img.rotate90(); // Reflexión horizontal let flipped = img.fliph(); // Reflexión vertical let flipped_v = img.flipv();}


  • Recorte (crop):


fn crop_example(img: &DynamicImage) {    // Recortamos un rectángulo: x=50, y=30, ancho=200, alto=150    let cropped = img.crop_imm(50, 30, 200, 150);    cropped.save("cropped.png").unwrap();}


  • Ajuste de brillo y contraste:


fn adjust_brightness(img: &DynamicImage) {    // Aumentamos el brillo en 50 (el valor puede ser negativo)    let brighter = image::imageops::brighten(img, 50);    // Aumentamos el contraste    let contrasted = image::imageops::contrast(img, 1.5);}


Filtros y efectos



La biblioteca incluye varios filtros integrados. Aquí hay ejemplos de los más útiles:



use image::imageops::FilterType;

fn apply_filters(img: &DynamicImage) { // Desenfoque gaussiano (sigma = 2.0) let blurred = image::imageops::blur(img, 2.0);

// Aumento de nitidez let sharpened = image::imageops::unsharpen(img, 5.0, 2);

// Conversión a escala de grises let gray = img.grayscale();

// Aplicación de filtro de umbral (binarización) let threshold = image::imageops::threshold(img, 128);

// Guardamos todos los resultados blurred.save("blurred.png").unwrap(); sharpened.save("sharpened.png").unwrap(); gray.save("gray.png").unwrap();}


Trabajo directo con píxeles



Si necesita un control total sobre cada píxel, la biblioteca permite acceder a los datos sin procesar:



use image::Rgba;

fn pixel_manipulation(mut img: image::RgbaImage) { for pixel in img.pixels_mut() { // Invertimos los colores pixel[0] = 255 - pixel[0]; // Red pixel[1] = 255 - pixel[1];

Recommendations