Bildverarbeitung in Rust: resize und crop mit image und imageproc

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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 image unterstü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                    

Empfehlungen