Module « images » : chargement d'images

Le but de ce module est de fournir une interface simple pour charger des images et leur appliquer des traitements, sans avoir besoin de jongler directement entre les différentes bibliothèques d'images existantes. Le module fournit un objet formats qui permet de lister les formats d'images pouvant être gérés. Les formats actuellement reconnus sont :

D'autres formats (par exemple celui d'OpenCV) pourraient être ajoutés par la suite, si je trouve le courage de m'y pencher un jour (ou si je reçois un coup de main, sait-on jamais). L'objet formats agit comme un dictionnaire, chaque nom de format renvoyant une fonction qui permet de charger une image, à partir d'un texte décrivant son contenu et éventuellement d'informations de contexte.

On utilisera cependant plus souvent la fonction icon, qui prend en paramètre un format, une taille (l'image générée sera carrée), et un ensemble de descriptions d'images : cette fonction présente l'avantage de toujours renvoyer une image (celle de la première description valide qui lui est passée, où l'icône « image-missing » du thème actif à défaut), en ignorant toutes les erreurs arrivées en cours de route.

Pour plus de détails sur le fonctionnement général du module, consulter les notes sur son organisation interne, et la liste des actions reconnues. Le module fournit également deux types spécifiques qui peuvent être utilisés ailleurs dans le programme : couleur, et police de caractères. Il propose également un exécutable pour afficher des images en ligne de commande.

imgcat : des images dans le terminal

La commande imgcat fournie avec le module d'images permet d'afficher des images sur la sortie standard, en utilisant les codes d'échappement ANSI pour gérer les couleurs. Cela fonctionne plus ou moins bien selon les terminaux, qui ne gèrent pas tous les échappement ANSI correctement. La commande prend simplement en paramètres un ou plusieurs chemins décrivant l'image désirée. Si elle est lancée directement dans un terminal, elle va identifier le nombre de lignes et de colonnes de celui-ci pour mettre l'image générée à la bonne taille ; si les informations du terminal ne sont pas accessibles (lancement dans un pipe, par exemple vers less -R), l'image sera générée à sa taille par défaut.

L'algorithme par défaut utilisé par imgcat gère une transparence partielle, mais présente l'inconvénient de ne pouvoir afficher qu'un seul pixel par caractère. Comme la taille réservée pour un caractère est souvent environ deux fois plus haute que large, la hauteur de l'image est donc divisée par deux pour garder des proportions environ ordinaires. Cette manière de faire est la plus compatible, car elle n'utilise que les couleurs de premier plan.

Cependant, utiliser le paramètre « --no-alpha » (qui doit être passé en premier, avant les différents chemins) permet d'utiliser un algorithme légèrement différent, qui va utiliser également les couleurs d'arrière-plan et donc afficher deux lignes de pixels par ligne de caractères. Cette méthode étant incompatible avec la transparence, celle-ci est simplement ignorée. Ce mode de fonctionnement semble par ailleurs un peu moins reconnu (chez moi par exemple, les couleurs d'arrière-plan ne marchent pas dans un TTY, faisant apparaitre des bandes noires sur l'image. Cela marche en revanche sans problème dans un Xterm ou dans le terminal d'Xfce.)

Lancée directement dans un terminal, sans pipe, la commande attend une validation (appuyez simplement sur la touche de retour à la ligne) après l'affichage de chaque image pour passer à l'image suivante ou rendre la main au programme appelant. Cela n'a bien sûr pas lieu dans un pipe. Notez par ailleurs que certaines icônes de « trucs » peuvent apparaître « cassées » quand elles sont affichées de cette manière, car elles sont prévue pour des images carrées, et qu'un terminal l'est rarement. Par exemple, pour l'icône d'horloge, le cercle et les aiguilles ne sont pas superposées. Néanmoins, pour afficher d'autres images, cet outil est quand même assez efficace.