Travailler avec les images en Rust : du chargement au filtrage
Rust est un langage système moderne qui gagne en popularité non seulement dans le développement web et la programmation système, mais aussi dans le domaine du traitement multimédia. Grâce à ses performances et sa sécurité, Rust est parfaitement adapté aux tâches liées aux images. Dans cet article, nous examinerons les bibliothèques et outils clés qui permettent de travailler efficacement avec les graphiques raster.
Bibliothèque principale : image
La bibliothèque image est la norme de facto pour travailler avec les images dans l'écosystème Rust. Elle prend en charge des dizaines de formats (PNG, JPEG, GIF, BMP, WebP, TIFF et autres) et fournit une API pratique pour charger, traiter et sauvegarder des images.
Installation — ajoutez dans Cargo.toml :
[dependencies]image = "0.25"Chargement et sauvegarde d'images
Examinons les opérations de base : ouvrir un fichier, redimensionner et sauvegarder dans un autre format.
use image::{DynamicImage, GenericImageView};use std::path::Path;
fn main() { // Chargeons l'image let img = image::open("input.jpg").expect("Impossible d'ouvrir le fichier");
// Affichons les informations println!("Taille : {}x{}", img.width(), img.height()); println!("Mode couleur : {:?}", img.color());
// Redimensionnons à 200x200 (en conservant les proportions) let resized = img.resize(200, 200, image::imageops::FilterType::Lanczos3);
// Sauvegardons en PNG resized.save("output.png").expect("Erreur de sauvegarde");}Opérations de traitement principales
La bibliothèque image fournit le module imageops avec un ensemble de filtres et transformations prêts à l'emploi.
- Rotation et retournement :
use image::DynamicImage;
fn rotate_and_flip(img: &DynamicImage) { // Rotation de 90 degrés dans le sens horaire let rotated = img.rotate90(); // Retournement horizontal let flipped = img.fliph(); // Retournement vertical let flipped_v = img.flipv();}- Recadrage (crop) :
fn crop_example(img: &DynamicImage) { // Recadrons un rectangle : x=50, y=30, largeur=200, hauteur=150 let cropped = img.crop_imm(50, 30, 200, 150); cropped.save("cropped.png").unwrap();}- Modification de la luminosité et du contraste :
fn adjust_brightness(img: &DynamicImage) { // Augmentons la luminosité de 50 (la valeur peut être négative) let brighter = image::imageops::brighten(img, 50); // Augmentons le contraste let contrasted = image::imageops::contrast(img, 1.5);}Filtres et effets
La bibliothèque inclut plusieurs filtres intégrés. Voici des exemples des plus utiles :
use image::imageops::FilterType;
fn apply_filters(img: &DynamicImage) { // Flou gaussien (sigma = 2.0) let blurred = image::imageops::blur(img, 2.0);
// Accentuation de la netteté let sharpened = image::imageops::unsharpen(img, 5.0, 2);
// Conversion en niveaux de gris let gray = img.grayscale();
// Application d'un filtre de seuil (binarisation) let threshold = image::imageops::threshold(img, 128);
// Sauvegardons tous les résultats blurred.save("blurred.png").unwrap(); sharpened.save("sharpened.png").unwrap(); gray.save("gray.png").unwrap();}Travailler directement avec les pixels
Si vous avez besoin d'un contrôle total sur chaque pixel, la bibliothèque permet d'accéder aux données brutes :
use image::Rgba;
fn pixel_manipulation(mut img: image::RgbaImage) { for pixel in img.pixels_mut() { // Inversons les couleurs pixel[0] = 255 - pixel[0]; // Rouge pixel[1] = 255 - pixel[1]; Aussi dans la bibliothèque
Bibliothèque WebSocket Java : Tyrus — implémentation JSR 356 pour le temps réel
Planificateur de tâches Swift pour iOS/macOS : EventKit et DispatchSource
Paging 3 pour Kotlin : guide complet avec exemples
RxSwift pour Swift : guide complet avec exemples