Bildverarbeitung in Rust: resize und crop
Rust ist eine moderne systemnahe Programmiersprache, die zunehmend für Aufgaben eingesetzt wird, die hohe Leistung und Zuverlässigkeit erfordern. Die Bildverarbeitung bildet hier keine Ausnahme. In diesem Artikel betrachten wir zwei Schlüsseloperationen – Größenänderung (resize) und Zuschneiden (crop) – unter Verwendung des Rust-Ökosystems. Die wichtigsten Bibliotheken: image (Laden, Speichern, grundlegende Manipulationen) und imageproc (fortgeschrittene Verarbeitung).
Warum Rust für die Arbeit mit Bildern?
Rust bietet:
- Sichere Speicherverwaltung – keine Speicherlecks oder Datenrennen.
- Maximale Leistung – vergleichbar mit C/C++.
- Reichhaltiges Ökosystem – die Crate
imageunterstützt JPEG, PNG, GIF, BMP, WEBP und andere Formate. - Parallelität – einfache Skalierung der Verarbeitung auf Mehrkernprozessoren.
Installation der Abhängigkeiten
Fügen Sie in Cargo.toml hinzu:
[dependencies]image = "0.25"imageproc = "0.25" # für fortgeschrittene Filter (optional)Aktuelle Versionen finden Sie auf crates.io.
Laden und Speichern eines Bildes
Beginnen wir mit einem grundlegenden Beispiel – eine Datei öffnen und eine Kopie speichern:
use image::{GenericImageView, ImageFormat};
fn main() -> Result<(), Box<dyn std::error::Error>> { // Bild laden let img = image::open("input.jpg")?; // Abmessungen ausgeben println!("Breite: {}, Höhe: {}", img.width(), img.height()); // In einem anderen Format speichern img.save("output.png")?; Ok(())}Die Methode image::open erkennt das Format automatisch anhand der Dateierweiterung oder des Dateiinhalts.
Größenänderung (resize)
Die Funktion resize akzeptiert neue Breite und Höhe sowie einen Interpolationsfilter. Verfügbare Filter: Nearest, Triangle, CatmullRom, Gaussian, Lanczos3 und andere.
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)?; // Größe mit Lanczos3-Filter ändern (hohe Qualität) let resized = img.resize(new_width, new_height, FilterType::Lanczos3); // Ergebnis speichern resized.save("resized.jpg")?; println!("Größe geändert: {}x{} → {}x{}", img.width(), img.height(), new_width, new_height); Ok(())}Tipp: Für schnelle Verarbeitung verwenden Sie FilterType::Nearest (keine Interpolation), für maximale Qualität Lanczos3.
Proportionale Größenänderung
Um das Seitenverhältnis beizubehalten, verwenden Sie resize_to_fill (füllt den Bereich) oder resize_to_fit (passt in ein Rechteck ein):
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)?; // In ein Rechteck einpassen (Proportionen beibehalten) let fitted = img.resize_to_fit(max_width, max_height, FilterType::Triangle); fitted.save("fitted.jpg")?; // Bereich füllen (überschüssiges wird abgeschnitten) let filled = img.resize_to_fill(max_width, max_height, FilterType::Triangle); filled.save("filled.jpg")?; Ok(())}Bild zuschneiden (crop)
Das Zuschneiden erfolgt über die Methode crop, die die Koordinaten der oberen linken Ecke (x, y) und die Abmessungen des Bereichs akzeptiert:
use image::Gener Auch in der Bibliothek
Maschinelles Lernen mit Go: Bibliotheken für Golang (ML, neuronale Netze, NLP)
GuzzleHTTP/Promises für PHP: Komplette Anleitung mit Beispielen
Datenbankmigrationen in Go: Überblick über Tools und Praktiken
fx für Go: vollständiges Tutorial mit Beispielen