libimage et fortran

dernière mise à jour: 19 mars 2010


Attention! Le compilateur g77 du projet GNU est un produit en fin de vie. Il fonctionne correctement, mais n'est plus maintenu, et est condamné à disparaitre à plus ou moins long terme. Il devient de plus en plus difficile de compiler libimage sur les *IX modernes. Je vais donc extraire toute l'interface Fortran actuelle et en faire une archive séparée, afin de préparer la migration vers gfortran.

Pourquoi le Fortran 77 ? Bonne question... Probablement parce que le Fortran est le père de tous les langages. Surtout dans son incarnation 77, parce que après (imho) il a dégénéré et perdu de sa pureté originelle. Quoique... certains prétendent que même descendre des arbres ou quitter le F66, c'était une belle erreur :)

Après cette digression philosophique, rentrons dans les considérations techniques. RECETTE!!!. Vu du g77, et de libimage, une image est logée dans un "slot" numéroté de 1 à 42. Le slot est conservé dans une variable INTEGER sur laquelle il ne faut pas truander.
D'autre part, ymmv parce que cette interface est moins testé que la bibliothèque de base. Il est possible que les prototypes de certaines procédures changent un jour ou l'autre...

primitives

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.

input/output

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

utilitaires

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

effets

Je ne vais pas m'étendre sur les effets disponibles. Il y a plus de docs ici. 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

Générateurs de bruit

Attention, la rigueur mathématique de ces fonctions n'est pas garantie. Avant de critiquer, Utsl.

Dans le fichier funcs77.f, vous trouverez une fonction de démonstration des générateurs de bruit.

haut de page

Recopie d'images

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

Ecriture de textes

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

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é .
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

fonctions

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

cadres

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

bitplane

Mmmmm... Pas de code Fortran écrit, mais déja un peu de documentation de quelques primitives en C.

haut de page

Calculs

Certaines de ces choses devraient plutôt être vues comme des fonctions. Ce n'est pas si simple.

haut de page

Patterns

Mmmmm...

haut de page

exemples

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

liens