Génération procédurale d'images à l'aide de Rust-Image

Nilesh Katuwal 7 juin 2022
Génération procédurale d'images à l'aide de Rust-Image

Dans cet article, nous allons apprendre à générer des images de manière procédurale à l’aide de rust-image.

Génération procédurale d’images à l’aide de Rust-Image

Image de la caisse

Cette caisse fournit des implémentations Rust natives pour l’encodage et le décodage d’images et les fonctions fondamentales de manipulation d’images. Une documentation supplémentaire est également disponible dans le fichier README.md, consultable facilement sur GitHub.

Cette bibliothèque apporte des solutions à deux problèmes fondamentaux : une interface unifiée pour les encodages d’images et des tampons génériques simples pour leur contenu. Chaque fonctionnalité est utilisable indépendamment des autres.

L’accent est mis sur un petit ensemble stable d’opérations quotidiennes que des caisses spécialisées supplémentaires peuvent compléter. De plus, la bibliothèque privilégie les solutions sécurisées avec peu de dépendances.

Pour charger l’image en utilisant 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()?;

Pour enregistrer l’image :

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

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

Tampons d’image

Les deux principaux formats de stockage d’images :

  1. Image buffer qui stocke les données d’image typées statiquement.
  2. DynamicImage est une énumération sur les formats ImageBuffer pris en charge qui prennent en charge les conversions entre eux.

En plus de quelques options spécialisées :

  1. Trait GenericImage pour les tampons d’image modifiables.
  2. Trait GenericImageView pour les références GenericImage en lecture seule.
  3. Module flat contenant les types d’interopérabilité pour les matrices de canaux génériques et les interfaces étrangères.

Toutes les fonctions de traitement d’image fournies opèrent sur des types qui implémentent les caractéristiques GenericImageView et GenericImage et renvoient un ImageBuffer.. Tous les décodeurs de format d’image implémentent le trait ImageDecoder, qui offre des méthodes fondamentales pour récupérer les métadonnées d’image et décoder les images.

Certains formats proposent en plus des implémentations ImageDecoderExt qui permettent de ne décoder qu’une partie d’une image à la fois.

Les techniques de décodage les plus cruciales sont :

  1. Dimensions : renvoie un tuple avec la largeur et la hauteur de l’image.
  2. type de couleur : Renvoie le type de couleur de la sortie de données d’image par ce décodeur.
  3. image de lecture : il décode l’image entière dans un tableau d’octets.

Image dynamique

Une DynamicImage énumère tous les types ImageBuffer<P> supportés. Son type d’image précis est déterminé lors de l’exécution.

C’est le type qui est renvoyé lorsqu’une image est ouverte. DynamicImage réimplémente toutes les fonctions de traitement d’image pour plus de commodité.

Pour les pixels RGBA, DynamicImage implémente les traits GenericImageView et GenericImage.