Bilder mit Rust-Image prozedural generieren

Nilesh Katuwal 7 Juni 2022
Bilder mit Rust-Image prozedural generieren

In diesem Artikel erfahren wir, wie Bilder mithilfe von rust-image prozedural generiert werden.

Bilder mit Rust-Image prozedural generieren

Kistenbild

Diese Kiste bietet native Rust-Implementierungen für die Bildcodierung und -decodierung sowie grundlegende Bildbearbeitungsfunktionen. Zusätzliche Dokumentation ist auch in der Datei README.md verfügbar, die bequem auf GitHub eingesehen werden kann.

Diese Bibliothek bietet Lösungen für zwei grundlegende Probleme: eine einheitliche Schnittstelle für Bildcodierungen und einfache generische Puffer für deren Inhalt. Jede Funktion ist unabhängig von den anderen nutzbar.

Der Fokus liegt auf einem kleinen, stabilen Satz alltäglicher Operationen, die durch zusätzliche spezialisierte Kisten ergänzt werden können. Darüber hinaus bevorzugt die Bibliothek sichere Lösungen mit wenigen Abhängigkeiten.

So laden Sie ein Bild mit io::Reader:

use std::io::Cursor;
use image::io::Reader as ImageReader;

let img_one = ImageReader::open("imagetest.png")?.decode()?;
let img_two = ImageReader::new(Cursor::new(bytes)).with_guessed_format()?.decode()?;

So speichern Sie das Bild:

img.save("theimage.jpg")?;

let mut bytes: Vec<u8> = Vec::new();
img2.write_to(&mut Cursor::new(&mut bytes), image::ImageOutputFormat::Png)?;

Bildpuffer

Die beiden primären Bildspeicherformate:

  1. Image buffer, der statisch typisierte Bilddaten speichert.
  2. DynamicImage ist eine Aufzählung der unterstützten ImageBuffer-Formate, die Konvertierungen zwischen ihnen unterstützen.

Zusätzlich zu einigen spezialisierten Optionen:

  1. GenericImage - Merkmal für veränderliche Bildpuffer.
  2. Merkmal GenericImageView für schreibgeschützte GenericImage-Referenzen.
  3. flat Modul, das Interoperabilitätstypen für generische Kanalmatrizen und fremde Schnittstellen enthält.

Alle bereitgestellten Bildverarbeitungsfunktionen arbeiten mit Typen, die die Eigenschaften GenericImageView und GenericImage implementieren und einen ImageBuffer zurückgeben. Alle Bildformat-Decoder implementieren die Eigenschaft ImageDecoder, die grundlegende Methoden zum Abrufen von Bildmetadaten und zum Decodieren von Bildern bietet.

Einige Formate bieten zusätzlich ImageDecoderExt-Implementierungen an, die es ermöglichen, jeweils nur einen Teil eines Bildes zu decodieren.

Die wichtigsten Dekodierungstechniken sind:

  1. Abmessungen: Gibt ein Tupel mit der Breite und Höhe des Bildes zurück.
  2. Farbtyp: Gibt den Farbtyp der von diesem Decoder ausgegebenen Bilddaten zurück.
  3. Bild lesen: Es dekodiert das gesamte Bild in ein Byte-Array.

Dynamisches Bild

Ein DynamicImage listet alle unterstützten ImageBuffer<P>-Typen auf. Sein genauer Bildtyp wird während der Ausführung bestimmt.

Es ist der Typ, der zurückgegeben wird, wenn ein Bild geöffnet wird. DynamicImage implementiert alle Bildverarbeitungsfunktionen der Einfachheit halber neu.

Für RGBA-Pixel implementiert DynamicImage die Traits GenericImageView und GenericImage.