En dehors de 2 ou 3 commandes purement interactives, toutes les commandes Inrimage
admettent 2 types d'arguments : des options (mots-clés précédés
du caractère - et suivis de 0, 1 ou 2 paramètres), et
des noms de fichiers images d'entrée ou de sortie.
L'ordre des arguments est indifférent. En contrepartie,
on ne peut grouper les options (-x -y n'est pas
équivalent à -xy), et les noms d'image
ne doivent pas commencer par un chiffre (en
cas de besoin on fera précéder le nom par ./,
par exemple ./3d-image).
La plupart des commandes peuvent
lire leurs données sur stdin et écrire sur stdout,
et sont donc utilisables en filtre, dans un pipe.
Par exemple :
so im1 im2 | ical pour vérifier l'égalité de 2 images.
sc im1 -n 2. | bi -n 1. >im2 pour faire im2=2*im1+1.
Une image est une structure de données
organisée en un certain nombre de plans
ayant tous le même nombre de lignes de longueur identique.
Les lignes sont composées d'éléments appelés pixels qui
sont des vecteurs de dimensions égales (un la plupart du temps).
Toutes les valeurs (composantes de chaque pixel) sont codées
de la même façon (par exemple en flottant, ou en virgule fixe sur 8 bits).
Les composantes des pixels sont consécutives.
Les pixels sont rangés par lignes, et les lignes d'un même plan sont
consécutives.
Le maillage peut être carré ou hexagonal (en pratique, aucun programme
ne tient compte du type de maillage).
L'origine correspond au premier point de l'image, qui est repéré
par les indices x=1, y=1, z=1.
Cette origine peut être affectée d'une translation
(rarement utilisée dans les programme).
Le codage des valeurs peut être de type flottant, virgule fixe signée ou virgule fixe non signée. En virgule fixe, toutes les données sont représentée sur le même nombre de bits (qui peut aller de 1 à 32) et ont le même exposant.
Un fichier image se compose d'un en-tête immédiatement suivi des données
rangées comme décrit plus haut. :
la composante v du pixel x de la ligne y
du plan z occupe la position
(z-1)*(ndimv*ndimx*ndimy)+(y-1)*(ndimv*ndimx)+(x-1)*ndimv+(v-1)
Dans le fichier (mais pas dans les données transférées en mémoire)
les lignes occupent toujours un nombre entier d'octets.
L'en-tête, dont la taille peut varier, mais reste multiple de 256 octets,
contient diverses informations qui caractérisent l'image.
En particulier, son format (dimensions, codage, maillage, origine)
y figure toujours.
Normalement on y trouve aussi l'histoire de l'image
(c'est-à-dire la liste des dernières commandes qui l'ont modifiée).
Ces informations sont inscrites automatiquement par
les programmes d'accès aux fichiers image.
On peut ajouter dans l'en-tête un certain nombre d'autres indications,
sous forme de texte ascii.
Par exemple, certains programmes associent de cette façon des tables couleur
à une image.
Inrimage accepte plusieurs formats d'en-tête pour les fichiers images. Ces formats sont définis par les mots-clés suivants (la première lettre doit être en majuscule) :
Les 4 formats sont acceptés en entrée, mais aucune image n'est créée avec
le format Old (le format Inr3 est accepté par les anciens programmes).
Dans tous les cas, sauf Old, la taille de l'en-tête
peut être choisie lors de la création de chaque fichier
(en multiples de 256 octets).
La fin de l'en-tête (à partir
du 129e octet pour les formats Old et Inr3, et
à partir du 77e octet pour le
format Visilog) est utilisée pour ranger
des informations ascii,
exactement de la même façon que dans le format Inrimage.
L'historique des commandes qui ont modifié une image peut être inscrit dans
son en-tête.
Il est possible de choisir le type de fichier, la taille de l'en-tête
et la quantité d'éléments d'"histoire".
Chaque paramètre est calculé en appliquant, dans
l'ordre, et jusqu'à obtention d'une valeur, les règles suivantes:
Il n'y a pas d'option pour l'historique mais une variable d'environnement IMAGE_HIST qui définit le nombre maximum des événements les plus récents à répertorier.
Les mots-clés de format, et les noms des variables d'environnement sont définis dans "inrlocal.h".
À partir de la version 4.4 de la bibliothèque libinrimage.a,
il est possible de lire des fichiers Inrimage compressés ou
des fichiers d'un autre format (GIF ou TIFF par exemple).
Avant d'ouvrir un fichier en lecture (par exemple avec image_),
on regarde si une conversion est nécessaire. Si tel est le cas,
on lance la commande appropriée (par exemple zcat pour
une image compressée), et les fonctions Inrimage récupèrent
les données dans un pipe.
L'efficacité de la version GNU de zcat rend la lecture
des images compressées peu pénalisante.
La décision de conversion est prise à partir de la terminaison
du nom de fichier et, dans certains cas, après vérification
de la présence d'une information de type "magic number".
La table de conversion comprend une partie fixe, définie dans
le code source, et une partie construite à l'exécution
à partir d'un fichier.
Ce fichier est donné par
$INR_EXTFILE, ou $HOME/.inrimage/inr_extfile,
ou $INR_HOME/etc/inr_extfile, ou
/usr/local/inrimage/etc/inr_extfile.
Chaque entrée dans ce fichier comprend une liste de terminaisons,
éventuellement des magic numbers, le nom de la commande à
exécuter suivi de 0 à 8 arguments.
On peut y trouver aussi un chemin préféré pour la commande.
Si le chemin préféré n'existe pas, on cherche dans les répertoires
La table interne contient des entrées pour les fichiers compressés
(terminaisons .Z ou .gz, avec magic number; commande
zcat, chemin préféré /usr/local/bin/zcat)
et pour les images GIF
(terminaison .gif , avec magic number; commande
gif2inr).
Les conversions définies dans le fichier utilisateur sont prises en compte
avant les conversions internes.
Une ligne commençant par # est un commentaire.
Chaque autre ligne se compose de 3 ou 4 parties séparées par
le caractère ':'.
1e partie : liste des terminaisons séparées par des ','.
2e partie : liste des magic numbers séparés par des ','.
Un magic number comporte plusieurs nombres séparés par des espaces.
Le premier nombre (décimal) est un offset dans le fichier, les autres
sont les valeurs en hexadécimal des octets magiques.
3e partie : nom de la commande, suivi éventuellement d'arguments (maximum 8).
4e partie (optionnelle) : chemin préféré pour la commande.
Exemple :
.gz, .Z : 0 1f 8b, 0 1f 9d:zcat: /usr/local/bin/zcat
.jpg, -jpg: :djpeg -inr8 -dither none
Ces options sont communes à toutes les commandes.
Options principales
Il s'agit là des options permettant de décrire le format d'une image. Elles sont utilisées chaque fois qu'il faut créer une image.
Ces différentes options subissent une vérification de cohérence et ont des valeurs par défaut qui sont :
1 pour les dimensions x,y,z,v.
f pour le type.
non signée.
1 pour -o si le type est -f, 4 si le type est -r.
1 pour -b si le type est p.
0 pour l'exposant.
Ces valeurs par défaut peuvent être modifiées par la commande utilisée si celle-ci est en mesure de déterminer certains paramètres du format.
L'ordre de précédence est :
Les 3 codages possibles sont : réel, fixe et packé.
Seul le codage réel a une réalité hardware, c'est le codage flottant de
la machine hôte.
La plupart des algorithmes sont écrits avec ce codage et
effectuent donc une conversion en flottant si nécessaire.
La conversion du flottant dans le type de la machine hôte est fait
automatiquement lors de la lecture, pour toutes les images qui connaissent
leur type de flottant, c'est-à-dire celles qui ne sont pas
au format Old.
Les types de flottant reconnus sont :
Les deux autres codages sont surtout utilisés pour le stockage.
Le codage fixe non packé (option -f) occupe un nombre entier d'octets.
Si le nombre de bits n'est pas multiple de 8 (option -b), les bits
significatifs sont cadrés à droite.
à gauche.
Le codage fixe packé occupe exactement le nombre de bits indiqué.
Dans le fichier (uniquement) chaque ligne est complétée pour occuper
un nombre entier d'octets.
Ces deux derniers codages sont de type virgule fixe, avec un point binaire
à gauche
du premier bit significatif et donnent donc des valeurs sur
l'intervalle [0.,1.] (si l'exposant est nul).
L'exposant ne s'applique qu'aux codages virgule fixe, et indique la puissance de 2
à utiliser en constante multiplicative sur chaque pixel.
La notion d'image signée ne s'applique elle aussi qu'a ces deux
codages et indique que
les valeurs sont en complément à 2
(le premier bit significatif détermine le signe).
L'intervalle est alors [-1,+1] .
options complémentaires de format
Elles permettent de définir des paramètres qui peuvent être utiles dans certains cas, mais ne sont pas toujours pris en compte par les programmes.
La plupart des commandes non interactives peuvent être utilisées en filtre,
elles lisent une image sur le standard input et produisent éventuellement
une image sur le standard output.
Par ailleurs, lorsque la commande produit une image sur le standard output,
cette image n'ayant pas d'existence physique, il faudra toujours fournir les
options de format ne pouvant être déterminées par la commande.
Dans la description des commandes, les paramètres entre [ ] peuvent être
omis, les paramètres en lettres grasses sont des mots clefs, les
paramètres en italiques sont des noms génériques.
L'ordre des paramètres d'une commande est indifférent.