#include <inrimage/flt_type.h>
pour les transformations de formats flottant.
#include <inrimage/dialog.h>
pour certains programmes de dialogue.
#include <inrimage/error.h>
pour le traitement des erreurs.
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ées 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 suivie 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.
Le format d'une image est transmis aux programmes,
dans le cas le plus général,
sous forme d'une structure de type struct nf_fmt.
Le plus souvent on n'utilise que la première partie de cette
structure, c'est-à-dire un tableau de 9 éléments de type
Fort_int (correspondant aux integer Fortran,
de longueur 64 bits sur les machines 64 bits).
La structure nf_fmt, définie dans image.h est la suivante :
struct nf_fmt { Fort_int lfmt[9]; /* format principal */ Fort_int offsets[3]; /* décalages d'origine en X,Y,Z */ Fort_int maille; /* maillage : 0=rect., 1= hexagonal */ float bias; /* constante a rajouter a chaque pixel (virg. fixe) */ float scale; /* coeff multiplicatif (virg. fixe) */ };Le fichier image.h contient diverses macros pour caractériser le tableau format, auquel on donne souvent le nom lfmt. Nous les utiliseront pour décrire ce tableau.
Nota: En langage Fortran, on utilisera lfmt(1) ... lfmt(9).
Dans le cas où on a besoin de tous les paramètres de l'image
(struct nf_fmt),
on écrira :
integer gfmt(18) float rfmt(2) equivalence (gfmt(14),rfmt(1))
Interface Fortran - C :
Certains programmes des bibliothèques Inrimage peuvent être appelés en Fortran. Tous les programmes de type Fortran peuvent être utilisés en C, si l'on respecte les règles suivantes, valables sur la plupart des systèmes :
Pour rendre le passage d'arguments plus agréable en C, on trouvera pour certains de ces programmes une version "appelable C", dont le nom commence par c_ (et sans '_' terminal, par exemple lect_ et c_lect).
Programme principal :
Il est important d'appeler inr_init (ou à la rigueur initopts)
avant toute autre fonction Inrimage (Cf inr_init(3i)
)
On traitera les options de l'application avec les fonctions Inrimage
prévues à cet effet, à savoir :
infileopt, outfileopt (Cf inr_init(3i)
) pour les noms de fichiers non précédé d'une
option, et igetopt0, igetopt0x, igetopt1, igetopt2 (ou à la
rigueur igetopt) pour les autres options (Cf igetopt(3i)
) .
Cette méthode permet notamment l'utilisation de l'application
dans KHOROS.
Si le programme principal (main) est écrit en C, il doit avoir la structure suivante (Ucmd et Udetail décrivent brièvement les arguments de l'application) :
#include <inrimage/image.h> static char Ucmd[]= "[-D] [-k nb_Ko] [-sc scale] [input | -] [output]"; static char Udetail[]= "\tblablabla"; main(argc, argv) int argc; char **argv; { char in_name[80], out_name[80]; ...... inr_init(argc,argv,"1.0-beta",Ucmd,Udetail); ..... igetopt1("-sc","%f",&scale); infileopt(in_name); outfileopt(out_name); .... return 0; }L'appel à inr_init permet d'effectuer diverses initialisations (en particulier celle du mécanisme de traitement des options par igetopt) et prend en compte les arguments -D -k -Help -help -vers (voir inr_init(3i) , igetopt(3i) ).
Dans certains cas, (quand l'édition de liens utilise certains
modules Fortran),
il peut être nécessaire d'utiliser un programme principal
en Fortran.
Dans ce cas, il suffit de transformer légèrement le programme
principal C et d'ajouter un programme Fortran très simple,
tel que celui qu'on trouve dans Inrimage
(inrimage/src/bin-src/fmain.f, inrimage/lib/libinrfort.a) :
call inifsg call fcmain stop end
#include <inrimage/image.h> static char Ucmd[]= "[-D] [-k nb_Ko] [-sc scale] [image-in | -] [image-out]"; static char Udetail[]= "\tblablabla"; fcmain_() { char in_name[80], out_name[80]; ..... inr_init(0,0,"1.0-beta",Ucmd,Udetail); ..... igetopt1("-sc","%f",&scale); infileopt(in_name); outfileopt(out_name); .... return 0; }
Accès aux images :
Dans un programme, les images ne sont désignées que par des
pointeurs vers des structures de type "struct image" (définie
dans image.h).
Pour garantir la portabilité d'une version à l'autre, il
faut considérer ces pointeurs comme des objets opaques,
et ne pas utiliser directement le contenu de la structure.
Les références aux paramètres des images se feront par
l'intermédiaire de la structure struct nf_fmt ou du
tableau de format lfmt[9],
dont les contenus
sont compatibles d'une version à l'autre.
L'ouverture d'une image se fait par la procédure image_ qui retourne un pointeur vers une structure de type struct image. C'est ce pointeur qui sera utilisé par toutes les procédures d'accès aux images.
Pour la lecture et l'écriture aux données on utilisera exclusivement les fonctions Inrimage appropriées, telles que lect et ecr en Fortran, ou c_lect et c_ecr en C (voir lect(3i) ).
outils divers :
L'allocation dynamique de tableaux est effectuée par les procédures exec et imexec (voir imexec(3i) ).
Les programmes interactifs devront soit utiliser les fonctions de dialogue Inrimage (voir liste ci-dessous), soit utiliser les fonctions d'entrée-sortie standard Unix, mais surtout ne pas mélanger les 2 en entrée.
L'impression des messages doit se faire sur stderr, et l'entrée de réponses sur stdin (d'où incompatibilité avec la lecture d'image sur stdin).
Les procédures interactives Inrimage lisent généralement "mot par mot" et acceptent comme caractère de fin de mot indifféremment espace, TAB et newline.
inr_init(3i) , fileopt(3i) , igetopt(3i) , tstopts(3i) , iusage(3i) pour l'interface utilisateur via les arguments de commande
intget(3i) , getfil(3i) , ltchai(3i) , realgt(3i) , outstr(3i) , iask(3i) , cmdget(3i) pour une interface interactive.
imexec(3i) pour la gestion de mémoire dynamique.
imerror(3i) pour le traitement des erreurs.
NOTA :
L'usage des fonctions non documentées dans ce manuel est à déconseiller.
image devrait remplacer tout autre programme d'ouverture d'image
(tels que fcentg, ficent,...).
De même, utiliser lect, ecr, lptset et non plus lectur, ecritu,
setpnt, etc.