libimage et fortran
dernière mise à jour: 26 juin 2022
Le FORTRAN77 est définitivement perdu, du moins la version GNU
n'est plus maintenue. Il est donc temps de passer au Fortran Moderne.
Voici la description de l'interface de l'ancien système.
Le couplage avec gfortran sera assez semblable.
- SLOT = IMG_CREATE(WIDTH, HEIGHT, 3)
- Création d'une nouvelle image de type RGB en mémoire.
- NEWSLOT = IMG_CLONE(SLOT)
- Création d'une copie en mémoire d'une image existante.
- CALL IMG_FREE(SLOT)
- Destruction d'une image. Il est convenant de ne plus utiliser son
numéro de slot après cette opération.
- CALL IMG_CLEAR(SLOT, RED, GREEN, BLUE)
- Remplissage d'une image avec les valeurs RGB entre 0 et 255.
- CALL IMG_DIMS(SLOT, WIDTH, HEIGHT)
- Récupération des dimensions d'une image.
Je vous préviens d'entrée, les problèmes de BOUTISME sont
loin d'être réglés. Donc pour le moment, ça ne marche bien QUE sur
des processeurs de type 386.
Pour les Sparcs c'est en bonne voie. A vous
d'essayer, et de me raconter ça...
- PIC = TGA_ALOAD(NOM, W, H, T)
- Chargement en mémoire de l'image 'NOM' et récupération de trois
de ses caractéristiques: largeur, hauteur et ???. La valeur retournée
par la function est le numéro de slot, à conserver précieusement.
- FOO = TGA_SAVE_N(SLOT, NUMBER)
- Sauvegarde du SLOT au format TGA sous un nom de fichier de la forme
im_nnnnn.tga. exemple: NUMBER=42 donne 'im_00042.tga'.
Le nombre de '0' de tête étant à vérifier,
utsl.
- FOO = IMG_PPM_SA(SLOT, NOM, 0)
- Enregistrement au format
portable pixmap en mode ascii. Attention,
les fichiers sont très gros. Par contre, ils sont très facile à lire
sur toutes les plateformes. fonction pas trop testée.
- FOO = IMG_TGA_SA(SLOT, NOM, 0)
- Pareil, sauf que ça sauve en TGA 24 bits non compressé... Mais la
compression est prévue. Attention, le nom de fichier ne doit pas contenir
d'espaces.
haut de page
- call img_version(flag)
- Affiche la version de la librairie sur stdout. Si le FLAG
est différent de 0, infos supplémentaires.
- call img_dumpslots(flag)
- Une liste des images actuellement déclarées. FLAG à 1 donne plus
d'informations.
haut de page
Je ne vais pas m'étendre sur les effets disponibles. Il y a plus de docs
ici où
là. Je vais juste expliquer comment les
appeler depuis g77. Il y a deux façons de proceder: appels directs (kimarch)
et utilisation d'un interpréteur de commandes (kimarchePAS).
Quelques effets expérimentaux sont arrivés en Janvier 2003. Le source de
l'interface est img77x.c et vous trouverez dedans bien plus de
détails que ce que je ne peux en donner ici.
haut de page
Attention, la rigueur mathématique de ces fonctions n'est pas
garantie. Avant de critiquer, Utsl.
- call img_grayrnd0(slot, bas, haut)
- call img_rgbrnd0(slot, bas, haut)
- call img_rgbrnd1(slot, br, bv, bb, hr, hv, hb)
- call img_grayrnd2(slot, bas, haut)
Dans le fichier funcs77.f, vous trouverez une fonction de démonstration
des générateurs de bruit.
haut de page
Attention, ces fonctions ne sont pas blindées, il y a de fortes probabilités
de coredump si les paramètres passés sont incohérents.
haut de page
Là aussi c'est un peu brouillon, j'ai rajouté ça rapidement
alors que je travaillais sur le
recuit simulé.
En fait, c'est un domaine assez vaste, et qui n'est pas trop normalisé dans
les systèmes Unix. Donc, je bricole, et je ne
construit rien de vraiment concret.
- Houba ?
- Hop !
- call img_txt_0(numimg, texte, x, y, mode)
- Le plus tortueux des paramètres, c'est mode, qui peut prendre
plusieurs valeurs non documentées.
haut de page
POVray est un ray-tracer qui
peut utiliser des height_fields, c'est à dire des matrices à deux
dimensions dont chaque élément représente une
altitude.
- img_hf_plot (img, x, y, h)
- Ecriture de l'altitude d'un point. L'altitude est un entier compris
entre 0 et 32767. Le clipping est mal géré.
- h = img_hf_height (img, x, y)
- Lecture de l'altitude d'un point. Une valeur négative indique à coup
sûr une erreur.
- img_hf_add (image, x, y, valeur)
- Ajoute valeur à l'altitude du point x,y. L'altitude résultante sera
automagiquement bornée entre 0 et 32767.
- img_hf_smooth(src, dst, k)
- Lissage d'une image. K permet de régler la force de l'action, et
c'est expliqué là.
- img_hf_noise3(img, coef, flag)
- Bruitage d'une image, proportionnellement à l'altitude. Le coef
doit être un double precision. flag n'est pas utilisé, donc
il faut mettre 0.
Pour sauvegarder un height-field généré depuis le Fortran, on utilisera
les fonctions classiques d'enregistrement
de fichiers Targa.
haut de page
- call img_mix0(numsrc1, numsrc2, numdst, float_coef)
- Mix of the two source pictures in the destination. The coefficient
is a float between 0.0 and 1.0 but you can try others
values...
haut de page
- call img_cadre(numimage, type)
-
type est un entier donnant le numéro du cadre. Pour ceux qui veulent
une correspondance, il faut chercher dans img77a.c.
haut de page
Mmmmm... Pas de code Fortran écrit, mais déja un peu de
documentation de quelques primitives en C.
haut de page
Certaines de ces choses devraient plutôt être vues comme
des fonctions. Ce n'est pas si simple.
haut de page
Mmmmm...
haut de page
Dans le tarball vous
trouverez un demo77.f et un funcs.f qui pourront vous
servir de base de départ. Mais pour voir tout de suite de quoi il
s'agit :
PROGRAM exemple
INTEGER image, IMG_CREATE
image = IMG_CREATE(200, 200, 3)
CALL IMG_CLEAR(image, 127, 127, 127)
CALL IMG_NOISE(image, image, 242)
CALL TGA_SAVE_N(image, 42)
END
Ici, vous trouverez un
début de tutoriel sur la création des Hf par programme. Rien de spécifique
au Fortran, mais des principes généraux ré-utilisables.
haut de page
- Sur la plupart des systèmes libres, on utilise le compilateur
g77. Et même sur des systèmes non
libres, d'ailleurs...
- On peut aussi écrire des
CGI avec g77.
Mais je n'ai pas encore testé une combinaison de cgi77 et libimage.
- Une alternative digne d'interet est PGPLOT pour dessiner
en Fortran. Votre g00gl3 favori
vous trouvera le lien kivabien.
- Je travaille de temps en temps sur quelques traitements de
"haut niveau" en Fortran77, c'est un peu du
code
intérimaire, puisque une migration vers gfortran est en
préparation.
- Depuis quelques jours, j'ai ouvert un
blog pour vous
raconter mon utilisation alternative de ce langage d'un autre
siècle.