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]; También en la biblioteca
Pruebas en JavaScript (Node.js): frameworks y herramientas
Cliente OAuth para JavaScript (Node.js): descripción general y ejemplos de uso
Procesamiento de Markdown en Rust: bibliotecas, analizadores y herramientas
Bibliotecas WebSocket TypeScript: ws, Socket.IO, uWebSockets.js