Arbeiten mit Bildern in Rust: Vom Laden bis zur Filterung
Rust ist eine moderne Systemsprache, die nicht nur in der Webentwicklung und Systemprogrammierung, sondern auch im Bereich der Multimediaverarbeitung an Popularität gewinnt. Dank seiner Leistung und Sicherheit eignet sich Rust hervorragend für Aufgaben im Zusammenhang mit Bildern. In diesem Artikel betrachten wir die wichtigsten Bibliotheken und Werkzeuge, die eine effiziente Arbeit mit Rastergrafiken ermöglichen.
Die Hauptbibliothek: image
Die Bibliothek image ist der De-facto-Standard für die Arbeit mit Bildern im Rust-Ökosystem. Sie unterstützt Dutzende von Formaten (PNG, JPEG, GIF, BMP, WebP, TIFF und andere) und bietet eine praktische API zum Laden, Verarbeiten und Speichern von Bildern.
Installation — fügen Sie in Cargo.toml hinzu:
[dependencies]image = "0.25"Laden und Speichern von Bildern
Betrachten wir die grundlegenden Operationen: Eine Datei öffnen, die Größe ändern und in einem anderen Format speichern.
use image::{DynamicImage, GenericImageView};use std::path::Path;
fn main() { // Bild laden let img = image::open("input.jpg").expect("Datei konnte nicht geöffnet werden");
// Informationen ausgeben println!("Größe: {}x{}", img.width(), img.height()); println!("Farbmodus: {:?}", img.color());
// Größe auf 200x200 ändern (unter Beibehaltung der Proportionen) let resized = img.resize(200, 200, image::imageops::FilterType::Lanczos3);
// Als PNG speichern resized.save("output.png").expect("Fehler beim Speichern");}Grundlegende Verarbeitungsoperationen
Die Bibliothek image bietet das Modul imageops mit einer Reihe vorgefertigter Filter und Transformationen.
- Drehen und Spiegeln:
use image::DynamicImage;
fn rotate_and_flip(img: &DynamicImage) { // Drehung um 90 Grad im Uhrzeigersinn let rotated = img.rotate90(); // Horizontales Spiegeln let flipped = img.fliph(); // Vertikales Spiegeln let flipped_v = img.flipv();}- Zuschneiden (crop):
fn crop_example(img: &DynamicImage) { // Rechteck zuschneiden: x=50, y=30, Breite=200, Höhe=150 let cropped = img.crop_imm(50, 30, 200, 150); cropped.save("cropped.png").unwrap();}- Helligkeit und Kontrast anpassen:
fn adjust_brightness(img: &DynamicImage) { // Helligkeit um 50 erhöhen (Wert kann negativ sein) let brighter = image::imageops::brighten(img, 50); // Kontrast erhöhen let contrasted = image::imageops::contrast(img, 1.5);}Filter und Effekte
Die Bibliothek enthält mehrere integrierte Filter. Hier sind Beispiele für die nützlichsten:
use image::imageops::FilterType;
fn apply_filters(img: &DynamicImage) { // Gaußscher Weichzeichner (sigma = 2.0) let blurred = image::imageops::blur(img, 2.0);
// Schärfung let sharpened = image::imageops::unsharpen(img, 5.0, 2);
// In Graustufen umwandeln let gray = img.grayscale();
// Schwellwertfilter anwenden (Binarisierung) let threshold = image::imageops::threshold(img, 128);
// Alle Ergebnisse speichern blurred.save("blurred.png").unwrap(); sharpened.save("sharpened.png").unwrap(); gray.save("gray.png").unwrap();}Direkte Arbeit mit Pixeln
Wenn Sie die vollständige Kontrolle über jedes Pixel benötigen, ermöglicht die Bibliothek den Zugriff auf die Rohdaten:
use image::Rgba;
fn pixel_manipulation(mut img: image::RgbaImage) { for pixel in img.pixels_mut() { // Farben invertieren pixel[0] = 255 - pixel[0]; // Rot pixel[1] = 255 - pixel[1]; Auch in der Bibliothek
Testen in Kotlin: Frameworks und Werkzeuge für qualitativ hochwertigen Code
Event Bus und Observer-Pattern in PHP: Implementierung und Beispiele
Juniper: Elegante GraphQL-Bibliothek in Rust für moderne Webanwendungen
Arbeiten mit Bildern in Swift: resize und crop für iOS/macOS