Traitement d'images en Rust : redimensionnement et recadrage
Rust est un langage de programmation système moderne, de plus en plus utilisé pour des tâches nécessitant des performances élevées et une grande fiabilité. Le traitement d'images ne fait pas exception. Dans cet article, nous examinerons deux opérations clés — le redimensionnement (resize) et le recadrage (crop) — en utilisant l'écosystème Rust. Les bibliothèques principales : image (chargement, sauvegarde, manipulations de base) et imageproc (traitement avancé).
Pourquoi Rust pour le travail avec les images ?
Rust offre :
- Une gestion sécurisée de la mémoire — absence de fuites et de courses de données.
- Des performances maximales — comparables à C/C++.
- Un écosystème riche — le crate
imageprend en charge les formats JPEG, PNG, GIF, BMP, WEBP et autres. - Le parallélisme — facile à mettre à l'échelle pour le traitement sur des processeurs multicœurs.
Installation des dépendances
Ajoutez dans Cargo.toml :
[dependencies]image = "0.25"imageproc = "0.25" # pour les filtres avancés (optionnel)Vérifiez les versions actuelles sur crates.io.
Chargement et sauvegarde d'une image
Commençons par un exemple de base — ouvrir un fichier et enregistrer une copie :
use image::{GenericImageView, ImageFormat};
fn main() -> Result<(), Box<dyn std::error::Error>> { // Chargeons l'image let img = image::open("input.jpg")?; // Affichons les dimensions println!("Largeur : {}, Hauteur : {}", img.width(), img.height()); // Sauvegardons dans un autre format img.save("output.png")?; Ok(())}La méthode image::open détecte automatiquement le format par l'extension ou le contenu du fichier.
Redimensionnement (resize)
La fonction resize prend les nouvelles largeur et hauteur, ainsi qu'un filtre d'interpolation. Filtres disponibles : Nearest, Triangle, CatmullRom, Gaussian, Lanczos3 et autres.
use image::{imageops::FilterType, GenericImageView};
fn resize_image(path: &str, new_width: u32, new_height: u32) -> Result<(), Box<dyn std::error::Error>> { let img = image::open(path)?; // Redimensionnons avec le filtre Lanczos3 (haute qualité) let resized = img.resize(new_width, new_height, FilterType::Lanczos3); // Sauvegardons le résultat resized.save("resized.jpg")?; println!("Taille modifiée : {}x{} → {}x{}", img.width(), img.height(), new_width, new_height); Ok(())}Conseil : Pour un traitement rapide, utilisez FilterType::Nearest (pas d'interpolation), pour une qualité maximale — Lanczos3.
Redimensionnement proportionnel
Pour conserver le rapport hauteur/largeur, utilisez resize_to_fill (remplit la zone) ou resize_to_fit (adapte au rectangle) :
use image::imageops::FilterType;
fn resize_proportional(path: &str, max_width: u32, max_height: u32) -> Result<(), Box<dyn std::error::Error>> { let img = image::open(path)?; // Adapter au rectangle (en conservant les proportions) let fitted = img.resize_to_fit(max_width, max_height, FilterType::Triangle); fitted.save("fitted.jpg")?; // Remplir la zone (recadrera l'excédent) let filled = img.resize_to_fill(max_width, max_height, FilterType::Triangle); filled.save("filled.jpg")?; Ok(())}Recadrage d'image (crop)
Le recadrage s'effectue via la méthode crop, qui prend les coordonnées du coin supérieur gauche (x, y) et les dimensions de la zone :
use image::Gener Aussi dans la bibliothèque
Géolocalisation et cartes en Go (Golang) : bibliothèques et exemples
Travailler avec XML en C# (.NET) : Guide complet pour débutants
Apprentissage automatique en C++ : aperçu des bibliothèques clés
Travailler avec les archives ZIP en C# (.NET) : guide complet