Traitement d'images en Rust : redimensionnement et recadrage avec la bibliothèque image
\n\nRust est un langage de programmation système moderne qui gagne en popularité pour les tâches nécessitant hautes performances et sécurité. L'une de ces tâches est le traitement d'images. Dans cet article, nous allons voir en détail comment redimensionner (resize) et recadrer (crop) des images en Rust à l'aide de la bibliothèque puissante et pratique image. Vous apprendrez à installer la bibliothèque, charger une image, appliquer des transformations et enregistrer le résultat.
Installation et importation de la bibliothèque image
\n\nLa bibliothèque image est la référence de facto pour le traitement d'images matricielles dans l'écosystème Rust. Elle prend en charge de nombreux formats (PNG, JPEG, GIF, BMP, WEBP et autres) et offre un large éventail de fonctions de traitement.
Pour commencer, ajoutez la dépendance dans le fichier Cargo.toml :
[dependencies]\nimage = "0.25"\n\nEnsuite, vous pouvez importer les modules nécessaires dans le code :
\n\nuse std::path::Path;\nuse image::{open, DynamicImage, GenericImageView, imageops::FilterType};\n\nChargement et enregistrement d'images
\n\nLa première étape consiste à charger une image à partir d'un fichier. La bibliothèque détecte automatiquement le format grâce à l'extension. Voici un exemple de base :
\n\nfn main() -> Result<(), Box<dyn std::error::Error>> {\n // Chargement de l'image\n let img = open("input.jpg")?;\n println!("Dimensions : {:?}", img.dimensions());\n // Enregistrement dans un autre format\n img.save("output.png")?;\n Ok(())\n}\n\nLa méthode open() retourne un DynamicImage — une énumération qui peut stocker une image dans l'un de plusieurs formats internes (RGB8, RGBA8, Gray8, etc.). La méthode dimensions() retourne un tuple (u32, u32) — la largeur et la hauteur.
Redimensionnement (resize)
\n\nLa fonction resize() prend en paramètres une nouvelle largeur, une nouvelle hauteur et un type de filtre. Le filtre influence la qualité du résultat et la vitesse d'exécution. Voici les principaux filtres :
- \n
- Nearest — rapide, mais de faible qualité (pixelisation). \n
- Lanczos3 — haute qualité, mais plus lent. \n
- CatmullRom — bon équilibre entre vitesse et qualité. \n
- Gaussian — adoucit l'image lors de la réduction. \n
Exemple de redimensionnement à 800x600 pixels :
\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!("Nouvelles dimensions : {:?}", resized.dimensions());\n Ok(())\n}\n\nSi vous souhaitez conserver les proportions, utilisez resize_to_fill() (remplit la zone en coupant les bords) ou resize_to_fit() (adapte aux dimensions données en ajoutant des marges). Exemple :
// Adapter au rectangle 400x400 en conservant les proportions\nlet fitted = img.resize_to_fit(400, 400, FilterType::CatmullRom);\nfitted.save("fitted.jpg")?;\n\n// Remplir le rectangle 400x400 en coupant les bords\nlet filled = img.resize_to_fill(400, 400, FilterType::Lanczos3);\nfilled.save("filled.jpg")?;\n\nRecadrage d'image (crop)
\n\nLe recadrage s'effectue avec la méthode crop(), qui prend les coordonnées du coin supérieur gauche (x, y), ainsi que la largeur et la hauteur de la zone. Important : les coordonnées et les dimensions ne doivent pas dépasser les limites de l'image d'origine, sinon une panique se produira.
Exemple de recadrage de la partie centrale de taille 300x200 :
\n\nfn crop_example() -> Result<(), Box<dyn std::error::Error>> {\n let img = open("input.jpg")?;\n let (width, height) = img.dimensions()