Traitement d'images en Rust : redimensionnement et recadrage avec la bibliothèque image

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Traitement d'images en Rust : redimensionnement et recadrage avec la bibliothèque image

\n\n

Rust 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.

\n\n

Installation et importation de la bibliothèque image

\n\n

La 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.

\n\n

Pour commencer, ajoutez la dépendance dans le fichier Cargo.toml :

\n\n
[dependencies]\nimage = "0.25"
\n\n

Ensuite, vous pouvez importer les modules nécessaires dans le code :

\n\n
use std::path::Path;\nuse image::{open, DynamicImage, GenericImageView, imageops::FilterType};
\n\n

Chargement et enregistrement d'images

\n\n

La 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\n
fn 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\n

La 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.

\n\n

Redimensionnement (resize)

\n\n

La 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\n
    \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
\n\n

Exemple de redimensionnement à 800x600 pixels :

\n\n
use 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\n

Si 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 :

\n\n
// 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\n

Recadrage d'image (crop)

\n\n

Le 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.

\n\n

Exemple de recadrage de la partie centrale de taille 300x200 :

\n\n
fn crop_example() -> Result<(), Box<dyn std::error::Error>> {\n    let img = open("input.jpg")?;\n    let (width, height) = img.dimensions()                    

Recommendations