hop, le premier bug
This commit is contained in:
parent
fc17a4c260
commit
e795f8a5bf
321
Doc/image77.html
Normal file
321
Doc/image77.html
Normal file
@ -0,0 +1,321 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: la doc de l'interface Fortran</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, image77, Boudet, Fortran, F77, g77">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage et fortran</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 26 juin 2022</tt><br>
|
||||||
|
</p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
Le FORTRAN77 est définitivement perdu, du moins la version <i>GNU</i>
|
||||||
|
n'est plus maintenue. Il est donc temps de passer au Fortran Moderne.
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p class=explique">
|
||||||
|
Voici la description de l'interface de l'ancien système.
|
||||||
|
Le couplage avec <tt>gfortran</tt> sera assez semblable.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="primitives">primitives</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>SLOT = IMG_CREATE(WIDTH, HEIGHT, 3)
|
||||||
|
<dd> Création d'une nouvelle image de type RGB en mémoire.
|
||||||
|
|
||||||
|
<dt>NEWSLOT = IMG_CLONE(SLOT)
|
||||||
|
<dd> Création d'une copie en mémoire d'une image existante.
|
||||||
|
|
||||||
|
<dt>CALL IMG_FREE(SLOT)
|
||||||
|
<dd> Destruction d'une image. Il est convenant de ne plus utiliser son
|
||||||
|
<i>numéro de slot</i> après cette opération.
|
||||||
|
|
||||||
|
<dt>CALL IMG_CLEAR(SLOT, RED, GREEN, BLUE)
|
||||||
|
<dd> Remplissage d'une image avec les valeurs RGB entre 0 et 255.
|
||||||
|
|
||||||
|
<dt>CALL IMG_DIMS(SLOT, WIDTH, HEIGHT)
|
||||||
|
<dd> Récupération des dimensions d'une image.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="io">input/output</a></h2>
|
||||||
|
|
||||||
|
<p>Je vous préviens d'entrée, les problèmes de <i>BOUTISME</i> sont
|
||||||
|
loin d'être réglés. Donc pour le moment, ça ne marche bien <i>QUE</i> sur
|
||||||
|
des processeurs de type <i>386</i>.
|
||||||
|
Pour les <font color="#8080ff">Sparcs</font> c'est en bonne voie. A vous
|
||||||
|
d'essayer, et de me raconter ça...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>PIC = TGA_ALOAD(NOM, W, H, T)
|
||||||
|
<dd>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.
|
||||||
|
|
||||||
|
<dt>FOO = TGA_SAVE_N(SLOT, NUMBER)
|
||||||
|
<dd>Sauvegarde du SLOT au format TGA sous un nom de fichier de la forme
|
||||||
|
<tt>im_nnnnn.tga</tt>. <i>exemple: NUMBER=42 donne 'im_00042.tga'</i>.
|
||||||
|
Le nombre de '0' de tête étant à vérifier,
|
||||||
|
<a href="img-devel.html">utsl</a>.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>FOO = IMG_PPM_SA(SLOT, NOM, 0)
|
||||||
|
<dd> Enregistrement au format
|
||||||
|
<a href="img-fichiers.html#pnm">portable pixmap</a> en mode ascii. Attention,
|
||||||
|
les fichiers sont <i>très</i> gros. Par contre, ils sont très facile à lire
|
||||||
|
sur toutes les plateformes. <font color="red">fonction pas trop testée</font>.
|
||||||
|
|
||||||
|
<dt>FOO = IMG_TGA_SA(SLOT, NOM, 0)
|
||||||
|
<dd> 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.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="utilitaires">utilitaires</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>call img_version(flag)<br>
|
||||||
|
<dd>Affiche la version de la librairie sur <i>stdout</i>. Si le <small>FLAG</small>
|
||||||
|
est différent de 0, infos supplémentaires.
|
||||||
|
|
||||||
|
<dt>call img_dumpslots(flag)<br>
|
||||||
|
<dd>Une liste des images actuellement déclarées. <small>FLAG</small> à 1 donne plus
|
||||||
|
d'informations.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="effets">effets</a></h2>
|
||||||
|
|
||||||
|
<p>Je ne vais pas m'étendre sur les effets disponibles. Il y a plus de docs
|
||||||
|
<a href="img-effets.html">ici</a> où
|
||||||
|
<a href="img-effets.html#effets2">là</a>. 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).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Quelques effets expérimentaux sont arrivés en Janvier 2003. Le source de
|
||||||
|
l'interface est <tt>img77x.c</tt> et vous trouverez dedans bien plus de
|
||||||
|
détails que ce que je ne peux en donner ici.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="bruits">Générateurs de bruit</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Attention, la rigueur mathématique de ces fonctions <b>n</b>'est <b>pas</b>
|
||||||
|
garantie. Avant de critiquer, <a href="img-devel.html#utsl">Utsl</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><tt>call img_grayrnd0(slot, bas, haut)</tt>
|
||||||
|
<li><tt>call img_rgbrnd0(slot, bas, haut)</tt>
|
||||||
|
<li><tt>call img_rgbrnd1(slot, br, bv, bb, hr, hv, hb)</tt>
|
||||||
|
<li><tt>call img_grayrnd2(slot, bas, haut)</tt>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Dans le fichier <tt>funcs77.f</tt>, vous trouverez une fonction de démonstration
|
||||||
|
des générateurs de bruit.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="recopies">Recopie d'images</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Attention, ces fonctions ne sont pas blindées, il y a de fortes probabilités
|
||||||
|
de <i>coredump</i> si les paramètres passés sont incohérents.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="textes">Ecriture de textes</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Là aussi c'est un peu brouillon, j'ai rajouté ça rapidement
|
||||||
|
alors que je travaillais sur le
|
||||||
|
<a href="http://tontonth.free.fr/recuit/cuisson-fmbl.html">recuit simulé</a>.
|
||||||
|
En fait, c'est un domaine assez vaste, et qui n'est pas trop normalisé dans
|
||||||
|
les systèmes Unix. Donc, je <a href="img-texte.html">bricole</a>, et je ne
|
||||||
|
construit rien de vraiment concret.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>Houba ? <dd>Hop !
|
||||||
|
|
||||||
|
<dt>call img_txt_0(numimg, texte, x, y, mode)
|
||||||
|
<dd>Le plus tortueux des paramètres, c'est <tt>mode</tt>, qui peut prendre
|
||||||
|
plusieurs valeurs non documentées.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="povray">POVray</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="http://www.povray.org/">POVray</a> est un <i>ray-tracer</i> qui
|
||||||
|
peut utiliser des <i>height_fields</i>, c'est à dire des matrices à deux
|
||||||
|
dimensions dont chaque élément <a href="img-povhf15.html">représente</a> une
|
||||||
|
altitude.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>img_hf_plot (img, x, y, h)
|
||||||
|
<dd>Ecriture de l'altitude d'un point. L'altitude est un entier compris
|
||||||
|
entre 0 et 32767. Le clipping est mal géré.
|
||||||
|
<dt>h = img_hf_height (img, x, y)
|
||||||
|
<dd>Lecture de l'altitude d'un point. Une valeur négative indique à coup
|
||||||
|
sûr une erreur.
|
||||||
|
<dt>img_hf_add (image, x, y, valeur)
|
||||||
|
<dd>Ajoute <tt>valeur</tt> à l'altitude du point x,y. L'altitude résultante sera
|
||||||
|
automagiquement bornée entre 0 et 32767.
|
||||||
|
<dt>img_hf_smooth(src, dst, k)
|
||||||
|
<dd>Lissage d'une image. <tt>K</tt> permet de régler la force de l'action, et
|
||||||
|
c'est expliqué <a href="img-povhf15.html#traitements">là</a>.
|
||||||
|
<dt>img_hf_noise3(img, coef, flag)
|
||||||
|
<dd>Bruitage d'une image, proportionnellement à l'altitude. Le <tt>coef</tt>
|
||||||
|
doit être un <i>double precision</i>. <tt>flag</tt> n'est pas utilisé, donc
|
||||||
|
il faut mettre 0.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pour sauvegarder un height-field généré depuis le Fortran, on utilisera
|
||||||
|
les fonctions <a href="#io">classiques</a> d'enregistrement
|
||||||
|
de fichiers Targa.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="fonctions">fonctions</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>call img_mix0(numsrc1, numsrc2, numdst, float_coef)
|
||||||
|
<dd>Mix of the two source pictures in the destination. The coefficient
|
||||||
|
is a <tt>float</tt> between 0.0 and 1.0 but you can try others
|
||||||
|
values...
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="cadres">cadres</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>call img_cadre(numimage, type)
|
||||||
|
<dd>
|
||||||
|
<i>type</i> est un entier donnant le numéro du cadre. Pour ceux qui veulent
|
||||||
|
une correspondance, il faut chercher dans <tt>img77a.c</tt>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="bitplane">bitplane</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Mmmmm... Pas de code Fortran écrit, mais déja un peu de
|
||||||
|
<a href="img-bitplane.html">documentation</a> de quelques primitives en C.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="calculs">Calculs</a></h2>
|
||||||
|
|
||||||
|
<p>Certaines de ces choses devraient plutôt être vues comme
|
||||||
|
des <a href="#fonctions">fonctions</a>. Ce n'est pas si simple.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="patterns">Patterns</a></h2>
|
||||||
|
|
||||||
|
<a href="img-patterns.html">Mmmmm</a>...
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="exemples">exemples</a></h2>
|
||||||
|
|
||||||
|
<p> Dans le <a href="libimage.tar.gz">tarball</a> vous
|
||||||
|
trouverez un <tt>demo77.f</tt> et un <tt>funcs.f</tt> qui pourront vous
|
||||||
|
servir de base de départ. Mais pour voir tout de suite de quoi il
|
||||||
|
s'agit : </p>
|
||||||
|
|
||||||
|
<pre class="code">
|
||||||
|
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
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="http://tontonth.free.fr/pov/hf/">Ici</a>, 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.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Sur la plupart des systèmes libres, on utilise le compilateur
|
||||||
|
<a href="http://gcc.gnu.org/">g77</a>. Et même sur des systèmes <i>non</i>
|
||||||
|
libres, d'ailleurs...</li>
|
||||||
|
|
||||||
|
<li>On peut aussi écrire des
|
||||||
|
<a href="http://krabulator.free.fr/devel/cgi77.html">CGI</a> avec g77.
|
||||||
|
Mais je n'ai pas encore testé une combinaison de cgi77 et libimage. </li>
|
||||||
|
|
||||||
|
<li>Une alternative digne d'interet est <b>PGPLOT</b> pour dessiner
|
||||||
|
en Fortran. Votre <a href="http://www.google.com/">g00gl3</a> favori
|
||||||
|
vous trouvera le lien kivabien.</li>
|
||||||
|
|
||||||
|
<li>Je travaille de temps en temps sur quelques traitements de
|
||||||
|
"haut niveau" en Fortran77, c'est un peu du
|
||||||
|
<a href="http://tboudet.free.fr/libimage/imagerie77.tar.gz">code</a>
|
||||||
|
intérimaire, puisque une migration vers <b>gfortran</b> est en
|
||||||
|
préparation.
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>Depuis quelques jours, j'ai ouvert un
|
||||||
|
<a href="http://fortran.morefun.over-blog.com/">blog</a> pour vous
|
||||||
|
raconter mon utilisation <i>alternative</i> de ce langage d'un autre
|
||||||
|
siècle.</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est sur carte perforée, je patche à donf.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
94
Doc/img-alpha.html
Normal file
94
Doc/img-alpha.html
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: le canal alpha</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, alpha, transparency, alpha mask, alphachannel">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / le canal alpha</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 25 octobre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
[<a href="img-devel.html#contribuer">contribuer</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A vrai dire, je suis un peu désolé de vous proposer une page ouaibe
|
||||||
|
dont le contenu est presque totalement absent. Il faut avouer que
|
||||||
|
l'écriture de cette doc devient de plus en plus bordélique. Et je
|
||||||
|
n'ose pas imaginer le foutoir que ça va être quand je vais vouloir
|
||||||
|
faire une traduction en anglais :)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Le deuxieme problême, et sûrement le plus grave, c'est que je n'ai jamais
|
||||||
|
été fixé sur la signification d'un octet <i>alpha</i>: la valeur 255
|
||||||
|
est-elle transparence absolue, ou pas de transparence du tout ?
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_add_alpha_channel(Image_Desc *img, int value);
|
||||||
|
<dd>Rajoute un plan 'alpha' non initialisé a une image de type RGB. Retourne
|
||||||
|
le <a href="img-devel.html#return">code d'erreur</a> VERY_STRANGE si il y a
|
||||||
|
déja un canal alpha.
|
||||||
|
|
||||||
|
<dt>int Image_kill_alpha_channel(Image_Desc *img);
|
||||||
|
<dd>Détruit un éventuel canal 'alpha' ou retourne VERY_STRANGE en cas de
|
||||||
|
doute ou d'incertitude.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int Image_RGBA_over_RGB(Image_Desc *rgba, Image_Desc *src,
|
||||||
|
Image_Desc *dst);
|
||||||
|
<dd>Pour voir cette fonction en service, vous devez aller fouiller dans les
|
||||||
|
sources de <i>Debian vs. eEmpire</i>, plus précisement dans <i>finisher.c</i>.
|
||||||
|
|
||||||
|
<dt>int Image_alpha_op_0(Image_Desc *src, Image_Desc *dst, int v1, int v2,
|
||||||
|
int rb, int rt, int gb, int gt, int bb, int bt,
|
||||||
|
int param);
|
||||||
|
<dd>given two levels by RGB component, this func build an alpha
|
||||||
|
binary mask where pixels in the 3 RGB intervals have the v1
|
||||||
|
alpha value, and all others have the v2 alpha value.<br>
|
||||||
|
C'est clair, non ?
|
||||||
|
|
||||||
|
<dt>Image_alpha_reduce(Image_Desc *src, Image_Dest *dst, int yo);
|
||||||
|
<dd>Pour chaque pixel, les valeurs r, g et b sont mises à l'échelle par
|
||||||
|
la valeur alpha du pixel.
|
||||||
|
|
||||||
|
<dt>int Image_poke_alpha_from_rgb(Image_Desc *src, Image_Desc *dst,
|
||||||
|
int fr, int fg, int fb, int flag);
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Vous constaterez, à la lecture des lignes précédentes, que je ne sais
|
||||||
|
pas encore bien gérer la transparence.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<tt><b>TROLL</b>: pour l'Alpha, le mieux, c'est
|
||||||
|
<a href="http://www.digital.com/">DEC</a></tt>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter
|
||||||
|
<a href="http://tboudet.free.fr/cv.html">par là</a><br>
|
||||||
|
Votre demande est transparente: je pense avant de coder.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
70
Doc/img-asciiart.html
Normal file
70
Doc/img-asciiart.html
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: AsciiArt p0w4</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, ascii-art, operations">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / AsciiArt p0w4</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 4 novembre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-texte.html">textes</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="explique">
|
||||||
|
Attention, ceci est un <i>work in progress</i>. L'interface de certaines
|
||||||
|
fonctions n'est pas encore stabilisée. On peut même dire que ce n'est
|
||||||
|
pas utilisable.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pour les curieux, il y a quand même un programme de test: <tt>t_ascii.c</tt>
|
||||||
|
dans le <a href="libimage.tar.gz">tarball</a> qui contient quelques
|
||||||
|
informations. Il convient également de rappeler que les résultats que
|
||||||
|
vous obtiendrez sont <b>très</b> dépendants de l'image d'origine.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<a name="levels"><h2>ascii</h2></a>
|
||||||
|
|
||||||
|
<p>Dans cette série de fonctions, nous allons voir des horreurs qui ne
|
||||||
|
marchent pas très bien. En général, là, nous allons travailler sur des
|
||||||
|
niveaux de gris et/ou de couleur. Et comme les trucs que je fait sont
|
||||||
|
vraiment nuls, vous devriez plutôt essayer la <tt>libcaca</tt> du
|
||||||
|
génial <a href="http://sam.zoy.org/">Sam</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_ascii_0(Image_Desc *src, char *fname, int largeur);
|
||||||
|
<dd>
|
||||||
|
<dt>int Image_ascii_1(Image_Desc *src, char *nom, int width, char *cars);
|
||||||
|
<dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<a name="contours"><h2>ascii art</h2></a>
|
||||||
|
|
||||||
|
<p>Dans cette série de fonctions, nous allons voir des horreurs qui ne
|
||||||
|
marchent pas très bien. En général, là, nous allons travailler sur
|
||||||
|
des contours, des images binaires.
|
||||||
|
</p>
|
||||||
|
<dl class="proto">
|
||||||
|
<dt> int Image_asciiart_1(Image_Desc *src, char *pattern, int reverse);
|
||||||
|
<dd>Oups, mais cette fonction semble fonctionner :)<br>
|
||||||
|
Le paramètre pattern est une chaine de caractères du genre
|
||||||
|
<tt>& .o*O&</tt> qui va représenter les différents niveaux de gris.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
<b>tTh</b>, newbie en ascii-art depuis 1982<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
108
Doc/img-bitplane.html
Normal file
108
Doc/img-bitplane.html
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les plans de bits</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, dinorama, plans de bits">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>libimage: les plans de bits</h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 5 avril 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Une image que j'appelle parfois <i>bitplane</i>, parfois <i>plan de bits</i>,
|
||||||
|
est une image binaire, c'est-à-dire que chaque pixel est représenté par un
|
||||||
|
seul bit, qui ne peut prendre que deux valeurs: 0 ou 1. Pour chacune de ces
|
||||||
|
deux valeurs, une teinte <i>rgb8</i> est associée, et ces deux teintes seront
|
||||||
|
utilisables par les routines de sauvegarde de ces images.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Pour les curieu^geeks, voici (au 20 mars 2010) ce qu'est en gros un
|
||||||
|
descripteur de bitplane, sous réserve de modifications puiqu'il faut
|
||||||
|
considérer ça comme une structure <i>opaque</i> :
|
||||||
|
</p>
|
||||||
|
<pre>
|
||||||
|
typedef struct {
|
||||||
|
unsigned int magic;
|
||||||
|
int width, height; /* are negative allowed ? */
|
||||||
|
int id;
|
||||||
|
U_BYTE r0, g0, b0, r1, g1, b1;
|
||||||
|
char name[IMG_OBJNAME_LEN+2];
|
||||||
|
int tabname; /* explain this field, please */
|
||||||
|
unsigned long *plane;
|
||||||
|
int reserved;
|
||||||
|
} A_BitPlane;
|
||||||
|
|
||||||
|
#define MAGIC_BIT_PLANE 0xb142ae17 /* XXX value not fixed */
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Il est possible qu'il existe des contraintes sur les dimensions
|
||||||
|
du bitplane. Utsl.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="creation">creation</a></h2>
|
||||||
|
|
||||||
|
<p>La création sera simple : d'abord, on demande au truc un bitmap, et,
|
||||||
|
si on en obtient un, on ajuste éventuellement les divers paramètres entrevus
|
||||||
|
plus haut. Il peut y avoir des cas où le système refuse.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>A_BitPlane * Image_give_me_a_BP(int width, int height);
|
||||||
|
<dd>Demande la fourniture d'un bitplane dons les dimensions sont livrées.
|
||||||
|
Les autres réglages de celui-ci sont positionnés à des valeurs par défaut
|
||||||
|
(lesquelles valeurs sont de nature <i>dddd</i>) cohérentes pour la suite
|
||||||
|
des opérations.
|
||||||
|
|
||||||
|
<dt>int Image_BP_setname(A_BitPlane *bp, char *name);
|
||||||
|
<dd>Attribue un nom (d'une longueur inférieure à <tt>IMG_OBJNAME_LEN</tt>)
|
||||||
|
à un bitplane. Ce nom pourra être éventuellement inscrit sur l'image
|
||||||
|
sauvegardée dans un <a href="img-fichiers.html#pcx">fichier</a>.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="utilisation">utilisation</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_BP_clear(A_BitPlane *bp, int bit);
|
||||||
|
<dd>Effacement, remise à <tt>bit</tt> d'une bitplane.
|
||||||
|
|
||||||
|
<dt>int Image_BP_plot(A_BitPlane *bp, int x, int y, int bit);
|
||||||
|
<dd>Positionnement d'un bit dans le bitplane. Attention, <tt>bit</tt>
|
||||||
|
doit avoir 0 ou 1 comme valeur.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="fichier">fichier</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_BP_savepcx(A_BitPlane *bp, char *filename, int flag);
|
||||||
|
<dd>Enregistrement en PCX monochrome. Ne fonctionne pas encore.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int Image_BP_to_pbm(A_BitPlane *bp, char *fname, int k);
|
||||||
|
<dd>Enregistrement en portable bit map non compressé. La relecture
|
||||||
|
est pour bientôt.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2>Et ensuite ?</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Vous en savez assez maintenant. Vous pouvez expérimenter en attendant
|
||||||
|
l'arrivée de <a href="image77.html#bitplane">l'interface Fortran</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
111
Doc/img-cadres.html
Normal file
111
Doc/img-cadres.html
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: comment faire des cadres</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, cadres, encadrement">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / comment faire des cadres</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 28 janvier 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bon, pas grand chose à dire, là sur le coup. La commande
|
||||||
|
<a href="img-outils.html#cadre">tga_cadre</a> peut vous donner quelques
|
||||||
|
explications pertinentes. Mais je vais quand même ajouter un petit message:
|
||||||
|
Je voudrais bien qu'on m'envoie d'autres sources pour tracer des cadres,
|
||||||
|
parce que je trouve que ça manque...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_cadre_A(Image_Desc *im);
|
||||||
|
<dd>Juste un cadre simple: un petit filet blanc autour de l'image.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_cracra(Image_Desc *im, int largeur, int reserved);
|
||||||
|
<dd>Une sorte de machin bizarre, qui remplace l'ancienne fonction
|
||||||
|
<tt>Image_cadre_B</tt>. le troisième paramêtre n'est pas encore
|
||||||
|
utilisé. Voir aussi <tt>Image_cadre_U</tt> pour un truc aussi <i><b>U</b>gly</i>.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_C(Image_Desc *im, int r, int g, int b, int n);
|
||||||
|
<dd>En fonction de la distance <b>n</b> du bord de l'image, un dégradé entre
|
||||||
|
la teinte (r,g,b) et la valeur du pixel.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_bruit(Image_Desc *im, int r, int g, int b, int n);
|
||||||
|
<dd>Proportionnellement à la distance <b>n</b> du bord de l'image, on choisit
|
||||||
|
randomatiquement un pixel de l'image ou un pixel(r,g,b). Il peut parfois
|
||||||
|
arriver qu'une couche randomatique supplémentaire de bruit soit rajoutée.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_E(Image_Desc *im, int r, int g, int b, int dim);
|
||||||
|
<dd>Un cadre spécialement étudié pour
|
||||||
|
<a href="http://www.blablanux.org/">blablanux</a>, donc en permanente mutation.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_pattern_0(Image_Desc *im, Image_Desc *pat, int l);
|
||||||
|
<dd>...
|
||||||
|
|
||||||
|
<dt>int Image_cadre_pattern_1(Image_Desc *im, Image_Desc *pat, int n);
|
||||||
|
<dd>...
|
||||||
|
|
||||||
|
<dt>int Image_cadre_pattern_2(Image_Desc *im, Image_Desc *pat, int n);
|
||||||
|
<dd>...
|
||||||
|
|
||||||
|
<dt>int Image_cadre2_pixx(Image_Desc *src, Image_Desc *dst, int p1, int p2);
|
||||||
|
<dd>C'est une sorte de cadre 'dendrite', mais assez discret. Avec un peu de
|
||||||
|
fractalisation, on doit
|
||||||
|
pouvoir faire beaucoup mieux. J'y travaille, mais c'est assez délicat à
|
||||||
|
faire si on ne veut pas que ça dure des heures...
|
||||||
|
|
||||||
|
<dt>int Image_cadre_f(Image_Desc *im, int a, int b);
|
||||||
|
<dd>This func is a derivative of the _original_ cadre function
|
||||||
|
named 'Image_cadre_A' and located in file 'cadres.c'
|
||||||
|
|
||||||
|
<dt>int Image_cadre_burp_0(Image_Desc *img, int p1, int p2, int gval);
|
||||||
|
<dd>Deux dégradés sur toute la largeur/hauteur de l'image. Les params
|
||||||
|
<i>p1</i> et <i>p2</i> déterminent la largeur des bandes, en horizontal et
|
||||||
|
en vertical, <i>gval</i>
|
||||||
|
donnera l'intensité de la composante verte.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_burp_2(Image_Desc *img, int sz, int pr, int pg, int pb);
|
||||||
|
<dd>Modifications chromatiques de largeur <tt>sz</tt>.
|
||||||
|
|
||||||
|
<dt>int Image_cadre_rasta_0(Image_Desc *img, int taille);
|
||||||
|
<dd>Première tentative de rastafarisation du cadre.
|
||||||
|
Le paramètre <tt>taille</tt> règle la largeur des bandes.
|
||||||
|
|
||||||
|
<dt>int Image_raz_sides(Image_Desc *im);
|
||||||
|
<dd>Hop, un petit détournement de fonction. Celle-ci met à 0 tous les
|
||||||
|
pixels du bord de l'image. Pour en savoir plus, il faut lire la doc sur les
|
||||||
|
<a href="img-filtres.html">filtres</a>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
En fait, il serait convénient que je fasse une
|
||||||
|
<a href="http://la.buvette.org/images/cadres.html">page ouaibe</a>
|
||||||
|
avec quelques exemples de ces cadres.
|
||||||
|
D'autre part, dans le <i>kit</i> d'outils associé à la libimage, il y a
|
||||||
|
un programme qui <a href="img-outils.html#cadre">encadre</a> les images.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me rencontrer sur mon
|
||||||
|
<a href="http://foo.bar.quux.over-blog.com/">blog</a> où je poste
|
||||||
|
épisodiquement des nouvelles du kluge.<br>
|
||||||
|
Si votre demande est bien cadrée, je code le truc.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
95
Doc/img-calculs.html
Normal file
95
Doc/img-calculs.html
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: la doc des calculs !</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, Targa">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / calculs</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 14 octobre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
[<a href="#luts">luts</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Cette page décrit les "calculs" que l'on peut faire
|
||||||
|
sur une image grace à la <a href="libimage.html">libimage</a>.
|
||||||
|
La frontière entre 'calculs' et
|
||||||
|
'<a href="img-operat.html">opérations</a>' est parfois assez floue...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="mesures">Mesures</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_stats_zone_0(Image_Desc *img, Image_Rect *zone,
|
||||||
|
int *pmr, int *pmg, int *pmb,
|
||||||
|
int *pdr, int *pdg, int *pdb);
|
||||||
|
<dd>calcule sur une zone la moyenne et le delta <i>max-min</i> des composantes.
|
||||||
|
Une prochaine version devrait aussi calculer un truc dans le genre de
|
||||||
|
l'écart-type.
|
||||||
|
|
||||||
|
<dt>int Image_luminance(Image_Desc *s, Image_Desc *d, int f);
|
||||||
|
<dd>On multiplie la valeur des pixels par <tt>f/255</tt>. Théoriquement,
|
||||||
|
ce <tt>f</tt> doit être entre 0 et 255. Je n'ai pas la moindre idée de
|
||||||
|
ce qui se passe avec des valeurs en dehors de ces limites. Il est hélas
|
||||||
|
aussi probable que cette fonction soit victime d'erreurs d'arrondi.
|
||||||
|
|
||||||
|
<dt>int Image_minmax_RGB(Image_Desc *img, int *res);
|
||||||
|
<dd>Calcul des extremums sur les 3 composantes de l'image.
|
||||||
|
|
||||||
|
<dt>int Image_histo_RGB(Image_Desc *im, long *hr, long *hg, long *hb);
|
||||||
|
<dd>Calcul des histogrammes sur les 3 composantes R, G et B. Les trois tables
|
||||||
|
doivent être déclarées: <tt>long hX[256];</tt> et il devrait exister une
|
||||||
|
fonction pour les convertir en histogrammes cumulés.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="luts">LUTs</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
LUT est l'acronyme classique pour 'look-up table'.
|
||||||
|
En français, on pourrait peut-être
|
||||||
|
dire 'table de translation'. Dans notre cas, elles sont surtout utilisées
|
||||||
|
pour associer une valeur numérique arbitraire à l'intensité d'une
|
||||||
|
composante d'un pixel.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_calclut_lin(int *lut, int v0, int v255);
|
||||||
|
<dd>Création d'une table linéaire de 256 valeurs:
|
||||||
|
lut[0]=v0 jusqu'à lut[255]=v255.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
D'autres calculs de <small>LUT</small>s sont en chantier, et sortiront
|
||||||
|
au grand jour probablement en 2010 (ou 2013 ? (ou 2014 ?)).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
La rubrique des liens, toujours aussi vide. Mais bon, on le sait
|
||||||
|
que c'est vide...
|
||||||
|
Rattrapez vous <a href="libimage.html#liens">ici</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
Si votre demande est NP complète, je patche quantiquement.<br>
|
||||||
|
<a href="http://tboudet.free.fr/cv.html">tTh calcule.</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
123
Doc/img-combine.html
Normal file
123
Doc/img-combine.html
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: combiner des images</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, Targa, combiner, mixage">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1 align=center>libimage / combiner des images</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 27 septembre 2018</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
[<a href="img-outils.html#combine">l'outil</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_combine_lines(Image_Desc *s1, Image_Desc *s2, Image_Desc *d,
|
||||||
|
int sy, int oy, int zak);
|
||||||
|
<small><i>ou</i> Image_combine_columns(...</small>
|
||||||
|
<dd> XXX
|
||||||
|
|
||||||
|
<dt>int Image_combine_checker(Image_Desc *s1, Image_Desc *s2,r
|
||||||
|
Image_Desc *d, int sx, int sy, int ox, int oy, int zak);
|
||||||
|
<dd> Ben, ça fait un damier...
|
||||||
|
|
||||||
|
<dt>int Image_combine_random_point(Image_Desc *s1, Image_Desc *s2,
|
||||||
|
Image_Desc *d, int yo);
|
||||||
|
<dd>On prend au (presque) hasard un point sur une des deux images. Le paramètre
|
||||||
|
<tt>yo</tt> peut varier entre 0 et 100.
|
||||||
|
|
||||||
|
<dt>int Image_combine_cercle_flou(Image_Desc *s1, Image_Desc *s2,
|
||||||
|
Image_Desc *d, int yo);
|
||||||
|
<dd> Il manque des paramètres à cette fonction pour le positionnement
|
||||||
|
du <i>cercle flou</i>, son diamètre et son intensité.
|
||||||
|
|
||||||
|
<dt>int Image_combine_diagonale(Image_Desc *s1, Image_Desc *s2,
|
||||||
|
Image_Desc *d, int yo, int p1, int p2);
|
||||||
|
<dd>Tiens, aucun des 3 paramètres n'est utilisé ? Vraiment étrange.
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int
|
||||||
|
Image_combine_minmax(Image_Desc *s1, Image_Desc *s2, Image_Desc *d, int flg);
|
||||||
|
<dd>Si flag est à 1, on utilise le maximum, sinon, on utilise le minimum, et
|
||||||
|
cela pour chacune des composantes.
|
||||||
|
|
||||||
|
<dt>int Image_mix(Image_Desc *a, Image_Desc *b, Image_Desc *c, int k);
|
||||||
|
<dd>Mélange les composantes rgb de deux images. Le coefficient va de 0 à 10000,
|
||||||
|
mais vous pouvez tenter d'autres valeurs.
|
||||||
|
|
||||||
|
<dt>int Image_mix_rgb(Image_Desc *a, Image_Desc *b, Image_Desc *c,
|
||||||
|
int kr, kg, kb);
|
||||||
|
<dd> Pareil, sauf qu'il y a un coefficient par composante.
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int
|
||||||
|
Image_combine_4img_0( Image_Desc *s1, Image_Desc *s2,
|
||||||
|
Image_Desc *s3, Image_Desc *s4,
|
||||||
|
Image_Desc *dst);
|
||||||
|
<dd>
|
||||||
|
Je ne sais pas ce que ça va faire.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_combine_Vdegrade(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst, int sens);<br>
|
||||||
|
int Image_combine_Hdegrade(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst, int sens);
|
||||||
|
<dd>Degradé horizontal ou vertical entre deux images.
|
||||||
|
Le paramètre 'sens' détermine quelle image sera à droite (en haut) du
|
||||||
|
résultat.
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_combine_if_not_black(Image_Desc *s1, Image_Desc *s2, Image_Desc *d);
|
||||||
|
</dt>
|
||||||
|
<dd>
|
||||||
|
En gros, si un pixel de <i>s2</i> n'est pas complètement noir,
|
||||||
|
il est recopié dans <i>d</i>. Sinon, on prend le pixel dans <i>s1</i>.
|
||||||
|
Une version de cette fonction avec les seuils paramétrables est
|
||||||
|
en chantier. Vous pouvez aussi aller consulter la
|
||||||
|
<a href="img-alpha.html">page</a> sur le canal alpha.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_combine_power(Image_Desc *s1, Image_Desc *s2, Image_Desc *d);
|
||||||
|
</dt><dd>
|
||||||
|
Vous pouvez essayer d'échanger les deux images sources...
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_combine_XOR(Image_Desc *s1, Image_Desc *s2, Image_Desc *d);
|
||||||
|
</dt><dd>
|
||||||
|
Vous pouvez aussi essayer d'échanger les deux images sources, mais ça
|
||||||
|
ne marche pas très bien. Vous venez de comprendre.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Naturellement, on arrive vite à inventer 42000 façons de combiner deux
|
||||||
|
images. Dans ce domaine précis, j'aimerais avoir plus d'imagination.
|
||||||
|
Hélas, ce n'est pas le cas...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
Le <a href="http://weblog.mixart-myrys.org/">blog</a> de l'auteur.
|
||||||
|
Si votre demande est accompagnée<br>d'une caisse de bon vin,
|
||||||
|
je patche à donf.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
113
Doc/img-couleurs.html
Normal file
113
Doc/img-couleurs.html
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: utilisation des couleurs</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, RGBA, palette, CMJK">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage: les couleurs.</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 12 janvier 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
[<a href="#palettes">palettes</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="couleurs">Couleurs</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_couleur_moyenne(Image_Desc *im, int *pr, int *pg, int *pb);
|
||||||
|
<dd>Calcul de la valeur moyenne de chacune des composantes RGB sur toute la
|
||||||
|
surface de l'image.
|
||||||
|
|
||||||
|
<dt>int Image_colors_2_Map(Image_Desc *s, Image_Desc *d, RGB_map *m, int mode);
|
||||||
|
<dd>"remappe" l'image source en utilisant uniquement les couleurs
|
||||||
|
contenues dans la palette. Le paramètre <tt>mode</tt> peut prendre les
|
||||||
|
valeurs 0, 1, 2, 11, 12 ou 13. Une démonstration de ces <i>remaps</i> est
|
||||||
|
<a href="http://tboudet.free.fr/libimage/">prévue</a>.
|
||||||
|
<i>Sauf que ça rame grave sa race !!!</i>
|
||||||
|
|
||||||
|
<dt>int Image_to_gray(Image_Desc *s, Image_Desc *d, int flag);
|
||||||
|
<dd>Transforme une image couleur en image en niveau de gris. L'image
|
||||||
|
'destination' est toujours une image RGB, seul le contenu est converti
|
||||||
|
en 'photo noir et blanc'. Le canal <a href="img-alpha.html">alpha</a>,
|
||||||
|
si il existe, n'est pas touché.
|
||||||
|
Si le flag est à 0, on utilise les poids adéquats (r=297 v=589 g=114),
|
||||||
|
sinon, les 3 composantes ont toutes le même poids.
|
||||||
|
|
||||||
|
<dt>int Image_to_gray_k(Image_Desc *s, Image_Desc *d, nt kr, int kg, int kb, int flag);
|
||||||
|
<dd>Identique à la fonction précédente, sauf qu'on peut spécifier les poids de
|
||||||
|
chacune des composantes. Attention aux dépassements de capacité, qui peuvent
|
||||||
|
néammoins devenir outils de création.
|
||||||
|
|
||||||
|
<dt>Image_color_shift_rgb(Image_Desc *s, Image_Desc *d, int r, int g, int b);
|
||||||
|
<dd>Rotation des 3 composantes couleurs.
|
||||||
|
|
||||||
|
<dt>int Image_apply_Map(Image_Desc *src, Image_Desc *dst, RGB_map *map);
|
||||||
|
<dd>Bon, voyons, comment expliquer ça?
|
||||||
|
|
||||||
|
<dt>int Image_gray_Map(Image_Desc *src, Image_Desc *dst, RGB_map *map);
|
||||||
|
<dd>Chaque pixel de l'image est d'abord converti en niveau de gris par
|
||||||
|
un calcul alambiqué, puis retraduit en couleurs en utilisant la palette
|
||||||
|
fournie.
|
||||||
|
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<h2><a name="palettes">Palettes</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_load_color_Map(char *file, char *name, RGB_map *where);
|
||||||
|
<dd>Les colors maps sont censees etre compatible avec celles de FRACTINT,
|
||||||
|
mais il faudrait verifier. En prime, je soupçonne un bug dans cette
|
||||||
|
fonction. Le nombre de couleurs lues est dans <tt>where->nbre</tt>, la
|
||||||
|
valeur retournée par la fonction est le code d'erreur.<br>
|
||||||
|
Les palettes sont cherchées à divers
|
||||||
|
<a href="img-devel.html#path">endroits</a>.
|
||||||
|
|
||||||
|
<dt>int Image_save_color_Map(char *file, char *name, RGB_map *map);
|
||||||
|
<dd>Les colors maps sont censées etre compatible avec celles de FRACTINT,
|
||||||
|
mais il faudrait verifier. ymmv.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int Image_make_random_Map(char *nom, RGB_map *map, int nbre);
|
||||||
|
<dd>Remplissage de la palette <i>&map</i> avec <i>nbre</i> couleurs
|
||||||
|
aléatoires.
|
||||||
|
|
||||||
|
<dt>int Image_make_222_Map(char *nom, RGB_map *map, int noise);
|
||||||
|
<dd>Fabrique une palette de 64 couleurs.
|
||||||
|
|
||||||
|
<dt>int Image_palette_3sinus(char *nom, RGB_map *ou, double pars[8]);
|
||||||
|
<dd>...
|
||||||
|
|
||||||
|
<dt>int Image_map2ppm(RGB_map *p, char *fname, char *comment);</dt>
|
||||||
|
<dd>Exportation d'une palette de couleurs dans un format utilisable
|
||||||
|
par <tt>ppmquant</tt>, qui permet de réduire le nombre de couleurs
|
||||||
|
d'une image.</dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Il existe un <a href="img-outils.html#plotmap">outil</a> pour dessiner
|
||||||
|
une de ces palettes de couleurs stockée dans un fichier.
|
||||||
|
Lequel appelle une fonction qui doit
|
||||||
|
être décrite <a href="img-plotters.html">ici</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
Si votre demande est colorée, je patche à donf.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
62
Doc/img-dessin.html
Normal file
62
Doc/img-dessin.html
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: comment dessiner ?</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et StChinian rosé">
|
||||||
|
<meta name="keywords" content="libimage, krabulator, operations">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / les dessinateurs</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 23 janvier 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-fichiers.html#ptl">points list</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_paint_rect(Image_Desc *img, Image_Rect *rect, int r, int g, int b);
|
||||||
|
<dd>peindre un rectangle est facile.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_draw_rect(Image_Desc *img, Image_Rect *rect, int r, int g, int b);
|
||||||
|
<dd>dessiner les bords d'un rectangle, c'est <i>kwol</i> aussi.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_draw_line(Image_Desc *i, int x1, int y1, int x2, int y2, RGBA *q);
|
||||||
|
<dd>Et les plus courageux d'entre vous peuvent aussi essayer de tirer
|
||||||
|
un trait sur leur passé...
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Il serait <a name="image_rect">bon</a> de rappeler ce qu'est une
|
||||||
|
structure <tt>Image_Rect</tt>. C'est simple, à la limite du rudimentaire,
|
||||||
|
et probablement pas très stable, <a href="img-devel.html">évolutions</a>
|
||||||
|
en chemin.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre class="code">
|
||||||
|
typedef struct {
|
||||||
|
int x, y;
|
||||||
|
int w, h;
|
||||||
|
long reserved;
|
||||||
|
} Image_Rect;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
|
||||||
|
<p align=center>[ <a href="http://tboudet.free.fr/cv.html">tTh dessine</a> ]</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
67
Doc/img-detect.html
Normal file
67
Doc/img-detect.html
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les detecteurs</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, krabulator, operations">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / les détecteurs</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 21 janvier 2010</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-fichiers.html#ptl">points list</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_seuil_RGB(Image_Desc *s, Image_Desc *d, int r, int g, int b);
|
||||||
|
<dd>Seuillage des trois composantes d'une image. Les pixels dans l'image de
|
||||||
|
destination auront les valeurs 0 ou 255.
|
||||||
|
|
||||||
|
<dt>int Image_AutoSeuilRGB(Image_Desc *s, Image_Desc *d);
|
||||||
|
<dd>Seuillage avec recherche automatique de l'équi-partition : c'est à dire
|
||||||
|
que j'essaye d'avoir le même nombre de pixels des deux cotés de la force.
|
||||||
|
Cette fonction n'a jamais vraiment été testée. Ymmv.
|
||||||
|
|
||||||
|
<dt>int Image_AutoSeuilGray(Image_Desc *s, Image_Desc *d, int *ps);
|
||||||
|
<dd>Seuillage sur les niveaux de gris (calculés par la formule <tt>r+g+b</tt>,
|
||||||
|
qui n'est probablement pas la meilleure), et ce, avec la même recherche de
|
||||||
|
l'équi-partition. L'image resultante est une image binaire en rgb. La valeur
|
||||||
|
retournée par <tt>*ps</tt> est le seuil calculé, compris entre 0 et 3x256,
|
||||||
|
soit <b>784</b>. <a href="img-effets.html">Ymmv</a>.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_detect_flat_gray(Image_Desc *src, Image_Desc *dst, int param, int r1);
|
||||||
|
<dd>Détection des zones où, sur un voisinage 3x3, l'ecart entre le maxi et le
|
||||||
|
mini du gris est inférieur à 'param'.
|
||||||
|
|
||||||
|
<dt>int Image_pix2ptl(Image_Desc *img, int seuil);</dt>
|
||||||
|
<dd>Voilà donc une fonction faite pour torturer <b>vraiment</b> la capacité
|
||||||
|
de votre machine à swapper... Et comme c'est un truc écrit àlc, le fichier
|
||||||
|
résultat est nommé <tt>pixels.ptl</tt> et peut être <b>très</b> gros.</dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<hr><!-- ----------------------------------------- -->
|
||||||
|
|
||||||
|
<p align=right>
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est détectante, je patche comme un gruiik.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p align=center>[ <a href="http://tboudet.free.fr/cv.html">tTh détecte</a> ]</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
280
Doc/img-devel.html
Normal file
280
Doc/img-devel.html
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les regles du programmeur</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Cuisse de Pintade à l'ail, Riz, Morgon">
|
||||||
|
<meta name="keywords" content="libimage, coding style, Boudet, tontonth">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">en vrac pour les codeurs...</a></h1>
|
||||||
|
|
||||||
|
<p align="center"><tt>dernière mise à jour: 3 janvier 2014</tt></p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="README.txt">README</a>]
|
||||||
|
[<a href="image77.html">fortran</a>]
|
||||||
|
[<a href="img-essais.html">essais</a>]
|
||||||
|
[<a href="#porting">porting</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="#bugs">bugs</a> et <a href="BUGS.txt">BUGS</a>]
|
||||||
|
[<a href="#projets">projets</a>]
|
||||||
|
[<a href="#compilation">compilation</a>]
|
||||||
|
[<a href="#types">types</a>]
|
||||||
|
[<a href="#return">return codes</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="#lacunes">les manques</a>]
|
||||||
|
[<a href="#optimize">Optimisations</a>]
|
||||||
|
[<a href="#outils">outils divers</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="utsl">Use the sources, Luke</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
La documentation n'étant jamais à jour, il faut parfois aller lire les sources
|
||||||
|
pour comprendre (parfois) le pourquoi du comment. Moi même, je n'y arrive
|
||||||
|
pas toujours. Cette page me sert d'aide mémoire, donc c'est tout en
|
||||||
|
<i>vrac</i>...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
On peut <a href="img-marquage.html">marquer</a> une image.
|
||||||
|
Il existe quelques <a href="#macros">macros</a> pour abstraire
|
||||||
|
certaines choses, mais ce n'est pas très fini.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="bugs">les bugs</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Il y en a probablement pas mal, mais dans l'ensemble, c'est assez stable.
|
||||||
|
Peut-être quand même quelques petits 'memory leak' qui trainent dans des
|
||||||
|
recoins obscurs... Exemple:
|
||||||
|
</p>
|
||||||
|
<pre class="code">
|
||||||
|
foo = Image_alloc(bla...);
|
||||||
|
Image_tripote(foo, bar);
|
||||||
|
Image_DeAllocate(foo);
|
||||||
|
free(foo); <b>/* ne pas oublier ça... */</b>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
A ce moment, les zones mémoires contenant les pixels de l'image sont rendues
|
||||||
|
au gestionnaire de mémoire, <b>mais</b> l'en-tête du descripteur d'image est
|
||||||
|
encore <i>malloc-é</i>. Il convient donc de rajouter un <tt>free(foo)</tt>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b>Xv n'affiche pas les TGA fabriqués par Libimage ?</b>
|
||||||
|
Le bug n'est pas dans libimage, mais dans Xv. D'après les spécifications
|
||||||
|
du format TGA, on peut ajouter un commentaire dans le fichier. Or, Xv
|
||||||
|
ne reconnait plus les TGA comme des TGA si ce commentaire est présent, ce
|
||||||
|
qui est le cas par défaut dans la bib. Le <i>workaround</i> est simple:
|
||||||
|
il faut ajouter <tt>Image_set_comment(img, "");</tt> avant
|
||||||
|
d'enregistrer le fichier afin d'enlever le commentaire.
|
||||||
|
Je pense même qu'il y a un truc dans le Makefile.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><b>le flag 'modified' du descripteur d'image est mal géré.</b>
|
||||||
|
Oui, en effet, il n'est parfois pas positionné par les fonctions
|
||||||
|
qui le devrait. Une revue complète de tout le code pour corriger
|
||||||
|
ce souci est programmée pour 2012.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Par contre, le fait que certaines fonctions ne semblent pas finies n'est
|
||||||
|
<i>pas</i> un bug. C'est un 'undocumented feature'. Et qu'il manque la
|
||||||
|
documentation, c'est le <i>lazzy effect</i>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="projets">les projets</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Début 2007, j'ai découvert que le compilateur <tt>g77</tt> était un
|
||||||
|
produit en fin de vie, et que les Linux récents avaient de plus en plus
|
||||||
|
tendance à préférer <tt>gfortran</tt>. Il est donc probable que
|
||||||
|
<a href="image77.html">l'interface</a> actuelle soit mise à l'écart
|
||||||
|
et remplacée par un équivalent plus moderne.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="porting">le portage</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Merci au généreur donateur d'une <i>Sun U5</i> grace auquel j'ai enfin pu
|
||||||
|
finaliser l'adaptation
|
||||||
|
du machin à une autre architecture que le trop commun <i>i386</i> sous Linux,
|
||||||
|
en l'occurence un processeur <i>UltraSparc</i>, tournant sous <i>OpenBSD 4.4</i>.
|
||||||
|
Et ça a été plus facile que je ne le pensait, les soucis de boutisme ayant
|
||||||
|
déja été réglés dans une vie antérieure. D'autre part, ça a été une bonne
|
||||||
|
occasion de nettoyer le code d'un certain nombre de warnings assez génants.
|
||||||
|
</p>
|
||||||
|
<p>Je dois d'abord préciser que la fidèle machine sur laquelle je fabrique le
|
||||||
|
kluge est une très vieille Debian (une SID d'il y a cinq ans, c'est dire
|
||||||
|
si je suis un <a href="http://dinorama.fr/">dino</a>),
|
||||||
|
et que le Gcc est également *vieux* :
|
||||||
|
<tt>gcc version 4.0.3 (Debian 4.0.3-1)</tt>. C'est un peu génant, mais
|
||||||
|
pas plus que si j'avais un Unixware 1.x :) Donc, en avant...
|
||||||
|
Voyons, dans un ordre approximatif, les problèmes que j'ai rencontré:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
|
||||||
|
<dt><tt>alloca.h</tt>
|
||||||
|
<dd>Sur la machine ancestrale citée plus haut, je suis obligé d'inclure
|
||||||
|
ce fichier si je veux utiliser la fonction alloca. Mais ce n'est pas
|
||||||
|
nécessaire dans O44/sparc64. Je n'ai pas (pour le moment) trouvé de
|
||||||
|
solution automatique. Il vous faut donc éditer à la mano le
|
||||||
|
Makefile vers la ligne 31 et commenter la ligne
|
||||||
|
<tt>CC_HACKS=-DNEED_ALLOCA_H</tt>.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>L'emplacement des <tt>.h</tt></dt>
|
||||||
|
<dd>Par flemme de chercher une autre solution, je les place systématiquement
|
||||||
|
dans <tt>/usr/local/include</tt>, et le Gcc de l'Open44 ne va pas les
|
||||||
|
chercher à cet endroit là.
|
||||||
|
Tip: <b><tt>export C_INCLUDE_PATH=/usr/local/include</tt></b>
|
||||||
|
dans le <tt>~/.profile</tt>.
|
||||||
|
</dd>
|
||||||
|
<dt>L'emplacement des <tt>.a</tt> et <tt>.so</tt>
|
||||||
|
<dd>Même Gcc, même punition. Après quelques essais rapidement désastreux avec
|
||||||
|
le <tt>ld.so.conf</tt>, une lecture plus attentive des manpages m'a conduit
|
||||||
|
à une (presque) même solution:
|
||||||
|
<b><tt>export LIBRARY_PATH=/usr/local/lib</tt></b> dans le même
|
||||||
|
<tt>~/.profile</tt>.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
<p>
|
||||||
|
Bon, j'ai gruiké ça rapidement un dimanche pluvieux, ça marche mais ça n'est
|
||||||
|
peut-être pas orthodoxe. Je vais consulter les experts en fromages pour savoir
|
||||||
|
si j'ai pris le <a href="img-outils.html#porting">bon</a> chemin.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="optimize">Optimisations</a></h2>
|
||||||
|
|
||||||
|
<p>À priori, il reste pas mal de choses à faire, surtout pour rendre les
|
||||||
|
boucles X-Y plus <i>cache-friendly</i>. Les buffers contenants les images
|
||||||
|
étant organisés en tableaux de lignes, il y a probablement quelques
|
||||||
|
<i>hit/mess</i> à grapiller. D'un autre coté, pour le moment, juste
|
||||||
|
ça marche...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="path">chemins de recherche</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bah, fatigué de devoir recopier mes fichiers .MAP de
|
||||||
|
<a href="img-couleurs.html#palettes">palette</a> à droite et à gauche,
|
||||||
|
j'ai ajouté une func qui cherche dans quelques endroits. Donc, j'essaye
|
||||||
|
en série:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> le répertoire courant.
|
||||||
|
<li> le rep dans la variable <tt>$LIBIMAGE_PATH</tt>
|
||||||
|
<li> le chemin <i>hardcoded</i>: $(DESTDIR)/share/libimage
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2><a name="compilation">compilation</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
La première chose à faire (comme d'hab) c'est d'aller lire le Makefile.
|
||||||
|
Vous y découvrirez quelques options à positionner selon vos gouts.
|
||||||
|
Et un de ces jours, je vais passer au tandem infernal automake/autoconf,
|
||||||
|
si jamais j'arrive à comprendre comment ça marche.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
En attendant, les variables à positionner pour l'install sont:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><tt>DESTDIR</tt>: /usr/local
|
||||||
|
<li><tt>HTML_DIR</tt>: /usr/local + le répertoire html recevra les pages
|
||||||
|
que vous êtes en train de lire.
|
||||||
|
<li><tt>SHARED_FILES</tt>: $(DESTDIR)/share/libimage contiendra les fichiers
|
||||||
|
de fontes et les colors maps.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A la compilation, on peut aussi utiliser quelques <tt>-DMACHIN=42</tt>
|
||||||
|
pour modifier le comportement de la bib. En phase de mise au point de la
|
||||||
|
bibliothèque, il est capital de détecter les conditions anormales: eg:
|
||||||
|
<i>plotter</i> en dehors de l'image. Donc, avec un <tt>-DABORT=1</tt>,
|
||||||
|
les conditions anormales génererons un <small>COREDUMP</small> analysable
|
||||||
|
avec gdb, si vous n'avez pas oublié de régler votre <tt>ulimit -c</tt>
|
||||||
|
à une valeur raisonnable.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><b>alloca.h</b> oui, là, il y a un léger souci. je suis en ce moment
|
||||||
|
en train de tenter d'installer ma libimage dans un OpenBSD, et je ne
|
||||||
|
sais pas quoi faire pour les <tt>alloca</tt>. (2007-12-30) investigations
|
||||||
|
en cours. Sans compter que le problème va se poser aussi avec NetBSD.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="types">type de données</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bien que tout ce fatras soit codé à la gruik, j'essaye d'introduire un peu
|
||||||
|
de rigueur dans la chose. En particulier, certains noms de paramètres de
|
||||||
|
fonctions vont être normalisés. Ce qui, en fait, ne sert à rien, parce
|
||||||
|
que c'est le codeur qu'il faudrait normaliser.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><b>pr100</b> Seuil de probabilité pour un choix randomatique. Une valeur
|
||||||
|
comprise entre 0 et 99. Exemple: le
|
||||||
|
<a href="img-povhf15.html#bruit">bruitage</a> des HFs.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Les hackeurs trouveront dans le fichier <tt>imprime.c</tt> une fonction :
|
||||||
|
<i>Image_print_sizeof_structs</i>, qui affiche les tailles des diverses
|
||||||
|
structures utilisées par les rouages internes.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="return">return codes</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Il faut regarder les <i>#define</i> dans <tt>tthimage.h</tt> et la fonction
|
||||||
|
<a href="libimage.html#messages">Image_err2str</a> dans <tt>msglib.c</tt>.
|
||||||
|
Je préfère ne rien mettre ici, parce que j'aurais la flemme de le mettre
|
||||||
|
à jour quand il faudrait le faire... En particulier pour classer les codes
|
||||||
|
d'erreur en fonction de leur gravité.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="macros">macros</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Elles sont habilement dissimulées dans le fichier <tt>tthimage.h</tt>, mais
|
||||||
|
je ne leur porte qu'une confiance limitée.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="outils">Les outils</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Deux dumpeurs de pixels dans <tt>dumppix.c</tt>. Le premier affiche des
|
||||||
|
trucs en hexadécimal, et le second en ascii. Ne m'en demandez pas plus,
|
||||||
|
je ne suis au courant de rien. Heureusement, il y a un autre
|
||||||
|
<a href="img-outils.html">package</a> qui contient quelques <i>tools</i>
|
||||||
|
assez performants.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<h2><a name="lacunes">Ce qui manque...</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Il manque plein de choses dans cette bibliothèque de fonctions, ou dans les
|
||||||
|
outils qui tournent autour. En Octobre 2003, je suis en train de travailler
|
||||||
|
sur un éditeur de fontes 16x24, mais il ne sortira que quand il sera prèt.
|
||||||
|
Nous sommes le 1er janvier 2014, et ça n'a pas avancé d'un pas.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<!-- ------------------------------------------------ -->
|
||||||
|
<p class="footer">
|
||||||
|
Bon courage à tous, et n'oubliez pas de regarder
|
||||||
|
<a href="http://la.buvette.org/cv.html">qui</a> a pondu ce kluge,
|
||||||
|
et en est presque fier...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
130
Doc/img-df3.html
Normal file
130
Doc/img-df3.html
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les df3 de povray</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, krabulator, operations">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / les df3 de povray</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 10 novembre 2013</tt><br>
|
||||||
|
<i>
|
||||||
|
<a href="http://tboudet.free.fr/libimage/img-df3.html">#</a> et
|
||||||
|
<a href="http://la.buvette.org/devel/libimage/img-df3.html">#</a>
|
||||||
|
</i>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-povhf15.html">height fields</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="explique">
|
||||||
|
The density_file pattern is a 3-D bitmap pattern that occupies a unit
|
||||||
|
cube from location <0,0,0> to <1,1,1> The data file is a raw binary
|
||||||
|
file format created for POV-Ray called df3 format. The syntax provides
|
||||||
|
for the possibility of implementing other formats in the future. This
|
||||||
|
pattern was originally created for use with halo or media but it may
|
||||||
|
be used anywhere any pattern may be used.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bon, il faut avouer que le code actuel est totalement buggué, que son
|
||||||
|
<small>API</small> est pitoyable, et que je n'y consacre pas autant
|
||||||
|
d'énergie qu'il le faudrait. Vous pouvez quand même aller
|
||||||
|
<a href="/POV/df3.html">voir</a> l'avancement des essais.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>Primitives</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
C'est toujours en cours de mise au point. Les <small>API</small> ne sont
|
||||||
|
pas encore figées.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>DensityF3Head * Image_df3_alloc(char *nom, int x, int y, int z, int b);
|
||||||
|
<dd>Création d'un objet de type <small>DF3</small>. Les trois paramètres
|
||||||
|
<tt>x, y & z</tt> sont les dimensions, <tt>b</tt> est le nombre
|
||||||
|
prévu de bytes par cellule à l'enregistrement dans un fichier. Les
|
||||||
|
divers autres attributs sont initialisés à une valeur raisonnable.
|
||||||
|
Chaque cellule est stockée dans un <i>double</i>, avec 1.0 représentant
|
||||||
|
la valeur maximum.
|
||||||
|
|
||||||
|
<dt>int Image_df3_free(DensityF3Head *ptr);
|
||||||
|
<dd>Destruction féroce d'un objet de type <small>DF3</small>. Si la valeur
|
||||||
|
de retour n'est pas nulle, c'est catastrophe.
|
||||||
|
|
||||||
|
<dt>int Image_df3_put(DensityF3Head *ptr, int x, int y, int z, double dv);</dt>
|
||||||
|
<dd>Dépose une valeur dans le machin. Retourne <small>INVALID_PARAM</small>
|
||||||
|
si les coordonnées xyz sont en dehors du cube. Devrait aussi retourner un
|
||||||
|
errcode si la valeur est en dehors des valeurs légales.</dd>
|
||||||
|
|
||||||
|
<dt>int Image_df3_get(DensityF3Head *ptr, int x, int y, int z, double *pdv);</dt>
|
||||||
|
<dd>Lecture d'une valeur dans le machin. Si en dehors du cube,
|
||||||
|
renvoie <small>INVALID_PARAM</small>.</dd>
|
||||||
|
|
||||||
|
<dt>int Image_print_DF3head(DensityF3Head *h, char *txt, int flag);
|
||||||
|
<dd>Affichage (plus ou moins) en clair d'un descripteur de DF3. Si la
|
||||||
|
valeur de retour n'est pas nulle, c'est qu'un problême a peut-être
|
||||||
|
été détecté.
|
||||||
|
|
||||||
|
<dt>int Image_df3f_get_dims(char *fname, int dims[], int display);
|
||||||
|
<dd>Lecture des dimensions d'un fichier df3. L'argument <tt>dims</tt>
|
||||||
|
doit être un <tt>int dims[3]</tt>. Si <tt>display</tt> est différent de
|
||||||
|
zéro, des trucs seront affichés.
|
||||||
|
|
||||||
|
<dt>int Image_df3_export(DensityF3Head *ptr, char *fname, int nbbytes);</dt>
|
||||||
|
<dd>Enregistrement des données dans un fichier. Si <tt>nbbytes</tt> est à
|
||||||
|
zéro, c'est la valeur donnée à la création de la structure qui sera
|
||||||
|
utilisée. Sinon, on donne 1, 2 ou 4.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2>Essais divers</h2>
|
||||||
|
|
||||||
|
<p>Attention, à ce jour (2 mars 2008), ces fonctions ne travaillent
|
||||||
|
que sur des fichiers à un octet [0..255] par cellule. On peut en
|
||||||
|
fait les classer dans la catégorie <i>bricolages divers</i> pour
|
||||||
|
se rassurer si elles ne fonctionnnent pas.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_df3_xper_0(Image_Desc *src, char * fname_df3, int k);
|
||||||
|
<dd>Tentative de fabrication d'un fichier DF3 à partir d'une image en RGB.
|
||||||
|
Le résultat n'est pas concluant, mais l'idée mérite d'être approfondie.
|
||||||
|
|
||||||
|
<dt>int Image_df3_plot_histo(char *fname_df3, char *nomtga, int flag);
|
||||||
|
<dd>Histogramme linéaire du contenu d'un fichier DF3. Utilité plus que
|
||||||
|
douteuse. Nous allons essayer da faire mieux.
|
||||||
|
|
||||||
|
<dt>int Image_df3f_2_txt(char *nomdf3, char *nomtxt);
|
||||||
|
<dd>Dump d'un fichier df3 dans un fichier texte, à priori <i>parsable</i>
|
||||||
|
par les outils Unix classiques.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_df3f_2_povinc(char *nomdf3, char *nominc, char *nomobj, int k, double dv);</dt>
|
||||||
|
<dd>C'est cette fonction qui est actuellement en cours de test dans cette
|
||||||
|
<a href="http://la.buvette.org/POV/ex/df3.html">page</a>, et les résultats
|
||||||
|
semblent prometteurs. Le paramètre <tt>k</tt> contrôle le type du machin
|
||||||
|
qui va servir à matérialiser le contenu de la cellule. Pour le moment,
|
||||||
|
il n'y a que la bouboule.
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Il existe d'autres fonctions pour traiter les types de données
|
||||||
|
qu'utilise POVray : les <a href="img-povhf15.html">champs d'altitude</a> pour
|
||||||
|
le moment.</p>
|
||||||
|
|
||||||
|
<hr noshade>
|
||||||
|
<p align=center>[ <a href="http://tboudet.free.fr/cv.html">tTh cherche</a> ]</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
82
Doc/img-dither.html
Normal file
82
Doc/img-dither.html
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les 'ditherings'</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, buv3tt3, Boudet, dither">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / les 'ditherings'</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 23 octobre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Un truc important à prendre en compte: ces fonctions réduisent avec vigueur le
|
||||||
|
nombre de couleurs dans une image. Souvent, pour chacune des composantes,
|
||||||
|
on a deux valeurs: <b>0</b> et <b>uh</b>. Pour commencer, je conseille
|
||||||
|
vivement de donner la valeur <b>255</b> à <b>uh</b>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">libimage</a>]
|
||||||
|
[<a href="#sauvegarde">sauvegarde</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_dither_Bayer_0(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être, en général, mis à 255.
|
||||||
|
|
||||||
|
<dt>int Image_dither_crude(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être, en général, mis à 255.<br>
|
||||||
|
Je ne suis pas très content de celui-ci, donc il risque de changer dans
|
||||||
|
le futur...
|
||||||
|
|
||||||
|
<dt>int Image_dither_2x2(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être, en général, mis à 255.
|
||||||
|
|
||||||
|
<dt>int Image_dither_3x3_0(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être, en général, mis à 255.
|
||||||
|
|
||||||
|
<dt>int Image_dither_3x3_1(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être, en général, mis à 255, mais d'autres valeurs
|
||||||
|
marchent bien aussi.
|
||||||
|
|
||||||
|
<dt>int Image_dither_3x3_2(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><i>cette fonction n'est pas encore codée, ni même imaginée.</i>
|
||||||
|
|
||||||
|
<dt>int Image_dither_seuil_random(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être, en général, mis à 255. Il est souvent bon d'ajuster
|
||||||
|
le contraste de l'image source pour ajuster l'image destination.
|
||||||
|
|
||||||
|
<dt>int Image_dither_simple_error(Image_Desc *s, Image_Desc *d, int uh);
|
||||||
|
<dd><b>uh</b> doit être <b>absolument</b> mis à 255. Parce que la fonction
|
||||||
|
contient un <i>bug sournois</i> que je tente de trouver...
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<h2><a name="sauvegarde">sauvegarde</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Et pour sauvegarder une image après dithering ? A vrai dire, il n'y a
|
||||||
|
rien de spécifique pour le moment. J'ai en projet l'écriture des fichiers
|
||||||
|
<a href="img-fichiers.html#pcx">Pcx</a> en 16 couleurs qui semble adapté,
|
||||||
|
mais ce n'est qu'un projet <i>:(</i>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
<a href="http://tboudet.free.fr/cv.html">seeking for a job</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
202
Doc/img-effets.html
Normal file
202
Doc/img-effets.html
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: la doc des effets !</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, tontonth, effects, Targa">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / effets</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 14 décembre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
[<a href="#effets">effets</a>]
|
||||||
|
[effets <a href="#effets2">2</a> & <a href="#effets3">3</a>]<br>
|
||||||
|
[<a href="#rgbmask">rgbmask</a>]
|
||||||
|
[<a href="#colorize">colorize</a>]
|
||||||
|
[<a href="#essais">essais</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Cette page décrit les "effets spéciaux" que l'on peut appliquer
|
||||||
|
sur une image graçe à la <a href="libimage.html">libimage</a>.
|
||||||
|
Et je suis bien d'accord, il manque des exemples. Vous pouvez en
|
||||||
|
générer rapidement quelque-uns, en faisant appel à une
|
||||||
|
<a href="img-essais.html">fonction de test</a>. Ou plus simplement
|
||||||
|
en utilisant
|
||||||
|
<a href="http://la.buvette.org/devel/libimage/img-outils.html#effects">l'outil</a>
|
||||||
|
approprié.
|
||||||
|
</p>
|
||||||
|
<h2><a name="effets">effets</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_water(Image_Desc *source, Image_Desc *but, int intensite)</b>
|
||||||
|
<dd>déplace randomatiquement les pixels comme si de l'eau était tombé
|
||||||
|
sur une aquarelle. Attention, il semble y avoir un <i>bug</i> dans
|
||||||
|
cette fonction.
|
||||||
|
|
||||||
|
<dt>int Image_noise(Image_Desc *source, Image_Desc *but, int intensite)</b>
|
||||||
|
<dd>Rajoute du bruit aléatoire absolu dans une image. Une intensité de 10
|
||||||
|
donne un effet moyen. Chaque composante est traitée séparément.
|
||||||
|
|
||||||
|
<dt>int Image_mirror(Image_Desc *src, Image_Desc *dst, int res)</b>
|
||||||
|
<dd>retourne une image rgb[a] de droite à gauche, comme dans un miroir.
|
||||||
|
|
||||||
|
<dt>int Image_upside_down(Image_Desc *src, Image_Desc *dst, int res)</b>
|
||||||
|
<dd>Renverse une image de haut en bas ou de droite à gauche. Il ne faut pas
|
||||||
|
mettre la même image en source et destination.
|
||||||
|
|
||||||
|
<dt>int Image_swap_lines(Image_Desc *src, Image_Desc * dst)<br>
|
||||||
|
int Image_swap_cols(Image_Desc *src, Image_Desc * dst)</b>
|
||||||
|
<dd>Echange des lignes (colonnes) paires et impaires de l'image.
|
||||||
|
RGB uniquement hélas...
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="effets2">effets 2</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_sinwave_1(Image_Desc *source, Image_Desc * but, double table[6])</b>
|
||||||
|
<dd>Déformation étrange d'une image. Je ne sais absolument pas ce que doit
|
||||||
|
contenir la table.
|
||||||
|
|
||||||
|
<dt>int Image_sinwave_2(Image_Desc *source, Image_Desc * but, double table[6])</b>
|
||||||
|
<dd>Déformation étrange d'une image. Je ne sais absolument pas ce que doit
|
||||||
|
contenir la table.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="effets3">effets 3</a></h2>
|
||||||
|
|
||||||
|
<p>Dans cette section, il y a des effets plus ou moins pas trop finis.
|
||||||
|
Certains d'entre eux ont été conçus pour mon (futur) logiciel de montage
|
||||||
|
de vidéos <a href="http://tontonth.free.fr/videos/">povesques</a>.
|
||||||
|
Ensuite, quand ils seront fixés, peut-être je changerais leur nom,
|
||||||
|
tout en gardant un alias dans le source <tt>effects3.c</tt>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int
|
||||||
|
Image_effect_x_0(Image_Desc *src, Image_Desc *dst, int kr, int kg, int kb)</b></dt>
|
||||||
|
<dd>Déja plus de 4 ans de mise au point, et c'est pas encore fini...</dd>
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_effect_x_1(Image_Desc *src, Image_Desc *dst)</b></dt>
|
||||||
|
<dd>Déja plus de 4 ans de mise au point, et c'est pas encore fini...</dd>
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_effect_x_3(Image_Desc *src, Image_Desc *dst, int kx, int ky, char *comp)</b></dt>
|
||||||
|
<dd>Déja plus de 4 ans de mise au point, et c'est pas encore fini...</dd>
|
||||||
|
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="rgbmask"><h2>rgbmask</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
C'est nouveau, ça vient de sortir. Le principe est simple: éliminer, sur
|
||||||
|
des critères divers, une ou deux composantes RGB de l'image, en les
|
||||||
|
remplaçant par une valeur constante.
|
||||||
|
Hélas, ces effets ont un défaut: ils survivent très mal à la compression
|
||||||
|
<a href="img-fichiers.html#jpeg">JPEG</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_rgbmask_H(Image_Desc *src, Image_Desc *dst, int gris);
|
||||||
|
<dd>Dans le sens horizontal...
|
||||||
|
<dt>int Image_rgbmask_V(Image_Desc *src, Image_Desc *dst, int gris);
|
||||||
|
<dd>Dans le sens vertival...
|
||||||
|
<dt>int Image_rgbmask_2(Image_Desc *src, Image_Desc *dst, int gris);
|
||||||
|
<dd>Bon, c'est pas mal, mais c'est quand même très dépendant des
|
||||||
|
dimensions de l'image.
|
||||||
|
<dt>int Image_rgbmask_R(Image_Desc *src, Image_Desc *dst, int gris);
|
||||||
|
<dd>Ah, celle-là semble prometteuse. En jouant sur la pondération
|
||||||
|
de l'aléa, on doit pouvoir obtenir quelques trucs sympas...
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="colorize"><h2>colorize</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
C'est nouveau, ça vient de sortir. Ce sont des expérimentations sur les
|
||||||
|
relations entre la luminosité, la couleur, et surtout la percevance des
|
||||||
|
gens face à une nouvelle vision du monde.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_BiColor_0(Image_Desc *src, Image_Desc *dst, int k)
|
||||||
|
<dd>Si c'est clair, ça devient sombre. Si c'est sombre, ça devient clair.
|
||||||
|
Vice-versa et réciproquement inclus. Le paramètre <tt>k</tt> ne sert à
|
||||||
|
rien et doit être mis à 0.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Oh, bien entendu, ces tripotages de pixels ça n'est pas au niveau de la
|
||||||
|
<a href="http://foo.buvette.org/bf/pm/">troiD</a> de
|
||||||
|
<a href="http://foo.buvette.org/bf/hf/">merde</a> faite
|
||||||
|
sous <a href="http://slackware.com/">Linux</a>, mais j'ai quand même
|
||||||
|
dans l'idée d'appliquer ces trucs à des séquences vidéo ou
|
||||||
|
des <a href="http://la.buvette.org/photos/myrys/g/">GIfs animées</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="essais"><h2>Quelques essais</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
La rubrique des trucs improbables, des tentatives avortées, des machins
|
||||||
|
pas finis. Nous allons commencer par un vieux truc : l'utilisation de
|
||||||
|
la récursion.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_call_recursion(Image_Desc *image, Image_Desc *dest, int param);
|
||||||
|
<dd>Euh, c'est une peu difficile d'expliquer ce que ça fait, mais il suffit
|
||||||
|
de savoir que certaines valeurs du paramètre sont meilleures que d'autres.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Et des fonctions dans ce genre, il y en a d'autres. Par exemple, pour obtenir
|
||||||
|
un effet assez peu similaire à la récursion, mais quand même, j'ai de la
|
||||||
|
mosaique sous le coude.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_mosaic_simple(Image_Desc *src, Image_Desc *dst);
|
||||||
|
<dd>Comme le nom l'indique clairement, c'est un truc simple.
|
||||||
|
<dt>int Image_mosaic_0(Image_Desc *src, Image_Desc *dst, int sx, int sy, int flg);
|
||||||
|
<dd>Comme le montre clairement le prototype, il y a des paramètres.
|
||||||
|
<tt>sx</tt> et <tt>sy</tt> sont les dimensions des pavés (il parait qu'il faut
|
||||||
|
dire "tuiles" maintenant) que l'on va examiner et traiter. Quand à
|
||||||
|
<tt>flg</tt>, je pense qu'il ne sert à rien, et qu'il faut mettre 0.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
La classique rubrique des liens, toujours aussi vide.
|
||||||
|
Rattrapez vous <a href="libimage.html#liens">ici</a> ou
|
||||||
|
<a href="img-television.html">là</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter sur mon
|
||||||
|
<a href="http://foo.bar.quux.over-blog.com/">blog</a><br>
|
||||||
|
Si votre demande est effective, je patche avec de la poudre verte.<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
82
Doc/img-essais.html
Normal file
82
Doc/img-essais.html
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les essais</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, tontonth, essais">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / les essais</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 20 janvier 2010</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-devel.html">devel</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Vu la mauvaise qualité de la documentation, il est parfois difficile
|
||||||
|
de comprendre à quoi sert une fonction précise. Il y a donc une collection
|
||||||
|
de fonctions permettant d'essayer à peu près simplement quelques trucs.
|
||||||
|
C'est <b><tt>essais.c</tt></b> que vous trouverez dans
|
||||||
|
l'<a href="libimage.tar.gz">archive</a>.
|
||||||
|
En théorie, il y a des explications dans <b><tt>essais.h</tt></b> à
|
||||||
|
consulter de préférence à cette page ouaibe, car les prototypes de
|
||||||
|
ces fonctions d'essayage changent de temps à autre. En un mot comme
|
||||||
|
en 4 lettres: <small>UTSL</small>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Test_rgbmask(char *srcname);
|
||||||
|
<dd>En chantier actuellement.
|
||||||
|
|
||||||
|
<dt>void Test_des_patterns(char *prefix, int foo, int bar);
|
||||||
|
<dd>La <a href="img-patterns.html">page</a> décrivant les patterns ne contenant
|
||||||
|
que du texte, il me semble bien que vous puissiez en générer par vous même.
|
||||||
|
le paramètre <tt>prefix</tt> vous permet de préciser le chemin vers les
|
||||||
|
images générées, par exemple "/tmp/pattern" vous donnera
|
||||||
|
des noms de fichiers du genre <tt>/tmp/pattern_042.tga</tt>.
|
||||||
|
|
||||||
|
<dt>void Test_Egalisations(char *nomsource);
|
||||||
|
<dd>Essai des <a href="img-operat.html#egal">égalisations</a>.
|
||||||
|
Image résultante: <a href="aaaa_egal.png">aaaa_egal.tga</a> dans le
|
||||||
|
répertoire de travail. A gauche l'image originale, au milieu, l'algo
|
||||||
|
<tt>RGB</tt>, et à droite l'algo <tt>mono_0</tt>.
|
||||||
|
|
||||||
|
<dt>void Test_Dithering(char *nomsource);
|
||||||
|
<dd>Essais des <a href="img-dither.html">tramages</a>.
|
||||||
|
On passe en revue: <tt>dither_Bayer_0</tt>, <tt>dither_seuil_random</tt>
|
||||||
|
<tt>dither_simple_error</tt> et <tt>dither_double_seuil</tt>.
|
||||||
|
L'image d'origine est tout d'abord réduite de moitié, puis les
|
||||||
|
nombreux résultats sont collés dans une
|
||||||
|
<a href="aaaa_dithering.png">image unique</a>.
|
||||||
|
|
||||||
|
<dt>void Test_Effects_A(char *nomsource, int flag);
|
||||||
|
<dd>Démonstration de quelques <a href="img-effets.html">effets</a>.
|
||||||
|
L'image source est réduite de moitié. Le flag doit être (pour le
|
||||||
|
moment) mis à zéro.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Comme expliqué je ne sais plus où, certaines de ces fonctions sont
|
||||||
|
susceptibles d'écrire dans le répertoire courant des fichiers
|
||||||
|
divers et variés dont le nom commencera par <tt>aaaa</tt>.
|
||||||
|
Vous avez été prévenus. D'autre part, dans
|
||||||
|
<a href="img-outils.tar.gz">l'archive</a> des
|
||||||
|
<a href="img-outils.html">outils</a>, il y a plein de
|
||||||
|
scripts shell pour essayer plein de trucs.
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
262
Doc/img-fichiers.html
Normal file
262
Doc/img-fichiers.html
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: le(s) format(s) de fichier</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, convpht, TGA, Fits, Boudet, Targa, PHT, bmp">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / fichiers</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 19 mars 2010</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Cette page décrit les différents formats de fichier que sait gérer
|
||||||
|
la <a href="libimage.html">libimage</a>.
|
||||||
|
Le format de fichier <i>originel</i> de cette bibliothèque est le
|
||||||
|
<b>.TGA</b> 24 bits non compressé. Les autres ont été rajoutés par la
|
||||||
|
suite, et ne sont pas aussi testés que l'originel. D'autre part, c'est
|
||||||
|
dans ces fonctions que le problème du <small>BOUTISME</small> est le
|
||||||
|
plus flagrant: en gros vous risquez le coredump sur autre chose qu'un i386.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="#tga">TGA</a>]
|
||||||
|
[<a href="#bmp">BMP</a>]
|
||||||
|
[<a href="#pcx">PCX</a>]
|
||||||
|
[<a href="#pht">PHT</a>]
|
||||||
|
[<a href="#pnm">PNM</a>]
|
||||||
|
[<a href="#fits">FITS</a>]
|
||||||
|
[<a href="#jpeg">JPEG</a>]
|
||||||
|
[<a href="#ptl">PTL</a>]
|
||||||
|
[<a href="#eps">EPS</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="img-outils.html#export">export</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="tga">TGA</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_TGA_save(char *filename, Image_Desc *img, int compress);
|
||||||
|
<dd>Le paramètre <tt>compress</tt> doit actuellement être à 0. Fonction
|
||||||
|
qui ne semble plus victime de boutisme. Par contre, il manque <i>toujours</i>
|
||||||
|
la compression.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TGA_save_component(char *nom, Image_Desc *img, char channel, int comp);
|
||||||
|
<dd>La composante <tt>channel</tt> ('r', 'g' ou 'b') sera sauvée sous la
|
||||||
|
forme d'un tga monochrome avec une palette.
|
||||||
|
Et il manque aussi la compression.
|
||||||
|
|
||||||
|
<dt>Image_Desc * Image_TGA_alloc_load(char *nom);
|
||||||
|
<dd>...... En gros, ça prend un fichier .TGA sur le disque, et ça le met
|
||||||
|
dans une image, allouée à la volée. Les images compressées ne sont pas
|
||||||
|
traitées, hélas.
|
||||||
|
En détail, <a href="img-devel.html#utsl">utsl</a>.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="bmp">BMP</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>Image_BMP_save_24(char *filename, Image_Desc *img, int flag);
|
||||||
|
<dd>Sauvegarde d'une image au format BMP 24 bits non compressé (au fait,
|
||||||
|
ça se compresse un bmp ?). En théorie, cette fonction est exempte des
|
||||||
|
problèmes de boutisme. Hélas, un bug persistant fait que ça ne marche
|
||||||
|
pas très bien.
|
||||||
|
|
||||||
|
<dt>int Image_BMP_infos(char *nom, int *pw, int *ph, int *pt, int verb);
|
||||||
|
<dd>Récupère, et éventuellement affiche (si verb!=0) quelques informations
|
||||||
|
pertinentes sur un fichier bmp. Le retour <tt>*pt</tt> contient le nombre
|
||||||
|
de bits par pixel.
|
||||||
|
|
||||||
|
<dt>Image_Desc * Image_BMP_alloc_load(char *nom, int reserved);
|
||||||
|
<dd>Allocation et chargement d'une image bmp. Actuellement (décembre 2003)
|
||||||
|
seul quelques types sont mal supportés. Les autres ne le sont pas du
|
||||||
|
tout.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Bien évidement, la mauvaise qualité de la gestion de ce format est
|
||||||
|
la conséquence de la flemme de <i>tTh</i>. Si vous voulez voir ça de
|
||||||
|
plus près, il y a un <tt>testbmp.c</tt> dans le tarball.</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="pcx">PCX</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<font color="ff0000">En cours...</font><br>
|
||||||
|
Première étape: les fichier en 16
|
||||||
|
couleurs à palette. Mais ça ne marche pas encore...
|
||||||
|
Dommage, ça serait bien pour les <a href="img-dither.html">dithering</a>.
|
||||||
|
<br>
|
||||||
|
Deuxième étape: les images binaires, qui seront bien utiles pour
|
||||||
|
les <a href="img-bitplane.html">bitplanes</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_PCX_fileinfo(char *nom);
|
||||||
|
<dd>Affiche toutes les informations que l'on envisage de
|
||||||
|
trouver dans le header d'un fichier PCX.
|
||||||
|
|
||||||
|
<dt>int Image_wrPCX_8colors(char *nom, Image_Desc *im);
|
||||||
|
<dd>Euh, comment dire ?... Ça ne marche probablement pas.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Bien évidement, la mauvaise qualité de la gestion de ce format est
|
||||||
|
la conséquence de la flemme de <i>tTh</i>. Si vous voulez voir ça de
|
||||||
|
plus près, il y a un <tt>testpcx.c</tt> dans le tarball.</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="pht">PHT</a></h2>
|
||||||
|
|
||||||
|
<p>Ce format, totalement ouvert, est une survivance du passé.
|
||||||
|
Pour tout dire, ça remonte à l'Amstrad PC1512 ! Il permettait
|
||||||
|
de stocker une image en niveau de gris de façon rudimentaire, mais simple
|
||||||
|
et facile à lire. Chaque pixel est codé sur un octet non signé.
|
||||||
|
</p>
|
||||||
|
<pre>
|
||||||
|
En-tête: +--------+
|
||||||
|
| WIDTH | largeur sur 16 bits à-la-Intel
|
||||||
|
+--------+
|
||||||
|
| HEIGHT | hauteur (idem)
|
||||||
|
+--------+------+
|
||||||
|
| pppppppppp... | première ligne de pixels
|
||||||
|
| pppppppppp... | deuxième...
|
||||||
|
et ainsi de suite jusqu'à la fin de l'image
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
C'est donc un format 'monochrome', et on ne peut y mettre qu'une
|
||||||
|
composante RGB, ou un canal alpha, ou n'importe quoi qui se code sur 8 bits.
|
||||||
|
Vraiment rudimentaire, mais efficace
|
||||||
|
sur un Amstrad PC 1512 :)<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_PHT_save_component(char *name, Image_Desc *i, char col);
|
||||||
|
<dd>'name' est le nom du fichier, l'extension <b>.pht</b> est recommandée.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="pnm">PNM</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b>PNM</b> est l'acronyme de <i>Portable Net Map</i>. Ce format est utilisé
|
||||||
|
pour la communication entre une foultitude d'utilitaires de conversion
|
||||||
|
de fichier images. Vous trouverez facilement de la doc dans
|
||||||
|
le grand <a href="http://netpbm.sourceforge.net/doc/">Ternet</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_wr_pbm_0(char *nom, Image_Desc *im, char channel);
|
||||||
|
<dd>Sauvegarde d'une image monochrome, le seuil étant à 128.
|
||||||
|
Le paramètre 'channel' est R,G,B ou A.
|
||||||
|
<dt>int Image_wr_ppm_0(char *nom, Image_Desc *im, int mode);
|
||||||
|
<dd> En théorie, le paramètre mode mis à 1 demande l'écriture d'un fichier
|
||||||
|
binaire, plus petit, mais moins portable. En pratique, mode doit être
|
||||||
|
mis à zéro, et on obtient un fichier ascii, qui peut être <b>très</b> gros.
|
||||||
|
<dt>int Image_wr_pgm_0(char *nom, Image_Desc *im, char channel);
|
||||||
|
<dd>Ecriture d'un fichier en niveau de gris du canal spécifié.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Vous pouvez aussi regarder <a href="img-povhf15.html#fonctions">les HF</a>
|
||||||
|
pour une autre utilisation de ce format PNM.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="fits">FITS</a></h2>
|
||||||
|
|
||||||
|
<p>FITS est un format utilisé en astronomie. Pour le moment, j'en suis à la
|
||||||
|
recherche de documentation. Pour en savoir un peu plus, allez fouiller dans
|
||||||
|
<a href="http://www.eso.org/eclipse/">Eclipse</a> et revenez me faire part
|
||||||
|
de vos découvertes.</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="jpeg">JPEG</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A la demande générale, j'ai rajouté un <i>hack bien crade</i> pour sauvegarder
|
||||||
|
une
|
||||||
|
image en jpeg. Mais il faut avoir l'utilitaire <b>cjpeg</b> sur votre système.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_system_cjpeg(Image_Desc *img, char *fname, int quality);
|
||||||
|
<dd><i>img</i> est une image RGB en mémoire qui va être convertie en Jpeg sous
|
||||||
|
le nom <i>fname</i> avec un facteur de qualité compris entre 0 et 100.
|
||||||
|
Il suffira de taper <font color="green">man cjpeg</font> au prompt de votre
|
||||||
|
shell favori pour en apprendre plus.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Attention, c'est vraiment un kludge, et ça risque de ne pas marcher à tous
|
||||||
|
les coups...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="ptl">Points List</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
C'est nouveau, ça vient de sortir (enfin, il y a 8 ans que ce n'est
|
||||||
|
<a href="img-ptlist.html">pas fini</a>).
|
||||||
|
Et pour le moment, comme ça ne marche pas trop bien, ça ne sert à rien.
|
||||||
|
En bref, ce sont des listes de points <i>(x,y,h,v)</i> qui seront
|
||||||
|
destinées à nourrir un programme <a href="image77.html">fortran</a> qui
|
||||||
|
fabriquera des <a href="img-povhf15.html">height fields</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Pour être honnête, je n'ai pas la moindre idée de l'endroit où se
|
||||||
|
trouve ce fameux programme fortran. Pas grave, j'en ferais un autre.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="eps">Encapsulated Postscript</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Le but premier est de construire des images utilisables par <tt>LaTeX</tt>,
|
||||||
|
par exemple pour la version imprimée des
|
||||||
|
<b>Sources de Tar</b>.
|
||||||
|
La seconde étape sera de les utiliser dans des logiciels de PAO plus,
|
||||||
|
ahem, institutionnels...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
L'habituelle rubrique des liens:<br>
|
||||||
|
L'excellent <a href="http://www.wotsit.org/">wotsit</a> décrit pleins
|
||||||
|
de formats de toutes sortes de fichiers. Il existe aussi un
|
||||||
|
utilitaire d'<a href="img-outils.html#export">exportation</a>
|
||||||
|
reprenant certains des formats décrits ici.
|
||||||
|
D'autre part, <a href="http://www.imagemagick.org/">Image Magick</a>
|
||||||
|
est une bonne solution à tous ces problèmes de formats de fichier
|
||||||
|
pour les images.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me troller avec
|
||||||
|
<a href="http://foo.bar.quux.over-blog.com/">vigueur</a><br>
|
||||||
|
Si votre demande est simple, je patche à donf.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
93
Doc/img-filtres.html
Normal file
93
Doc/img-filtres.html
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les filtrages</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, krabulator, Boudet, filtres,
|
||||||
|
gradient, sobel">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / les filtrages</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 28 novembre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#filtres">filtres</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Les filtres de base sont définis par un tableau de 11 entiers.
|
||||||
|
Les 9 premiers représentent la matrice 3x3, le 10ème est le diviseur, et le
|
||||||
|
11ème est l'offset ajouté à la fin du calcul. Il y a une fonction qui permet
|
||||||
|
d'afficher ces valeurs. On trouvera également des filtres classiques
|
||||||
|
appelables directement.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="filtres"><h2>filtres</h2></a>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_convolueur3(Image_Desc *in, Image_Desc *out, int *mat);
|
||||||
|
<dd> <i>Je ne sais pas si le nom 'convolueur' est bien adapté...</i>
|
||||||
|
|
||||||
|
<dt>int Image_lissage_3x3(Image_Desc *in, Image_Desc *out);
|
||||||
|
<dd> Moyennage des pixels sur la matrice 3x3.
|
||||||
|
|
||||||
|
<dt>void Image_filtre_display(FILE *ou, int *mat);
|
||||||
|
<dd>Affichage des valeurs d'un filtre. <tt>ou</tt> précise à quel endroit
|
||||||
|
l'envoyer. Vous pouvez utiliser <tt>stdout</tt>, <tt>stderr</tt>
|
||||||
|
ou un fichier que vous avez préalablement ouvert.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_filtre_random(Image_Desc *src, Image_Desc *dst, int p1, int p2);
|
||||||
|
<dd>Les 9 coefficients du filtre sont choisis au hasard entre p1 et p2.
|
||||||
|
N'oubliez pas d'appeller <i>srand(getpid())</i> si vous obtenez la même
|
||||||
|
chose à chaque course :-)
|
||||||
|
|
||||||
|
<dt>int Image_filtre_passe_bas(Image_Desc *in, Image_Desc *out);
|
||||||
|
<dd>parfois, il m'arrive de me demander si ce filtre n'est pas équivalent
|
||||||
|
au lissage 3x3...
|
||||||
|
|
||||||
|
<dt>int Image_filtre_passe_haut(Image_Desc *in, Image_Desc *out);
|
||||||
|
<dd>euh...
|
||||||
|
|
||||||
|
<dt>int Image_filtre_Prewitt(Image_Desc *src, Image_Desc *dst, int rotation);
|
||||||
|
<dd>C'est un filtre directionnel, et le paramètre <tt>rotation</tt> permet
|
||||||
|
de le faire tourner.
|
||||||
|
|
||||||
|
<dt>int Image_filtre_Sobel(Image_Desc *src, Image_Desc *dst, int rotation);
|
||||||
|
<dd>C'est un filtre directionnel, et le paramètre <tt>rotation</tt> permet
|
||||||
|
de le faire tourner.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Certaines primitives du module 'filtres.c' necessitent une lecture
|
||||||
|
approfondie du code source. ymmv.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Comme d'habitude, utilisez votre <a href="http://www.exalead.fr/">g00gl3</a>
|
||||||
|
favori, et tentez des mots-clefs du genre 'convolution' ou 'sobel filter'.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez essayer de me contacter:<br>
|
||||||
|
mon adresse est <a href="http://la.buvette.org/ego/cv.html">là</a><br>
|
||||||
|
Si votre demande est scientifique, je patche comme un goret.<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
98
Doc/img-marquage.html
Normal file
98
Doc/img-marquage.html
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: marquer une image</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, marquage, Thierry Boudet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / marquer une image</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 13 octobre 2013</tt><br>
|
||||||
|
<i>
|
||||||
|
<a href="http://tboudet.free.fr/libimage/img-marquage.html">#</a> et
|
||||||
|
<a href="http://la.buvette.org/devel/libimage/img-marquage.html">#</a>
|
||||||
|
</i>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-texte.html">textes</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Marquer une image</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Parfois, on a besoin de marquer, pour diverses raisons
|
||||||
|
(parfois (et même souvent) idiotes),
|
||||||
|
une image. Voici donc quelques fonctions sommaires permettant de faire ça.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_marque_0(Image_Desc *img, int val);
|
||||||
|
<dd>
|
||||||
|
Trace les deux diagonales de l'image avec un gris de niveau <tt>val</tt>.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>int Image_marque_1(Image_Desc *img, char *texte, int flags);
|
||||||
|
<dd>Place un 'label' dans le coin en haut à gauche de l'image.
|
||||||
|
Les flags ne sont pas utilisés pour le moment.</dd>
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_marque_timestamp(Image_Desc *img, char *texte, RGBA *rgba);
|
||||||
|
<dd>
|
||||||
|
Inscrit la date et l'heure dans l'image, avec un petit message.
|
||||||
|
Le papier est blanc, mais vous pouvez choisir la couleur de l'encre.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_grille(Image_Desc *im, int stx, int ox, int sty, int oy, RGBA *ink) ;
|
||||||
|
<dd>La grille peut être habilement centrée en utilisant les offsets
|
||||||
|
<tt>ox</tt> et <tt>oy</tt>. Hélas, la composante alpha de l'encre
|
||||||
|
n'est pas prise en compte...
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2>Marquer un rectangle</h2>
|
||||||
|
|
||||||
|
<p>D'autres fois, ce n'est qu'une zone particulière d'une image que l'on
|
||||||
|
souhaite marquer. Actuellement, on ne peut agir que sur des zones
|
||||||
|
particulières : des
|
||||||
|
<tt><a href="img-dessin.html#image_rect">Image_Rect</a></tt> précisément.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_gadrct_cross(Image_Desc *img, Image_Rect *rect, int k);
|
||||||
|
<dd>Tracé d'une croix en diagonale dans la zone délimitée par <tt>rect</tt>.
|
||||||
|
Le paramêtre <tt>k</tt> permettra de choisir différentes couleurs pour le fond
|
||||||
|
et la croix.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2>Fonctions connexes</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Maintenant, si vous voulez construire quelques images de référence,
|
||||||
|
vous pouvez essayer les <a href="img-mires.html">quelques mires</a>
|
||||||
|
disponibles.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter,
|
||||||
|
Si votre demande est marquante, je patche comme un gruiik.<br>
|
||||||
|
<a href="http://tboudet.free.fr/cv.html">tTh.image</a><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
69
Doc/img-mires.html
Normal file
69
Doc/img-mires.html
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: fabriquer une mire</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, marquage, Thierry Boudet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1 align=center><a name="top">libimage / fabriquer une mire</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 7 novembre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-marquage.html">marquage</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Les primitives</h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_mirRGB_0(Image_Desc *dst, int flag);
|
||||||
|
<dd>L'image de destination doit être en 256x256. Le flag doit être
|
||||||
|
à zéro.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2>The more advanced</h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_mircol_0(Image_Desc *dst, char *txt, int flag);
|
||||||
|
<dd>Taille de l'image: 512x512. Le texte est optionnel. Le flag
|
||||||
|
doit être à 0.
|
||||||
|
|
||||||
|
<dt>int Image_mircol_1(Image_Desc *dst, char *txt, int flag);
|
||||||
|
<dd>Taille de l'image: 512x512. Le texte est optionnel. Le flag
|
||||||
|
doit être à 0.
|
||||||
|
|
||||||
|
<dt>int Image_mircol_2(Image_Desc *dst, char *txt, int mode);
|
||||||
|
<dd>Ceci est une tentative secrète pour mettre dans une image de dimensions
|
||||||
|
données des choses que vous n'avez <b>vraiment</b> pas besoin de connaitre.
|
||||||
|
|
||||||
|
<dt>int Image_mircol_3(Image_Desc *dst, char *txt, int mode);
|
||||||
|
<dd>Ceci est une tentative pour mettre dans une image de dimensions
|
||||||
|
données le maximum de teintes différentes, tout en ayant des dégradés
|
||||||
|
harmonieux. C'est pas simple.
|
||||||
|
|
||||||
|
<dt>int Image_decompose(Image_Desc *src, Image_Desc *dst, int flag);
|
||||||
|
<dd>Une fonction un peu particulière.
|
||||||
|
Elle décompose, après réduction de taille, l'image source en ses trois
|
||||||
|
composantes R, G et B.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Avec un peu de chance, le <a href="img-outils.html#mires">verso</a>
|
||||||
|
de cette documentation est plus avancée. Il décrit un outil en <i>cli</i>
|
||||||
|
permettant de créer des .tga de ces mires diverses.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
[ <a href="http://tontonth.free.fr/cv.txt">seeking for a new job.</a> ]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
62
Doc/img-op2x2.html
Normal file
62
Doc/img-op2x2.html
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les blocs 2x2</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, 2x2, strange processing">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage: les blocs 2x2</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 12 novembre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
[<a href="img-operat.html">opérations</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_2x2_contours_0(Image_Desc *im);
|
||||||
|
<dd>Une opération mythique, pour moi. Mais pas vraiment facile à comprendre.
|
||||||
|
D'autant plus que cette fonction est un essai approximatif.
|
||||||
|
|
||||||
|
<dt>int Image_2x2_contours_1(Image_Desc *src, Image_Desc *dst);
|
||||||
|
<dd>La suite de l'opération mythique. En entrée c'est uniquement le bit
|
||||||
|
7 de la composante R qui est utilisé, et en sortie, c'est uniquement
|
||||||
|
le plan rouge qui est significatif.
|
||||||
|
|
||||||
|
<dt>int Image_2x2_contrast(Image_Desc *src, Image_Desc *dst);
|
||||||
|
<dd>Alors, c'est un truc qui semble détecter les contrastes locaux, dans une
|
||||||
|
matrice 2x2, mais je ne comprends pas trop comment.
|
||||||
|
|
||||||
|
<dt>int Image_2x2_lissage(Image_Desc *src, Image_Desc *dst);
|
||||||
|
<dd>Moyenne du voisinage [0..1][0..1] des pixels de l'image.
|
||||||
|
Voir aussi les <a href="img-filtres.html">filtres</a>.
|
||||||
|
|
||||||
|
<dt>int Image_2x2_rot4pix(Image_Desc *src, Image_Desc *dst, int rot);
|
||||||
|
<dd>Rotulazionne de la imagines. A essayer, parce que moi, j'ai pas osé.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pour ces fonctions qui travaillent sur des matrices 2x2,
|
||||||
|
il faut faire attention à l'éventuel déplacement de l'image du à une
|
||||||
|
disymétrie par rapport au pixel de référence.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
Voilà, encore du code un peu goret qui reçoit enfin un peu de documentation
|
||||||
|
+/- à jour.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
67
Doc/img-operat.html
Normal file
67
Doc/img-operat.html
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les operations</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, operations, equalize">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / les opérations</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 27 janvier 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
[<a href="img-op2x2.html">op 2x2</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h2>fonctions</h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_egalise_RGB(Image_Desc *src, Image_Desc *dst, int yo);
|
||||||
|
<dd>Ajustationnement des niveaux d'une image par la méthode des histogrammes
|
||||||
|
cumulés. le parametre 'yo' n'est pas utilise actuellement.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int Image_egalise_mono_0(Image_Desc *src, Image_Desc *dst, int yo);
|
||||||
|
<dd>Ajustements des niveaux. L'histograme cumulé est calculé sur les niveaux
|
||||||
|
de gris de l'image. Le paramètre 'yo' doir être égal à 0.
|
||||||
|
|
||||||
|
<dt>int Image_clear_component(Image_Desc *img, char component, int value);
|
||||||
|
<dd>Efface une des composante RGB à la valeur donnée.
|
||||||
|
|
||||||
|
<dt>int Image_operator(Image_Desc *in, char op, int val, Image_Desc *out);
|
||||||
|
<dd>Bon, c'est <b>la</b> fonction qui fait tout.
|
||||||
|
Sauf le café.
|
||||||
|
Les operateurs sont définis par un caractere: <tt>'+', '-', '>'</tt>...
|
||||||
|
La fonction retourne <i>BAD_OPERATOR</i> si l'opérateur n'est pas connu, et
|
||||||
|
se contente alors de recopier la source dans la destination.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bah, euh... Il y a bien les <a href="img-outils.html">outils</a> pour
|
||||||
|
quelques exemples d'utilisation.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est opérative, je patche comme un goret.<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
134
Doc/img-patterns.html
Normal file
134
Doc/img-patterns.html
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les patterns</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, krabulator, buv3tt3, Boudet, patterns">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / les patterns</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 12 janvier 2012</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#noise">noise</a>]
|
||||||
|
[<a href="#fill">remplissage</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pour le moment, le mieux à faire, c'est de
|
||||||
|
'<a href="img-devel.html#utsl">utsl</a>' et de
|
||||||
|
<a href="img-outils.html#patterns">tester</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_pattern_000(Image_Desc *img, int foo);
|
||||||
|
<dd> Ah, ça ne fait que du noir ?
|
||||||
|
|
||||||
|
<dt>int Image_pattern_001(Image_Desc *img, int foo);
|
||||||
|
<dd> gni ?
|
||||||
|
|
||||||
|
<dt>int Image_pattern_002(Image_Desc *img, int foo);
|
||||||
|
<dd> gni ?
|
||||||
|
|
||||||
|
<dt>int Image_pattern_003(Image_Desc *img, int foo);
|
||||||
|
<dd> C'est simple, le code n'est pas écrit.
|
||||||
|
|
||||||
|
<dt>int Image_pattern_004(Image_Desc *img, int a, int b, int c, int d);
|
||||||
|
<dd> C'est simple, le code n'est pas écrit.
|
||||||
|
|
||||||
|
<dt>int Image_pattern_005(Image_Desc *img, RGB_map *map);
|
||||||
|
<dd> gni ?
|
||||||
|
|
||||||
|
<dt>int Image_pattern_042(Image_Desc *img, RGB_map *map);
|
||||||
|
<dd>Ah, la réponse à la question universelle ssur la vie, l'univers et
|
||||||
|
le reste...
|
||||||
|
|
||||||
|
<dt>int Image_mirRGB_0(Image_Desc *dst);
|
||||||
|
<dd> gni ?
|
||||||
|
<dt>int Image_pattern_104(Image_Desc *dst, int sx, int sy, RGBA *a, RGBA *b);
|
||||||
|
<dd>Construction d'un damier.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Une interface <a href="image77.html#patterns">fortran</a> est en préparation
|
||||||
|
et devrait être disponible fin Février 2038. D'autre part, dans le
|
||||||
|
fichier <a href="img-essais.html"><tt>essais.c</tt></a>,
|
||||||
|
il y a une fonction qui génère quelque-uns de
|
||||||
|
ces patterns. Et pour finir, une
|
||||||
|
<a href="http://la.buvette.org/images/patterns.html">page d'exemples</a>
|
||||||
|
est en préparation.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="fill">Remplissage</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_fill_pat_0(Image_Desc *img, Image_Desc *pat, int centered);
|
||||||
|
<dd>Attention aux...
|
||||||
|
<dt>int Image_fill_pat_1(Image_Desc *img, Image_Desc *pat, int centered);
|
||||||
|
<dd>...coredumps !
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="noise">Plein de bruit</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Remplissage d'images avec des bruits divers. Que les statisticiens me
|
||||||
|
pardonnent, mais ce que j'ai fait là est <i>un peu</i> empirique.
|
||||||
|
Disons que pour le moment, ça me permet de faire ce que je veux.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_gray_noise_0(Image_Desc *dst, int low, int high);
|
||||||
|
<dd>Gris uniforme, valeurs comprises entre low et high.
|
||||||
|
|
||||||
|
<dt>int Image_rgb_noise_0(Image_Desc *dst, int low, int high);
|
||||||
|
<dd>RGB uniforme, valeurs comprises entre low et high.
|
||||||
|
|
||||||
|
<dt>int Image_rgba_noise_0(Image_Desc *dst, int low, int high);
|
||||||
|
<dd>RGB et alpha uniforme, valeurs comprises entre low et high.
|
||||||
|
|
||||||
|
<dt>int Image_rgb_noise_1(Image_Desc *dst, RGBA *low, RGBA *high);
|
||||||
|
<dd>Bruit uniforme avec des bornes inférieures et supérieures sur chacune
|
||||||
|
des composantes.
|
||||||
|
|
||||||
|
<dt>int Image_gray_noise_2(Image_Desc *dst, int low, int high);
|
||||||
|
<dd>Algorithme du lancement de dés pour obtenir une courbe en cloche.
|
||||||
|
Mais la cloche ressemble à un pic <b>:)</b>
|
||||||
|
|
||||||
|
<dt>int Image_rgb_noise_2(Image_Desc *dst, RGBA *low, RGBA *high);
|
||||||
|
<dd>même galère pour faire la doc.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bah, euh...
|
||||||
|
Ben non, ya <a href="http://www.lycos.fr/">presque</a> rien.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est randomatique, je patche comme un goret.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
80
Doc/img-plotters.html
Normal file
80
Doc/img-plotters.html
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les machines à plotter</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, plotting">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / les outils pour plotter</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour : 4 novembre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="img-marquage.html">marquage</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Sortie, sous forme graphique, de diverses données gérés par la librairie.
|
||||||
|
Des histogrammes, des <small>COLORMAP</small>...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="fonctions">fonctions de base</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
En règle générale, ces fonctions génèrent des fichiers au format Targa.
|
||||||
|
</p>
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_plot_histo(char *nomtga, long *hr, long *hg, long *hb, char *txt);
|
||||||
|
<dd>L'image a une taille de 400x300. Pour calculer l'histogramme, il faut
|
||||||
|
<a href="img-calculs.html#mesures">voir</a> la fonction adéquate.
|
||||||
|
|
||||||
|
<dt>int Image_calc_plot_histo(Image_Desc *img, char *tganame);
|
||||||
|
<dd>Calcul et tracé de l'histogramme. Le texte affiché sera le nom de
|
||||||
|
l'image résultante, ce qui (àmha) est une grossière erreur.
|
||||||
|
|
||||||
|
<dt>int Image_plot_Map(char *nomtga, RGB_map *map , char *txt);
|
||||||
|
<dd>Dessine une palette de <a href="img-couleurs.html#couleurs">couleurs</a>
|
||||||
|
de type <a href="http://www.fractint.org/">Fractint</a>. Attention aux textes
|
||||||
|
trop longs.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_plot_luts(char *nomtga, int *lr, int *lg, int *lb, char *texte);
|
||||||
|
<dd>dessin d'une Look-Up Table. L'image a une taille de 400x300. Le texte
|
||||||
|
a une longueur maximum d'environ quelques caractères. Il est important de
|
||||||
|
ne pas confondre une LUT et une Palette.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<h2>Fonction avancées</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Avancées, alors que ça semble plutôt être des primitives destinés à
|
||||||
|
tracer dans une image déja existante...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_plot_h_Map(Image_Desc *img, RGB_map *map, int xpos, int ypos, int h);
|
||||||
|
<dd>Fabrique dans une image une petite bande horizontale à partir d'une
|
||||||
|
palette.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
Votre demande est plottante, je lance <a href="http://www.vim.org">Vim</a>,<br>
|
||||||
|
et je passe à l'action.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
253
Doc/img-povhf15.html
Normal file
253
Doc/img-povhf15.html
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les height_fields de POVray</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, 3d de merde, POVRAY">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / les height_fields de POVray</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 16 octobre 2013</tt><br>
|
||||||
|
<i>
|
||||||
|
<a href="http://tboudet.free.fr/libimage/img-povhf15.html">#</a> et
|
||||||
|
<a href="http://la.buvette.org/devel/libimage/img-povhf15.html">#</a>
|
||||||
|
</i>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#fonctions">fonctions</a>]
|
||||||
|
[<a href="#traitements">traitements</a>]
|
||||||
|
[<a href="#mixages">mixages</a>]<br>
|
||||||
|
[<a href="image77.html#povray">fortran</a>]
|
||||||
|
[<a href="#bruit">bruitage</a>]
|
||||||
|
[<a href="#synth">synthèse</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pour savoir ce qu'est un <b>height_field</b>, consultez le site de
|
||||||
|
<a href="http://www.povray.org/">POVray</a>, et fouillez la doc.
|
||||||
|
Vous pouvez aussi en
|
||||||
|
<a href="http://krabulator.free.fr/exPOV/current/ex13.jpg">regarder un</a>
|
||||||
|
pour vous faire une idée...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
En fait, un <b>height_field</b> est un "champ d'altitude", une
|
||||||
|
sorte de matrice à deux dimensions dont chaque cellule représente une hauteur.
|
||||||
|
Cette hauteur est un nombre codé sur 15 bits, donc entre 0 et 32767.
|
||||||
|
Les gens de <a href="http://www.povray.org/">POVray</a> ont choisi, entre
|
||||||
|
autres solutions, de stocker cette altitude dans des images .TGA en mettant
|
||||||
|
les 7 bits de poids fort dans le canal rouge et les 8 bits de poids
|
||||||
|
faible dans le canal vert.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<a name="fonctions"><h2>fonctions de base</h2></a>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_hf15_plot(Image_Desc *im, int x, int y, int h);
|
||||||
|
<dd>Place un point de hauteur <b>h</b> (entre 0 et 32768) aux coordonnées
|
||||||
|
x et y. Les valeurs de <b>h</b> hors intervalle seront bornées.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_height(Image_Desc *img, int x, int y);
|
||||||
|
<dd>Lecture de la hauteur du point aux coordonnées x et y. Cette hauteur est
|
||||||
|
automatiquement limitée à l'intervalle autorisé.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_hf2gray(Image_Desc *src, Image_Desc *dst, int mode);
|
||||||
|
<dd>Conversion d'un height_field en une image en niveaux de gris. Le paramètre
|
||||||
|
<tt>mode</tt> n'est pas utilisé et doit être égal à 0.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int Image_hf15_rgb2hf(Image_Desc *src, Image_Desc *dst, int mode);
|
||||||
|
<dd>Conversion d'une image RGB en height_field. Le paramètre <tt>mode</tt>
|
||||||
|
n'est pas utilisé. On doit le mettre à 0. Cette fonction va probablement
|
||||||
|
évoluer dans un proche (ou lointain) avenir.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_save_PGM(char *nom, Image_Desc *img, char *comment);
|
||||||
|
<dd>Sauvegarde un height_field en format
|
||||||
|
<a href="img-fichiers.html#pnm">PGM</a> ascii. Le suffixe recommandé
|
||||||
|
étant <tt>.pgm</tt>, mais vous faites comme vous voulez...
|
||||||
|
<i>Bien que le fichier soit
|
||||||
|
conforme aux spécifications du PGM, Povray n'arrive pas à le lire.
|
||||||
|
Ce bug devrait être corrigé dans la version 3.x qui est actuellement
|
||||||
|
disponible, mais je n'ai pas encore testé.</i>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<a name="traitements"><h2>traitements</h2></a>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_lissage(Image_Desc *s, Image_Desc *d, int coef, int flag);
|
||||||
|
<dd>Lissage d'un height_field. Le paramètre <tt>coef</tt> représente le
|
||||||
|
poids du point central de la matrice 3x3. Les huit autres points ont
|
||||||
|
un coefficient de 1, ce qui n'est peut-être pas idéal.
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_calc_minmax(Image_Desc *img, char *txt, int *pmin, int *pmax);
|
||||||
|
<dd>Calcul des extrèmes d'un height_field. Si <tt>txt!=NULL</tt>, un message
|
||||||
|
est affiché. Si <tt>pmin</tt> et/ou <tt>pmax</tt> sont à <tt>NULL</tt>, le
|
||||||
|
résultat correspondant n'est pas retourné. <i>ah ah, no more segfault !</i>
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_normalize(Image_Desc *src, Image_Desc *dst, int min, int max);
|
||||||
|
<dd>Ajustement linéaire d'un height-field afin que toutes les valeurs
|
||||||
|
soient comprises entre <tt>min</tt> et <tt>max</tt>.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_mul_add(Image_Desc *src, Image_Desc *dst, int mul, int add);
|
||||||
|
<dd> A tester plus en détails...
|
||||||
|
|
||||||
|
<dt>int Image_hf15_dilate(Image_Desc *src, Image_Desc *dst, int coef);
|
||||||
|
<dd>Dilatation d'un HF: chaque point est remplacé par le point le plus haut
|
||||||
|
de son voisinage 3x3. Cela a pour effet d'amplifier les sommets.
|
||||||
|
Le paramètre <tt>coef</tt> n'est pas utilisé, il est bon de mettre 1, pour
|
||||||
|
rester compatible avec les évolutions en projet...
|
||||||
|
|
||||||
|
<dt>int Image_hf15_erode(Image_Desc *src, Image_Desc *dst, int coef);
|
||||||
|
<dd>Opération inverse de la dilation: amplification des vallées. <tt>coef</tt>
|
||||||
|
n'est pas utilisé, mettre 1.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_mult_i(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst);
|
||||||
|
<dd>Multiplication de deux height-fields, avec remise à l'échelle pour ne
|
||||||
|
pas faire de dépassements. Pas trop testé ;(
|
||||||
|
|
||||||
|
<dt>int Image_hf15_sqrt(Image_Desc *src, Image_Desc *dst);
|
||||||
|
<dd>Racine carré normalisée de l'altitude normalisée. Peu testée, mais
|
||||||
|
visuellement prometteuse.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_pow(Image_Desc *src, Image_Desc *dst, double p0w44)
|
||||||
|
<dd>En quelque sorte la fonction complémentaire de la racine carré. Et là aussi
|
||||||
|
on opère sur des valeurs normalisées.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<a name="mixages"><h2>mixages</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bien entendu, quand on commence à faire des height-fields, on se demande
|
||||||
|
si on peut les combiner, les mélanger entre eux, faire du hfmix...
|
||||||
|
Et effectivement, c'est possible. Il y a même un
|
||||||
|
<a href="http://foo.buvette.org/bf/hf/">début de démonstration</a>
|
||||||
|
qui donne parfois de bonnes idées bien mouvantes.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_mix(Image_Desc *s1, Image_Desc *s2, Image_Desc *d, int k);
|
||||||
|
<dd> Mélange de deux HF. Le coefficient <tt>k</tt> va de 0 à 10000, mais rien
|
||||||
|
ne vous empèche d'essayer d'autres valeurs. En principe, les débordements
|
||||||
|
sont correctement gérés.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_hf15_mult(Image_Desc *s1, Image_Desc *s2, Image_Desc *dst);
|
||||||
|
<dd>
|
||||||
|
Multiplication de deux hf15. Il risque d'y avoir des problèmes de dépassement
|
||||||
|
de capacité dans cette fonction. Si cela vous arrive, il faut me faire
|
||||||
|
<a href="mailto:oulala@chez.com">signe</a>.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_getmin(Image_Desc *s1, Image_Desc *s2, Image_Desc *d);
|
||||||
|
<dd>Recopie dans l'image de destination de la valeur minimale des deux
|
||||||
|
points correspondants dans les images s1 et s2. Il existe aussi la
|
||||||
|
fonction <tt>Image_hf15_getmax</tt> dont la sémantique est évidente.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<a name="bruit"><h2>bruitages</h2></a>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_hf15_noise_0(Image_Desc *dst, int hi, int lo, int pr100);
|
||||||
|
<dd>Avec une probabilité de <tt>(pr100 % 100)</tt>, l'altitude sera mise entre
|
||||||
|
<tt>hi</tt> et <tt>lo</tt> pour tout les points de l'image.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_noise_1(Image_Desc *dst, int mo, int of, int pr100);
|
||||||
|
<dd>Cette fonction déplace une atltitude de 'mo' avec un offset de 'of'.
|
||||||
|
Le paramètre 'pr100' n'est pas utilisé.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_noise_2(Image_Desc *dst, int pr100, int di, int k1, int k2);
|
||||||
|
<dd>Remplacement aléatoire du point courant par un de ses proches voisins.
|
||||||
|
Le code n'est hélas pas encore vraiment optimisé.
|
||||||
|
|
||||||
|
<dt>int Image_hf15_noise_3(Image_Desc *dst, double coef, int flag);
|
||||||
|
<dd>Léger bruitage proportionnel à la hauteur du point concerné. Cette fonction
|
||||||
|
a été inventée pour la montagne de
|
||||||
|
<a href="http://foo.buvette.org/bf/pm/sonia.avi">Sonia</a>.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<a name="synth"><h2>Synthèses</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Nous pouvons également songer à fabriquer des height-fields à partir de
|
||||||
|
calculs divers et plus ou moins abscons. Actuellement, il y a deux fonctions
|
||||||
|
à peu près opérationnelles, mais pas encore figées.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_hf15_synth_0(Image_Desc *dst, Image_PtList *ptl);
|
||||||
|
<dd>Pas très fini, en cours de démoulage. Et vous ne savez pas ce qu'est
|
||||||
|
une <i>PtList</i> ? Voici un petit <a href="img-ptlist.html">topo</a>.
|
||||||
|
<dt>int Image_hf15_synth_fromfunc0(Image_Desc *dst, int k,
|
||||||
|
double(*func)(int x, int y, int k))
|
||||||
|
<dd>Vous avez sous la main une fonction du genre <tt>h = func(x, y)</tt> ?
|
||||||
|
Vous souhaitez la transformer en height-field ? No souçaï. Vous écrivez votre
|
||||||
|
fonction, vous créez une image des dimensions voulues, et vous utilisez
|
||||||
|
ce générateur magique, quoique pas encore fini. Son principal avantage est
|
||||||
|
de recadrer les valeurs fournies par votre fonction dans la <i>dynamique</i>
|
||||||
|
complète du hf.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Il existe une <a href="image77.html#povray">interface G77</a> pour
|
||||||
|
ces fonctions.
|
||||||
|
<li><a href="http://www.povray.org/">POVray</a>, and have a look at the new
|
||||||
|
3.5 version...
|
||||||
|
<li><a href="http://pov.monde.free.fr/">Pov Monde</a> les POVeurs francophones.
|
||||||
|
<li><a href="http://tontonth.free.fr/pov/">tTh</a> fait quelques raytracings.
|
||||||
|
<li>Comment faire des <a href="img-stereo.html">images en relief</a>.
|
||||||
|
<li>un début de <a href="http://tontonth.free.fr/pov/hf/">howto</a> pour faire
|
||||||
|
des images avec les hf15s.
|
||||||
|
<li>Il y a d'autres choses étranges dans POV: les
|
||||||
|
<a href="img-df3.html">df3</a> (<i>aka</i> density files) en font partie.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Dans un autre domaine <i>povesque</i>, si vous créez deux images en déplaçant
|
||||||
|
légerement le point de vue, vous pouvez les
|
||||||
|
<a href="img-stereo.html">combiner</a> en une image, que vous verrez en
|
||||||
|
relief avec une paire de lunettes munie des
|
||||||
|
<a href="img-stereo.html#filtres">filtres</a> adéquats.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align=right><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
Votre demande est traçante,
|
||||||
|
<a href="http://foo.bar.quux.over-blog.com/">je</a> lance mon
|
||||||
|
<a href="http://www.vim.org">Vim</a>,<br>
|
||||||
|
et je passe à l'action altitudisante.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
104
Doc/img-ptlist.html
Normal file
104
Doc/img-ptlist.html
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les listes de points</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, liste de points">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>libimage: les listes de points</h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 15 octobre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>L'origine de ce concept se perd dans la nuit des temps, probablement
|
||||||
|
aux alentours de 1998... Je n'ai pas le moindre souvenir de pourquoi j'ai
|
||||||
|
commencé à imaginer ça. Mais il y a déja un peu de code écrit, autant
|
||||||
|
que ça serve à quelque chose. Commençons par les concepts de base.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Un point et une liste de points, c'est quoi ?</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Comme un point se réfère à une image, il va forcément avoir les
|
||||||
|
coordonnées d'un pixel, donc un tuple <tt>x,y</tt>. Ensuite, nous avons
|
||||||
|
deux attributs: le premier est assimilable à la "hauteur" de
|
||||||
|
ce point dans le champ virtuel du monde pixelisé, et le second
|
||||||
|
est laissé à l'imagination du codeur (pourquoi pas un index dans une
|
||||||
|
<small>LUT</small> de couleurs ?) qui veut utiliser le kluge.
|
||||||
|
|
||||||
|
Pour des raisons historiques d'occupation mémoire, toutes ces coordonnées sont
|
||||||
|
stockées sur 16 bits. Désolé.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre class=code>
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
short x, y; /* pixel position */
|
||||||
|
short h; /* pixel value */
|
||||||
|
short c; /* color index ? */
|
||||||
|
} Image_Point;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Ensuite, pour manipuler des ensembles de points, nous les regrouperons dans
|
||||||
|
des listes de, justement, points. A priori, le descripteur d'une liste de
|
||||||
|
points n'est pas une structure publique, du moins, tant qu'elle n'est
|
||||||
|
pas à peu près figée.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Fonctions de bases</h2>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>Image_PtList * Image_ptl_alloc(int nbre, char *name);
|
||||||
|
<dd>Allocation d'une liste de points. <tt>nbre</tt> étant le nombre
|
||||||
|
de points initialement alloués et <tt>name</tt> un texte arbitraire
|
||||||
|
d'une taille limitée. La taille est dynamique, c'est à dire qu'une liste
|
||||||
|
de points peut grossir à la demande.
|
||||||
|
|
||||||
|
<dt>int Image_ptl_kill(Image_PtList *ptl, char *msg);
|
||||||
|
<dd>Destruction d'une liste et probable récupération de la mémoire
|
||||||
|
utilisée. Si <tt>NULL != msg</tt>, un message est éventuellement
|
||||||
|
affiché sur stderr.
|
||||||
|
|
||||||
|
<dt>int Image_ptl_get_size(Image_PtList *ptl, int *nbre, int *alloc);
|
||||||
|
<dd>Récupère le nombre de points effectif dans la liste, et la place
|
||||||
|
disponible actuelle. On peut passer <tt>NULL</tt> si on ne veut pas
|
||||||
|
récupérer une des valeurs.
|
||||||
|
|
||||||
|
<dt>int Image_ptl_add(Image_PtList *ptl, int x, int y, int h, int c);
|
||||||
|
<dd>Ajout d'un point à une liste, en augmentant éventuellement la
|
||||||
|
taille de celle-ci, la taille de la liste étant limité par la mémoire
|
||||||
|
disponible, au bon vouloir du <small>OOMK</small> farceur. Il n'est
|
||||||
|
actuellement pas possible d'enlever un point de la liste.
|
||||||
|
|
||||||
|
<dt>int Image_ptl_get(Image_PtList *ptl, Image_Point *pt, int idx);
|
||||||
|
<dd>Lecture d'un point depuis une liste. Coredumpe peut-être,
|
||||||
|
mais pas trop souvent.
|
||||||
|
|
||||||
|
<dt>int Image_ptl_boundingbox(Image_PtList *ptl, Image_Rect *box);
|
||||||
|
<dd>Calcul de la boite qui englobe en x/y tous les points d'une liste.
|
||||||
|
Il traine probablement une <i>off-by-one</i> erreur dans le code.
|
||||||
|
Utilisez <a href="libimage.html#tools">Image_dump_rect</a> pour afficher
|
||||||
|
le résultat.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
On peut, bien entendu, mettre ces listes de points dans des
|
||||||
|
<a href="img-fichiers.html#ptl">fichiers</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
94
Doc/img-showdiff.html
Normal file
94
Doc/img-showdiff.html
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: montrer les differences</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, krabulator, Boudet, Targa, hexdiff">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / montrer les différences</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 20 janvier 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html#primitives">primitives</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
[<a href="img-outils.html">outils</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Ces fonctions permettront de mettre en évidence les différences entre
|
||||||
|
deux images (par exemple: avant et après un filtrage) mais sont toujours
|
||||||
|
en cours de mise au point. Ceci dit, on peut aussi les classer dans
|
||||||
|
les <a href="img-combine.html">combinations</a> d'images.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_showdiff_0(Image_Desc *im1, Image_Desc *im2, Image_Desc *dst)</tt>
|
||||||
|
<dd>Pour chacune des composantes, la valeur est calculée ainsi:
|
||||||
|
<tt>v = ((v1 - v2)/2) + 127</tt>.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_showdiff_1(Image_Desc *im1, Image_Desc *im2, Image_Desc *dst, int dmin)</tt>
|
||||||
|
<dd>Completement binaire sur les trois composantes. En pseudo-code, ça donne
|
||||||
|
à peu près ceci:
|
||||||
|
<pre>
|
||||||
|
for component in (r, g, b)
|
||||||
|
if component(im1)>component(im2)
|
||||||
|
then pix=component.255
|
||||||
|
else pix=component.0
|
||||||
|
end for
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_showdiff_2(Image_Desc *im1, Image_Desc *im2, Image_Desc *dst, int dmin)</tt>
|
||||||
|
<dd> cette fonction n'est pas vraiment finie...
|
||||||
|
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_showdiff_3(Image_Desc *im1, Image_Desc *im2, Image_Desc *dst,
|
||||||
|
int kr, int kg, int kb)</tt>
|
||||||
|
<dd>Algo:
|
||||||
|
<pre>
|
||||||
|
pour chaque composante
|
||||||
|
si delta(im1.C, im2.C) < kC
|
||||||
|
dst.C = 96
|
||||||
|
sinon
|
||||||
|
dst.C = 255
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Il existe plein d'autres façons de comparer deux images, et
|
||||||
|
je vous laisse le soin de les imaginer...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
L'habituelle rubrique des liens, toujours complètement vide.
|
||||||
|
Rattrapez vous <a href="libimage.html#liens">ici</a> ou
|
||||||
|
<a href="img-outils.html#showdiff">là</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p align=right>
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est différentielle,<br>je patche comme un goret.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p align=center><a href="http://tboudet.free.fr/hexdiff/">tTh is the king of diff</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
95
Doc/img-stereo.html
Normal file
95
Doc/img-stereo.html
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: la stéréo</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, relief, stéréo, POVray, Boudet">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">libimage / la stéréo</a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 20 octobre 2013</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Le principe est simple: Avec <i>POV</i>, vous génerez deux images,
|
||||||
|
une pour chaque oeil du spectateur, et vous combinez ces deux images
|
||||||
|
en utilisant le rouge pour l'oeil droit et le vert pour l'oeil gauche.
|
||||||
|
En regardant l'image résultante avec les lunettes kivonbien, vous verrez
|
||||||
|
l'image en relief dans l'écran de votre dinateur.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
En pratique, c'est un peu plus délicat... C'est pas simple de trouver les
|
||||||
|
bons angles de vue. J'ai rédigé un petit
|
||||||
|
<a href="http://la.buvette.org/POV/stereo.html"><small>HOWTO</small></a>
|
||||||
|
avec une vidéo en troisD.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>Voyons maintenant les fonctions qui existent...</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_combine_stereo_0(Image_Desc *gauche, Image_Desc *droite,
|
||||||
|
Image_Desc *stereo);
|
||||||
|
<dd>La fonction de base. Les deux images sources sont converties en gris
|
||||||
|
sans la moindre pondération, et l'image destination est faite en
|
||||||
|
utilisant les canaux rouge et vert.
|
||||||
|
|
||||||
|
<dt>int Image_combine_stereo_1(Image_Desc *gauche, Image_Desc *droite,
|
||||||
|
Image_Desc *stereo, int kr, int kg, int kb);
|
||||||
|
<dd>La fonction un peu plus évoluée.
|
||||||
|
Les deux images sources sont converties en gris
|
||||||
|
avec trois podérations, et l'image destination est faite en
|
||||||
|
utilisant les canaux rouge et bleu.
|
||||||
|
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="filtres">filtres</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Ou trouver les filtres kivonbien pour se confectionner les lunettes ?
|
||||||
|
A vrai dire, je ne sais pas encore. J'ai eu les miennes dans un
|
||||||
|
"repas enfant" du McDo. A vous de trouvez les votres...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bah, euh... Avec un peu de chance, vous trouverez un exemple
|
||||||
|
dans <a href="http://tontonth.free.fr/pov/hf/">ça</a>, mais ce ne
|
||||||
|
sera peut-être pas très clair.
|
||||||
|
Une explication un peu plus
|
||||||
|
<a href="http://la.buvette.org/POV/stereo-2.html">détaillée</a>
|
||||||
|
a été écrite en anglais de cuisine.
|
||||||
|
Il existe aussi quelques fonctions
|
||||||
|
pour traiter les <a href="img-povhf15.html">height fields</a>
|
||||||
|
de Povray. Et d'autres méthodes de
|
||||||
|
combinaisons d'images
|
||||||
|
<a href="img-combine.html">là</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est en relief, je patche comme un Spleyt.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
78
Doc/img-television.html
Normal file
78
Doc/img-television.html
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: effets television</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libtthimage, krabulator, television">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1>libimage / effets télévision</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 27 janvier 2014</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Voici quelques autres <a href="img-effets.html">effets</a>
|
||||||
|
plus ou moins destinés à simuler ce que l'on pouvait voir
|
||||||
|
dans l'ancien temps sur les écrans cathodiques de nos
|
||||||
|
bonnes vieilles télévisions du temps de Guy Lux et Léon Zitrone.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TV_grink(Image_Desc *src, Image_Desc *dst, int yo);
|
||||||
|
<dd>?
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TV_grok(Image_Desc *src, Image_Desc *dst, int yo);
|
||||||
|
<dd>?
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TV_gruud(Image_Desc *src, Image_Desc *dst, int yo);
|
||||||
|
<dd>Pour le moment, le paramètre ne sert à rien et doit être mis à 0.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TV_griiiz(Image_Desc *src, Image_Desc *dst, int yo);
|
||||||
|
<dd>Encore un truc sorti d'on ne sait où, et qui fait n'importe quoi.
|
||||||
|
Le paramètre ne sert à rien et doit être mis à 0.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TV_veryold(Image_Desc *src, Image_Desc *dst, int p1, int p2, int p3);
|
||||||
|
<dd>Je ne sais pas à quoi servent les paramètres, mais ils ne doivent
|
||||||
|
pas être trop petits.
|
||||||
|
|
||||||
|
<dt>int
|
||||||
|
Image_TV_pix_0(Image_Desc *src, Image_Desc *dst, int w, int h, int grey);
|
||||||
|
<dd>Pixelisation rectangulaire (w * h) avec un fond 'grey' entres les
|
||||||
|
gros pixels.
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_TV_cplus_proto(Image_Desc *src, Image_Desc *dst, int p);
|
||||||
|
<dd>Première tentative (novembre 2013) d'une simulation de la
|
||||||
|
première chaine de télévision cryptée française. Le paramètre joue
|
||||||
|
sur la taille du décalage des lignes.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pour essayer d'y voir plus clair dans mes simulations d'écran de
|
||||||
|
vieilles télévisions, il y a une page de
|
||||||
|
<a href="http://la.buvette.org/images/television.html">démonstration</a>
|
||||||
|
utilisant l'outil adéquat.
|
||||||
|
Tout pour me donner l'envie d'aller plus loin dans ce domaine.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class=footer>
|
||||||
|
[ <a href="http://tboudet.free.fr/cv.html">tTh dessine</a> ]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
221
Doc/img-texte.html
Normal file
221
Doc/img-texte.html
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les textes</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, fontes bitmap, truetype">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1 align=center>libimage / les textes</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 14 décembre 2015</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#16x24">16 x 24</a>]
|
||||||
|
[<a href="#gropixels">gropixels</a>]
|
||||||
|
[<a href="#outils">outils</a>]
|
||||||
|
[<a href="img-asciiart.html">ascii art</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="fontes">Fontes internes</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Pas grand chose pour le moment...
|
||||||
|
Juste quelques fonctions instables et un
|
||||||
|
kludge permettant de tester ces fonctions. J'en arrive à me demander
|
||||||
|
si la doc <a href="image77.html#textes">f77</a> n'est pas plus complète.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p><b>Attention !!!</b> Le 26 mars 2008, il y a eu un gros chargement dans
|
||||||
|
la logique interne du bouzin: il faut maintenant soit spécifier un nom
|
||||||
|
de fonte quand on trace une chaine, soit charger préalablement une fonte
|
||||||
|
si on ne spécifie pas de nom. J'espère que ce changement ne va pas
|
||||||
|
casser trop de trucs. <i>Hélas, espoir déçu, j'ai un bronx infernal dans
|
||||||
|
plein de trucs...</i>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>Dans le tarball, il y a deux fontes 8x8 nommée <tt>libimage.fonte</tt>
|
||||||
|
et <tt>8x8thin</tt>.
|
||||||
|
A priori, les fontes 8x8 prévues pour la console Linux doivent fonctionner,
|
||||||
|
et vous pourrez les reconnaitre à leur taille de 2048 octets.
|
||||||
|
Il n'y a pas encore de quoi les visualiser dans tout ce fatras,
|
||||||
|
mais je suis en train de coder ça...</p>
|
||||||
|
|
||||||
|
<center><img src="all8x8chars.png"></center>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_load_fnt8x8(char *nomfnt, U_BYTE *ou, int flags);
|
||||||
|
<dd>Chargement d'une fonte 8x8 dans une zone statique, on ne peut
|
||||||
|
donc avoir qu'une seule police en même temps, mais ça va bientôt
|
||||||
|
changer. Les paramètres <tt>ou</tt> et <tt>flags</tt> sont inutilisés
|
||||||
|
pour le moment. Si le nom du fichier fonte est NULL, une fonte par défaut
|
||||||
|
sera utilisée.
|
||||||
|
|
||||||
|
<dt>int Image_trace_caractere(Image_Desc *im, int x, int y, int code);
|
||||||
|
<dd>Cette fonction est très primitive. Elle trace en <i>noir</i> sur un
|
||||||
|
fond <i>blanc</i> en utilisant la fonte courante.
|
||||||
|
|
||||||
|
<dt>int Image_trace_chaine_0(Image_Desc *im, char *txt, int x, int y,
|
||||||
|
RGBA *paper, RGBA *ink, int flags);
|
||||||
|
<dd>Bah, pas grand chose à dire, à part que le paramètre 'flags' doit
|
||||||
|
être mis à zéro,
|
||||||
|
et que cette fonction est <i>obsolète</i>, et l'exprime clairement.
|
||||||
|
|
||||||
|
<dt>int Image_trace_chaine_1(Image_Desc *im, char *txt, int x, int y,
|
||||||
|
char *nomfonte, RGBA *paper, RGBA *ink);
|
||||||
|
<dd>Voici donc la nouvelle fonction pour écrire du texte 8x8 dans une image.
|
||||||
|
Elle fonctionne en gros comme son ancêtre, mais permet en plus de spécifier
|
||||||
|
un nom de fonte. Si celui-ci est <tt>NULL</tt>, c'est la dernière fonte
|
||||||
|
chargée qui sera utilisée.
|
||||||
|
|
||||||
|
<dt>int Image_texte_fonte(char *nomfonte, char *nomtga);
|
||||||
|
<dd>Donc voilà le kludge. La seule valeur humainement supportable
|
||||||
|
pour le paramètre <i>nomfonte</i>, c'est <tt>NULL</tt> et les insultes
|
||||||
|
parce que <font color="orange">çamarchpa</font>, c'est pour moi.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="16x24"><h2>fonte 16 x 24</h2></a>
|
||||||
|
|
||||||
|
<p>Enfin, ça y est, un support primitif des grosses fontes bitmap en
|
||||||
|
16x24 est en train de voir le jour. La description des dessins de caractères
|
||||||
|
se fait dans un fichier texte spécialement prévu pour être manipulable
|
||||||
|
par des outils Unix tels que <tt>awk</tt>. Ce fichier est une suite
|
||||||
|
d'enregistrements contenant le code ascii du caractère considéré, suivi
|
||||||
|
de 24 lignes contenant les pixels. Exemple:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre class="code">
|
||||||
|
60
|
||||||
|
................
|
||||||
|
................
|
||||||
|
................
|
||||||
|
..........**....
|
||||||
|
.........***....
|
||||||
|
........**......
|
||||||
|
.......**.......
|
||||||
|
......**........
|
||||||
|
.....**.........
|
||||||
|
....**..........
|
||||||
|
...**...........
|
||||||
|
..***...........
|
||||||
|
...**...........
|
||||||
|
....**..........
|
||||||
|
.....**.........
|
||||||
|
......**........
|
||||||
|
.......**.......
|
||||||
|
........**......
|
||||||
|
.........***....
|
||||||
|
..........**....
|
||||||
|
................
|
||||||
|
................
|
||||||
|
................
|
||||||
|
................
|
||||||
|
</pre>
|
||||||
|
<p>Le nombre en première ligne est le code ascii du caractère, exprimé en
|
||||||
|
décimal. En fait, ce n'est pas exactement le code ascii, puisque ça peut
|
||||||
|
très bien être de l'iso-8859-1 par exemple, donc un code compris entre 0 et
|
||||||
|
255. Et les 24 lignes suivantes contienne le dessin du caractère fait
|
||||||
|
avec des points et des étoiles.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_t16x24_txtload(char *fontname, U_BYTE *zone, int flag);
|
||||||
|
<dd>Chargement d'une fonte à partir du fichier texte décrit plus haut.
|
||||||
|
Le second paramètre est inutilisé. Le contenu de la fonte est stockée
|
||||||
|
dans une zone statique privé, il est donc actuellement impossible
|
||||||
|
de gérer plusieurs fontes simultanément. Le <tt>flag</tt> à 1 demande
|
||||||
|
l'effacement préalable de cette zone statique.
|
||||||
|
|
||||||
|
<dt>int Image_t16x24_pltch_exp(Image_Desc *img, int lettre, int xpos, int ypos);
|
||||||
|
<dd>Dessin d'un caractère 16 x 24 dans une image, les noms des paramètres sont
|
||||||
|
explicites. Les couleurs sont fixées. Aucun contrôle de débordement n'est fait.
|
||||||
|
|
||||||
|
<dt>int Image_t16x24_pltch_1(Image_Desc *img, int lettre, int xpos, int ypos,
|
||||||
|
RGBA *pap, RGBA *ink, int flags);
|
||||||
|
<dd>Dessin d'un caractère 16 x 24 dans une image, les noms des paramètres sont
|
||||||
|
presque explicites. La police doit être chargée à l'avance. <tt>flags</tt>
|
||||||
|
doit être mis à 0. Aucun contrôle de débordement n'est fait.
|
||||||
|
|
||||||
|
<dt>int Image_t16x24_allchars(char *fontname, char *tganame, int flag);
|
||||||
|
<dd>Construction d'une image contenant le dessin des 256 caractères.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Voilà, c'est tout pour le moment, mais ça permet déja de faire des
|
||||||
|
choses. Je continue à réfléchir aux nouveaux <i>features</i> que je
|
||||||
|
vais pouvoir inventer. Restez à l'écoute...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<center><img src="all16x24chars.png"></center>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="outils"><h2>outils 16 x 24</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Hop, hop, quelques trucs supplémentaires. Dans le
|
||||||
|
<a href="libimage.tar.gz">tarball</a>, vous trouvererez <tt>fnt8to16</tt> qui
|
||||||
|
convertit une fonte 8x8 en fonte 16x24. C'est un peu cru, il n'y a pas
|
||||||
|
d'interpolation, mais ça donne de quoi faire.<p>
|
||||||
|
<center><img src="bigthin.gif" width=488 height=181></center>
|
||||||
|
<p>Dans le tarball vous trouverez la fonte ci-dessus (fichier
|
||||||
|
<tt>16x24thin</tt>) qui sera installé comme les autres fontes.
|
||||||
|
Dans les
|
||||||
|
<a href="img-outils.html#mires">outils associés</a>,
|
||||||
|
le programme <tt>tga_mires</tt> peut maintenant tracer le contenu d'une
|
||||||
|
fonte 16x24, modulo le parsage des paramètres de la ligne de commande.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="gropixels">texte en 'gropixels'</a></h2>
|
||||||
|
|
||||||
|
<p>Une nouveauté de 2014 (codenamed: <i>rouille de seiche</i>)
|
||||||
|
encore très immature. Ces fonctions utilisent les
|
||||||
|
<a href="#fontes">fontes</a> 8x8 mise aux échelles en X et en Y,
|
||||||
|
sans interpolation, d'où le nom de <b>gropixels</b>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_trace_big_char_0(Image_Desc *im,
|
||||||
|
int x, int y, int code, int kx, int ky);
|
||||||
|
<dd>Première version du tracé de caractère 'gropixels'.
|
||||||
|
Les paramètres <tt>kx</tt> et <tt>ky</tt> sont les coefficients de
|
||||||
|
mise à l'échelle. Il est nécessaire d'avoir préalablement chargé
|
||||||
|
une fonte avec <tt>Image_load_fnt8x8</tt>.
|
||||||
|
|
||||||
|
<dt>int Image_txt1_big_0(Image_Desc *im, char *txt, int x, int y,
|
||||||
|
int xf, int yf);
|
||||||
|
<dd>Première version du tracé de chaine en 'gropixels'. Hélas, pas
|
||||||
|
de contrôle des limites, donc coredump presque assuré.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bah, euh... <a href="http://www.freetype.org/">Freetype</a>, par exemple.
|
||||||
|
Mais je suis aussi à la recherche d'un format de fontes 'bitmap' évolué,
|
||||||
|
bien documenté et disposant d'un éditeur sous <b>X11</b> facile
|
||||||
|
d'utilisation.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
<b>tTh</b>, éleveur de police depuis 1998...<br>
|
||||||
|
Toujours à la recherche de trucs à faire dans le domaine
|
||||||
|
de l'ascii-art...<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
88
Doc/img-warp.html
Normal file
88
Doc/img-warp.html
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: les warps</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, Boudet, warps, interpolate">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<a name="top"><h1 align=center>libimage / les warps</h1></a>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour: 30 janvier 2009</tt><br>
|
||||||
|
<i>
|
||||||
|
<a href="http://tboudet.free.fr/libimage/img-warp.html">#</a> et
|
||||||
|
<a href="http://la.buvette.org/devel/libimage/img-warp.html">#</a>
|
||||||
|
</i>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="menuhaut">
|
||||||
|
[<a href="libimage.html">libimage</a>]
|
||||||
|
[<a href="#interpolate">interpolate</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bon, soyons clair, je suis une grosse faignasse, et ici vous ne trouverez
|
||||||
|
rien d'utilisable. Enfin si, un peu, mais fluctuant.
|
||||||
|
Il faut donc <a href="img-devel.html#utsl">utsl</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_center_rotate(Image_Desc *src, Image_Desc *dst, double angle);
|
||||||
|
<dd>rotulationne de la image. L'angle est exprimé en degrés. L'interpolation
|
||||||
|
est foireuse.
|
||||||
|
|
||||||
|
<dt>
|
||||||
|
int Image_shift_xy(Image_Desc *src, Image_Desc *dst, int ox, int oy);
|
||||||
|
<dd>Déplacement de l'image en X et Y. J'ai l'impression que ça ne marche pas
|
||||||
|
si les offsets sont négatifs...
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="interpolate"><h2>interpolate</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<tt>/O\ <i>oh ma tête...</i></tt>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<a name="zoom"><h2>zoom</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<tt>/O\ <i>oh ma tête...</i></tt>
|
||||||
|
</p>
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>int Image_essai_zoom(Image_Desc *src, Image_Desc *dst, int kx, int ky, int flags)
|
||||||
|
<dd>Fonction à prototype fluctuant destiné à essayer des trucs et
|
||||||
|
des machins zoomants.
|
||||||
|
</dl>
|
||||||
|
<p class="HDP"<a href="#top">haut de page</a></p>
|
||||||
|
<a name="liens"><h2>liens</h2></a>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Bah, euh... Non, rien...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="http://astronomy.swin.edu.au/~pbourke/colour/bicubic/">Interpolation Bicubique</a>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter:<br>
|
||||||
|
<a href="mailto:oulala@chez.com">oulala@chez.com</a><br>
|
||||||
|
Si votre demande est interpolée, je patche comme un gruik.<br>
|
||||||
|
<a href="#top">haut de page</a></p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
78
Doc/libimage.css
Normal file
78
Doc/libimage.css
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* limimage.css - new 6 juillet 2007
|
||||||
|
*/
|
||||||
|
|
||||||
|
body { background-color: #f8f8f8; color: #220000;
|
||||||
|
margin-left: 28px; margin-right: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { color: #335533;
|
||||||
|
text-align: center; font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 { color: #335533;
|
||||||
|
/* border-top-color: #335533; border-top-style: solid; border-top-width: 1px; */
|
||||||
|
text-align: center; font-family: sans-serif;
|
||||||
|
padding-bottom: 3px;
|
||||||
|
}
|
||||||
|
h3 { color: #335533; font-family: sans-serif;}
|
||||||
|
h4 { color: #335533; font-family: sans-serif;}
|
||||||
|
h5 { color: #335533; text-align: center; font-family: sans-serif;}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-indent: 2em; text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* boite pour les menus de haut de page */
|
||||||
|
p.menuhaut {
|
||||||
|
text-align: center;
|
||||||
|
border-color: #808000; border-style: dotted;
|
||||||
|
border-width: 1px;
|
||||||
|
margin: 10px; padding: 10px;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.footer {
|
||||||
|
text-align: right; color: #000000; font-size: smaller;
|
||||||
|
border-color: #000000; border-style: solid; border-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.explique {
|
||||||
|
color: #101010;
|
||||||
|
background-color: #a0a0a0;
|
||||||
|
margin: 10px;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.HDP {
|
||||||
|
background-color: #909090;
|
||||||
|
text-align: center;
|
||||||
|
font-family: sans-serif; font-size: smaller;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto dt {
|
||||||
|
background-color: #ceeece;
|
||||||
|
color: #003300;
|
||||||
|
font-family: monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.proto dd {
|
||||||
|
color: #000030;
|
||||||
|
text-indent: 0; text-align: justify;
|
||||||
|
padding-bottom: 1em;
|
||||||
|
margin-right: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr { color: red }
|
||||||
|
tt { background-color: #dcffdc; color: #000022; }
|
||||||
|
|
||||||
|
pre.code {
|
||||||
|
background-color: black; color: lightgreen;
|
||||||
|
padding-bottom: 7px; padding-top: 7px;
|
||||||
|
margin-left: 80px; margin-right: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table { border-collapse: collapse; }
|
||||||
|
|
||||||
|
td,th { padding: 5px; background: #ffffff; border: 1px solid; }
|
||||||
|
|
241
Doc/libimage.html
Normal file
241
Doc/libimage.html
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>libimage: la doc, enfin !</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="libimage.css">
|
||||||
|
<meta name="generator" content="Vim et huile de phalange">
|
||||||
|
<meta name="keywords" content="libimage, oulala, buv3tt3, Boudet, Targa">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1><a name="top">Libimage : <i>La Doc</i></a></h1>
|
||||||
|
|
||||||
|
<p align=center>
|
||||||
|
<tt>dernière mise à jour : 15 décembre 2015</tt><br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class=menuhaut>
|
||||||
|
[<a href="#primitives">primitives</a>]
|
||||||
|
[<a href="README.txt">README</a>]
|
||||||
|
[<a href="img-fichiers.html">fichiers</a>]
|
||||||
|
[<a href="#tools">tools</a>]
|
||||||
|
[<a href="img-cadres.html">cadres</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="img-effets.html#effets">effets</a>]
|
||||||
|
[<a href="img-op2x2.html">op2x2</a>]
|
||||||
|
[<a href="img-texte.html">texte</a>]
|
||||||
|
[<a href="img-showdiff.html">showdiff</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="img-filtres.html">filtres</a>]
|
||||||
|
[<a href="img-calculs.html">calculs</a>]
|
||||||
|
[<a href="img-plotters.html">plotteurs</a>]
|
||||||
|
[<a href="#scale">scale</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="img-combine.html">combine</a>]
|
||||||
|
[<a href="img-patterns.html">patterns</a>]
|
||||||
|
[<a href="img-couleurs.html#couleurs">couleurs</a>]
|
||||||
|
[<a href="img-couleurs.html#palettes">palettes</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="img-dither.html">dithering</a>]
|
||||||
|
[<a href="img-operat.html">opérations</a>]
|
||||||
|
[<a href="img-alpha.html">alpha</a>]
|
||||||
|
[<a href="img-povhf15.html">hf 15</a>]
|
||||||
|
[<a href="img-bitplane.html">bitplane</a>]
|
||||||
|
<br>
|
||||||
|
[<a href="image77.html">fortran</a>]
|
||||||
|
[<a href="img-df3.html">density file</a>]
|
||||||
|
[<a href="#messages">messages</a>]
|
||||||
|
[<a href="img-exemples.html">exemples</a>]
|
||||||
|
[<a href="#liens">liens</a>]
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<b>libimage</b> est une librairie de traitement de les images que j'ai
|
||||||
|
fabriquée moi-même avec mon
|
||||||
|
<a href="http://www.vim.org/"><tt>vim</tt></a> et mes
|
||||||
|
<a href="http://gcc.gnu.org/"><tt>gcc & g77</tt></a> tout seul
|
||||||
|
comme un grand. Tout n'est pas documenté, loin de là, seulement les fonctions
|
||||||
|
que j'utilise actuellement. Par contre, la
|
||||||
|
<a href="img-devel.html#compilation">procédure d'installation</a> est à peu
|
||||||
|
près explicite.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Il est difficile de décrire ce que font certaines fonctions, vous devrez donc
|
||||||
|
les essayer par vous même pour vous faire une idée. Et en cas de doute, vous
|
||||||
|
avez les
|
||||||
|
<a href="libimage.tar.gz">sources</a>
|
||||||
|
à votre disposition.
|
||||||
|
<a href="img-devel.html#utsl">utsl</a>.
|
||||||
|
Il existe aussi quelques <a href="#exemples">exemples</a> d'utilisation
|
||||||
|
dans la vie réelle.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="primitives">primitives</a></h2>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
<dt>Image_Desc * Image_alloc(int w, int h, int type)
|
||||||
|
<dd>Création d'une nouvelle image. Les types valides sont:
|
||||||
|
IMAGE_GREY, IMAGE_RGB et IMAGE_RGBA. En fait, les images en niveaux de
|
||||||
|
gris sont très mal gérées... <b>!!!</b> le contenu de l'image n'est
|
||||||
|
pas initialisé. Son contenu est allé à Toire. Il faut utiliser
|
||||||
|
<tt>Image_clear</tt> pour l'effacer.
|
||||||
|
|
||||||
|
<dt>int Image_DeAllocate(Image_Desc *)
|
||||||
|
<dd>Restitution de la mémoire 'pixel' d'une image. Attention, la mémoire
|
||||||
|
du descripteur n'est <b>pas</b> rendue. C'est probablement un
|
||||||
|
<a href="img-devel.html#bugs">bug</a>.
|
||||||
|
|
||||||
|
<dt>Image_Desc * Image_clone(Image_Desc *i, int copie)
|
||||||
|
<dd>Crée une copie d'une image de même type. Si le flag <tt>copie</tt> est
|
||||||
|
<small>TRUE</small>, les pixels sont recopiés dans la nouvelle image.
|
||||||
|
|
||||||
|
<dt>int Image_clear( Image_Desc *image, int r, int g, int b)
|
||||||
|
<dd>Remplissage d'une image avec les <i>rgb</i> fournis.
|
||||||
|
<i>28 Déc 2001</i>: si un canal alpha est présent, il est mis à 0.
|
||||||
|
|
||||||
|
<dt>int Image_plotRGB(Image_Desc *i, int x, int y, int r, int g, int b)
|
||||||
|
<dd>Ecrire un pixel dans une image, avec vérification des limites.
|
||||||
|
|
||||||
|
<dt>int Image_plot_channel(Image_Desc *img, char channel, int x, int y, int value)
|
||||||
|
<dd>Cette fonction permet de modifier un seul des canaux de l'image.
|
||||||
|
Le paramètre 'channel' est un <tt>char</tt> 'r', 'g', 'b', 'R', 'G' ou 'B'.
|
||||||
|
Le canal <i>alpha</i> n'est pas encore géré.
|
||||||
|
|
||||||
|
<dt>int Image_getRGB(Image_Desc *i, int x, int y, int *pr, int *pg, int *pb)
|
||||||
|
<dd>Lecture d'un pixel. En rajoutant un 'A' au nom de la fonction, et un
|
||||||
|
quatrième pointeur sur <tt>int</tt>, on peut aussi lire le canal
|
||||||
|
<a href="img-alpha.html">alpha</a>.
|
||||||
|
|
||||||
|
<dt>Image_print_version(int flag)
|
||||||
|
<dd>Affiche sur <tt>stdout</tt> la version de la librairie. Si <tt>flag</tt>
|
||||||
|
est != 0, il y a des informations complémentaires. Si flag > 1 certaines
|
||||||
|
options de compilation et/ou d'installation sont aussi affichées.
|
||||||
|
Vous disposez également d'un <tt>#define IMAGE_VERSION_STRING</tt>
|
||||||
|
utilisable dans un
|
||||||
|
<i>printf ("version %s\n", IMAGE_VERSION_STRING);</i> de bon aloi.
|
||||||
|
Attention quand même, si vous utilisez ce <tt>#define</tt> dans un programme
|
||||||
|
lié avec la bibliothèque dynamique, <i>puis</i> que vous passiez à une
|
||||||
|
version différente de la libimage, la version affichée par votre programme
|
||||||
|
ne sera plus cohérente.<br>
|
||||||
|
Pour un rapport de bug, le numéro de version est <b>indispensable</b>.
|
||||||
|
C'est auprès de <a href="mailto:oulala@chez.com">moi</a> qu'il faut raler.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="tools">tools</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Différentes routines utilitaires, destinées avant tout à la mise au point
|
||||||
|
des applications, mais qui ne sont pas interdites aux <i>péones</i>, loin
|
||||||
|
de là.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>int Image_dump_descriptor(Image_Desc *im, char *text);
|
||||||
|
<dd>Affiche, de façon désordonnée, les informations disséminées dans un
|
||||||
|
descripteur d'image <i>Image_desc</i>.
|
||||||
|
|
||||||
|
<dt>int Image_dump_rect(Image_Rect *rect, char *texte, int flag);
|
||||||
|
<dd>Affiche le contenu d'une structure Image_Rect. Un flag différent de
|
||||||
|
zéro rajoute l'autre coin (<i>pan</i>) et la surface.
|
||||||
|
|
||||||
|
<dt>int Image_fabrique_une_mire(Image_Desc *im, RGB_map *map);
|
||||||
|
<dd>Euh, ça devrait en principe marcher avec une image 320x200.
|
||||||
|
Il existe d'autres <a href="img-mires.html">mires</a> dans le truc.
|
||||||
|
|
||||||
|
<dt>Les chronomètres:</dt>
|
||||||
|
<dd>On dispose de 42 chronomètres. Etonnant, non?<br>
|
||||||
|
<tt>void Image_start_chrono(char *texte, int num_chrono);</tt><br>
|
||||||
|
<tt>long Image_stop_chrono(char *texte, int num_chrono);</tt><br>
|
||||||
|
Maintenant, comment les utiliser avec précision et certitude est un exercice
|
||||||
|
laissé à nos lecteurs... Sans compter que certains sont réservés par tTh.</dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Il y a aussi, dans le genre relativement utile,
|
||||||
|
le <a href="img-marquage.html">marquage</a> des images.
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="messages">messages</a></h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A la lecture du fichier <tt>tthimage.h</tt> vous avez constaté une série de #define
|
||||||
|
pour les codes d'erreur. La fonction <tt>char * Image_err2str(int codeerr)</tt>
|
||||||
|
permet d'obtenir un texte explicatif. Vous pouvez par exemple écrire:
|
||||||
|
</p>
|
||||||
|
<pre class="code">
|
||||||
|
foo = Image_blabla(gniark);
|
||||||
|
printf("retour from hell: %s\n", Image_err2str(foo));
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="proto">
|
||||||
|
|
||||||
|
<dt>char * Image_err2str(int codeerr);
|
||||||
|
<dd>Conversion du code numérique de retour des fonctions en texte
|
||||||
|
klingonesquement compréhensible. Si la valeur envoyée n'est pas
|
||||||
|
gérée, un message bidon est fabriqué à la volée.
|
||||||
|
<dt>void Image_print_error(char * texte, int err);
|
||||||
|
<dd>Affichage d'un message décrivant une erreur. Si le texte commence par
|
||||||
|
le caractère '-', c'est sur <i>stdout</i>, sinon, c'est sur <i>stderr</i>.
|
||||||
|
Les numéros d'erreur sont à décrypter dans <tt>tthimage.h</tt>.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Je suis vraiment désolé, mais je suis totalement incapable
|
||||||
|
de fournir une liste détaillée, avec des explications, de tout
|
||||||
|
les codes d'erreur. Pourtant, ça serait bien comfortable.</p>
|
||||||
|
|
||||||
|
<p class="HDP"><a href="#top">haut de page</a></p>
|
||||||
|
<h2><a name="exemples">exemples</a></h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>J'ai <i>enfin</i> confectionné quelques
|
||||||
|
<a href="img-outils.html">utilitaires</a> pour la ligne de
|
||||||
|
commande qui appellent des primitives de la librairie. Ils sont
|
||||||
|
<a href="img-outils.tar.gz">ici</a> et
|
||||||
|
je vous invite à en lire les sources. C'est un bon point de départ pour
|
||||||
|
apprendre à utiliser le bidule.
|
||||||
|
<li>Le postprocessing des images des
|
||||||
|
<i>Sources de Tar</i> a été
|
||||||
|
fait avec libimage: combinaison de deux variantes de l'image faite par
|
||||||
|
POV et divers effets de cadres.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
En conclusion, vous êtes livré à vous-même avec ce kludge, mais j'espère
|
||||||
|
que vous trouverez autant de <i>fun</i> à l'utiliser que j'en ai à le faire.
|
||||||
|
Et je vous rappelle que ce logiciel est diffusé sous la bienveillante
|
||||||
|
protection de la <b>DMZIZ licence</b> que vous pouvez trouver
|
||||||
|
<a href="http://la.buvette.org/textes/dmdzz.html">par là</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2><a name="liens">liens</a></h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Pour les fous de la fabrication d'images:
|
||||||
|
<a href="http://www.povray.org/">Povray</a> et
|
||||||
|
<a href="http://www.fractint.org/">Fractint</a>.
|
||||||
|
<li>Pour les cinglés de la manipulation d'image:
|
||||||
|
<a href="http://www.gimp.org/">Gimp</a> qui roulaize grave pour les
|
||||||
|
clicketeurs, et <a href="http://www.imagemagick.org/">image-magick</a>
|
||||||
|
pour les batcheurs.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="footer">
|
||||||
|
vous pouvez me contacter sur IRC : <tt>tth@freenode#tetalab</tt> <br>
|
||||||
|
Si votre demande est raisonnable, je patche à donf.<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,6 +1,10 @@
|
|||||||
# libtthimage
|
# libtthimage
|
||||||
|
|
||||||
Du code né dans les années 1986 sur un Kenitec 286 sous msdos 4 ou 5, qui s'est un jour retrouvé dans un Linux (kernel 0.99) et qui végète depuis ~2005
|
Du code né dans les années 1986 sur un Kenitec 286 sous msdos 4 ou 5,
|
||||||
|
qui s'est un jour retrouvé dans un Linux (kernel 0.99) et qui végète
|
||||||
|
depuis ~2005. Il est venu le temps de le remettre en route.
|
||||||
|
|
||||||
Il a pour but de brotcher les images avec vigueur.
|
Il a pour but de brotcher les images avec vigueur.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
12
foo.c
Normal file
12
foo.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "tthimage.h"
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
Image_print_version(2);
|
||||||
|
return 0;
|
||||||
|
}
|
595
image.c
Normal file
595
image.c
Normal file
@ -0,0 +1,595 @@
|
|||||||
|
/*
|
||||||
|
fonctions de bases pour la librairie 'libimage'
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
(g) 1992,2003 - Thierry Boudet - aka Oulala
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "tthimage.h"
|
||||||
|
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
void
|
||||||
|
Image_print_version(int flag)
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
fflush(stdout);
|
||||||
|
printf("-+- This is the `image' library v%s (dwtfywl 2022) tTh\n",
|
||||||
|
IMAGE_VERSION_STRING);
|
||||||
|
if (flag)
|
||||||
|
{
|
||||||
|
/* this information is only correct IF you touch image.c before
|
||||||
|
* running 'make' utility */
|
||||||
|
printf(" + compiled : %s, %s\n", __DATE__, __TIME__);
|
||||||
|
}
|
||||||
|
if (flag > 1)
|
||||||
|
{
|
||||||
|
printf(" + DESTDIR = %s\n", DESTDIR);
|
||||||
|
printf(" + SHAREDIR = %s\n", SHAREDIR);
|
||||||
|
printf(" + CC OPTS = %s\n", CC_OPTS);
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
/* OMFG, this is a gnuism ! */
|
||||||
|
if ( (ptr=getenv("MALLOC_CHECK_")) != NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "-+- libimage: malloc check is set to %s\n", ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr,
|
||||||
|
"Warning! this version of libimage is compiled with DEBUG_LEVEL=%d\n",
|
||||||
|
DEBUG_LEVEL);
|
||||||
|
#if FORCE_ABORT
|
||||||
|
fprintf(stderr, "Warning! this version of libimage is compiled with FORCE_ABORT!\n");
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* This function create a new channel for an image.
|
||||||
|
* Before version 0.4.9 it was a private function, but
|
||||||
|
* the module 'alpha.c' need access to it.
|
||||||
|
*
|
||||||
|
* ... So I make it "semi-public" ... */
|
||||||
|
int Image_alloc_pixels(unsigned char ***pix, int w, int h);
|
||||||
|
/*
|
||||||
|
* pour le moment, pas de code retour en cas
|
||||||
|
* d'erreur, mais un exit(1) brutal.
|
||||||
|
*/
|
||||||
|
int Image_alloc_pixels(unsigned char ***pix, int w, int h)
|
||||||
|
{
|
||||||
|
int foo;
|
||||||
|
unsigned char **lignes, *ptr;
|
||||||
|
|
||||||
|
lignes = (unsigned char **)malloc(sizeof(unsigned char *) * h);
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, " alloc pixels for plane @ %p -> %p\n", pix, lignes);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*pix = lignes; /* setting the indirected return value here
|
||||||
|
so we can use 'lignes' in the loop. */
|
||||||
|
|
||||||
|
for (foo=0; foo<h; foo++)
|
||||||
|
{
|
||||||
|
if ((ptr=(unsigned char *)malloc(sizeof(unsigned char) * w))==NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: malloc failed for image line %d\n", __func__, foo);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*lignes++ = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* This function allocate an image and return a pointer
|
||||||
|
* on the structure who describe the image.
|
||||||
|
* - - - > don't "free" this pointer, please.
|
||||||
|
*/
|
||||||
|
Image_Desc *
|
||||||
|
Image_alloc(int width, int height, int type)
|
||||||
|
{
|
||||||
|
Image_Desc *header;
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, "allocation for an image %dx%d, type:%d\n",
|
||||||
|
width, height, type);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( (header=(Image_Desc *)calloc(sizeof(Image_Desc), 1)) == NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Image_Alloc (%s) err malloc header\n", __FILE__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, " header is at @ %p\n", header);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
strcpy(header->name, "");
|
||||||
|
header->nb_planes = type;
|
||||||
|
header->width = width; header->height = height;
|
||||||
|
#if IMGCOMMENT
|
||||||
|
strcpy(header->comment, "* libimg is (dwtfywl) tontonTh 2022 *");
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* The old 'Xv' image viewer does not like .TGA with a comment.
|
||||||
|
*/
|
||||||
|
strcpy(header->comment, "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
header->type = type;
|
||||||
|
header->Rpix = header->Gpix = header->Bpix = header->Apix = NULL;
|
||||||
|
|
||||||
|
header->magic = MAGIC_OF_IMAGE;
|
||||||
|
|
||||||
|
header->nbcols = 0;
|
||||||
|
header->idx_palette = 0;
|
||||||
|
header->errmsg = header->modified = 0;
|
||||||
|
|
||||||
|
/* nouveau 18 Sept 2001 */
|
||||||
|
header->fx = header->fy = 0.0;
|
||||||
|
header->fw = (double)width;
|
||||||
|
header->fh = (double)height;
|
||||||
|
|
||||||
|
/* new 12 Nov 2001 - see 'turtle.c' */
|
||||||
|
header->rt = header->gt = header->bt = 42;
|
||||||
|
header->xt = (double)width / 2.0;
|
||||||
|
header->yt = (double)height / 2.0;
|
||||||
|
header->at = 0; /* canal alpha, 0 est-il la bonne valeur ? */
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case IMAGE_GREY:
|
||||||
|
Image_alloc_pixels(&header->Rpix, width, height);
|
||||||
|
for (foo=0; foo<256; foo++)
|
||||||
|
{
|
||||||
|
header->palette[0][foo] = foo;
|
||||||
|
header->palette[1][foo] = foo;
|
||||||
|
header->palette[2][foo] = foo;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IMAGE_RGB:
|
||||||
|
Image_alloc_pixels(&header->Rpix, width, height);
|
||||||
|
Image_alloc_pixels(&header->Gpix, width, height);
|
||||||
|
Image_alloc_pixels(&header->Bpix, width, height);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IMAGE_RGBA:
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "WARNING! allocating an image with alpha channel,\n");
|
||||||
|
#endif
|
||||||
|
Image_alloc_pixels(&header->Rpix, width, height);
|
||||||
|
Image_alloc_pixels(&header->Gpix, width, height);
|
||||||
|
Image_alloc_pixels(&header->Bpix, width, height);
|
||||||
|
Image_alloc_pixels(&header->Apix, width, height);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "***** %s alloc image: %d is an unknow type *****\n",
|
||||||
|
__FILE__, type);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getenv("MALLOC_CHECK_") != NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "-+- libimage %s %d: alloc %p\n",
|
||||||
|
__FILE__, __LINE__, header);
|
||||||
|
}
|
||||||
|
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
This fonction build another image from a model.
|
||||||
|
*/
|
||||||
|
Image_Desc *
|
||||||
|
Image_clone (Image_Desc *src, int copy)
|
||||||
|
{
|
||||||
|
Image_Desc *image;
|
||||||
|
|
||||||
|
if ( src==NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Image_clone: source descriptor is NULL\n");
|
||||||
|
exit(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
image = Image_alloc(src->width, src->height, src->type);
|
||||||
|
if ( image==NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Image_clone: cloned descriptor is NULL\n");
|
||||||
|
exit(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* we have to transfer a few attributes ...
|
||||||
|
*/
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, "clone %p to %p, no copy of attributes ?\n", src, image);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
image->fx = src->fx; image->fy = src->fy;
|
||||||
|
image->fw = src->fw; image->fh = src->fh;
|
||||||
|
|
||||||
|
if (copy == 1)
|
||||||
|
{
|
||||||
|
Image_copy(src, image);
|
||||||
|
}
|
||||||
|
image->modified = 0; /* 8 Fev 01 */
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
int Image_copy_comment(Image_Desc *s, Image_Desc *d)
|
||||||
|
{
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "%s ( %p -> %p )\n", __func__, s, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* TODO check the validity of the comment, there _must_ be a '\0' inside */
|
||||||
|
|
||||||
|
memcpy(d->comment, s->comment, IMG_OBJCOMMENT_LEN);
|
||||||
|
|
||||||
|
return FUNC_IS_ALPHA;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* Helas, cette fonction ne marche que sur les images RGB
|
||||||
|
* et comment la rendre compatible tout-types sans tout casser ?
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
Image_clear( Image_Desc *image, int r, int g, int b )
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (image->type == IMAGE_RGB)
|
||||||
|
{
|
||||||
|
for (y=0; y<image->height; y++)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* XXX here we can go faster with a few memset
|
||||||
|
*/
|
||||||
|
for (x=0; x<image->width; x++)
|
||||||
|
{
|
||||||
|
(image->Rpix[y])[x] = r;
|
||||||
|
(image->Gpix[y])[x] = g;
|
||||||
|
(image->Bpix[y])[x] = b;
|
||||||
|
/* Bon, et le canal Alpha, il devient quoi ? */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; /* ok, this 'return' here is a "spleyterie" :) */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image->type == IMAGE_RGBA)
|
||||||
|
{
|
||||||
|
for (y=0; y<image->height; y++)
|
||||||
|
{
|
||||||
|
for (x=0; x<image->width; x++)
|
||||||
|
{
|
||||||
|
(image->Rpix[y])[x] = r;
|
||||||
|
(image->Gpix[y])[x] = g;
|
||||||
|
(image->Bpix[y])[x] = b;
|
||||||
|
(image->Apix[y])[x] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; /* ok, this 'return' here is a "spleyterie" :) */
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "%s : invalid image type %d : %s\n", __func__,
|
||||||
|
image->type, Image_type2str(image->type));
|
||||||
|
return IMAGE_BAD_TYPE;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* every image in memory have a comment field, who is writen
|
||||||
|
* in TGA and PNM file when image is saved.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
Image_set_comment(Image_Desc *image, char *text)
|
||||||
|
{
|
||||||
|
if (strlen(text) > IMG_OBJCOMMENT_LEN)
|
||||||
|
return STRING_TOO_LONG;
|
||||||
|
strcpy(image->comment, text);
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/* 10 nov 2001: no #define for this not-so-magic 254 value ? */
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
int
|
||||||
|
Image_plot_gray(Image_Desc *img, int x, int y, int v)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERRPLOT X %4d Y %4d %d\n", x, y, v);
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
(img->Rpix[y])[x] = (uint8_t)v;
|
||||||
|
/* POURQUOI on ne plotte qu'une composante ? XXX */
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Image_plotRGB(Image_Desc *img, int x, int y, int r, int g, int b)
|
||||||
|
{
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 2
|
||||||
|
fprintf(stderr, "PLOTRGB %d %d\n", x, y);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Errplot RGB X=%d, Y=%d %d, %d, %d\n", x, y, r, g, b);
|
||||||
|
#if FORCE_ABORT
|
||||||
|
abort();
|
||||||
|
#endif
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
(img->Rpix[y])[x] = (uint8_t)(r&0xff);
|
||||||
|
(img->Gpix[y])[x] = (uint8_t)(g&0xff);
|
||||||
|
(img->Bpix[y])[x] = (uint8_t)(b&0xff);
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Image_plotRGBA(Image_Desc *img, int x, int y, int r, int g, int b, int a)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
/* may be an #if DEBUG_LEVEL here ? */
|
||||||
|
fprintf(stderr, "Errplot RGBA X %4d Y %4d %d, %d, %d, %d\n",
|
||||||
|
x, y, r, g, b, a);
|
||||||
|
#if FORCE_ABORT
|
||||||
|
abort();
|
||||||
|
#endif
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
(img->Rpix[y])[x] = (uint8_t)(r&0xff);
|
||||||
|
(img->Gpix[y])[x] = (uint8_t)(g&0xff);
|
||||||
|
(img->Bpix[y])[x] = (uint8_t)(b&0xff);
|
||||||
|
(img->Apix[y])[x] = (uint8_t)(a&0xff);
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
int
|
||||||
|
Image_getRGB(Image_Desc *img, int x, int y, int *pr, int *pg, int *pb)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
/* may be an #if DEBUG_LEVEL here ? */
|
||||||
|
fprintf(stderr, "ERR GETRGB X %4d Y %4d\n", x, y);
|
||||||
|
#if FORCE_ABORT
|
||||||
|
abort();
|
||||||
|
#endif
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pr = (int)((img->Rpix[y])[x]);
|
||||||
|
*pg = (int)((img->Gpix[y])[x]);
|
||||||
|
*pb = (int)((img->Bpix[y])[x]);
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
int
|
||||||
|
Image_getRGBA(Image_Desc *img, int x, int y, int *pr, int *pg, int *pb, int *pa)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERR GETRGBA X %4d Y %4d\n", x, y);
|
||||||
|
#if FORCE_ABORT
|
||||||
|
abort();
|
||||||
|
#endif
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (img->type != IMAGE_RGBA)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Image get RGBA: bad image type: %d, %s\n",
|
||||||
|
img->type, Image_type2str(img->type));
|
||||||
|
#if FORCE_ABORT
|
||||||
|
abort();
|
||||||
|
#endif
|
||||||
|
exit(7); /* et un code d'erreur, ça irais pas mieux */
|
||||||
|
}
|
||||||
|
*pr = (int)((img->Rpix[y])[x]);
|
||||||
|
*pg = (int)((img->Gpix[y])[x]);
|
||||||
|
*pb = (int)((img->Bpix[y])[x]);
|
||||||
|
*pa = (int)((img->Apix[y])[x]);
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* ecriture d'une des composantes de l'image. (new=2000-02-01)
|
||||||
|
*
|
||||||
|
* 15 mars 2003: l'interface Fortran est dans 'img77g.c' XXX
|
||||||
|
*/
|
||||||
|
int Image_plot_channel(Image_Desc *img, char channel, int x, int y, int value)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
#if DEBUG_LEVEL
|
||||||
|
fprintf(stderr, "ERR PLOTCHANNEL X %4d Y %4d\n", x, y);
|
||||||
|
#endif
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (channel)
|
||||||
|
{
|
||||||
|
case 'r': case 'R': (img->Rpix[y])[x] = (uint8_t)(value&0xff); break;
|
||||||
|
case 'g': case 'G': (img->Gpix[y])[x] = (uint8_t)(value&0xff); break;
|
||||||
|
case 'b': case 'B': (img->Bpix[y])[x] = (uint8_t)(value&0xff); break;
|
||||||
|
case 'a': case 'A': (img->Apix[y])[x] = (uint8_t)(value&0xff); break;
|
||||||
|
default: return WRONG_CHANNEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
lecture d'une des composantes de l'image.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
Image_R_pixel(Image_Desc *img, int x, int y)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERR READ R PIX X%d Y%d\n", x, y);
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
return (int)((img->Rpix[y])[x]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Image_G_pixel(Image_Desc *img, int x, int y)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERR READ G PIX X%d Y%d\n", x, y);
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
return (int)((img->Gpix[y])[x]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Image_B_pixel(Image_Desc *img, int x, int y)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERR READ B PIX X%d Y%d\n", x, y);
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
return (int)((img->Bpix[y])[x]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Image_A_pixel(Image_Desc *img, int x, int y)
|
||||||
|
{
|
||||||
|
if ( x<0 || y<0 || x>=img->width || y>=img->height )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERR A PIX X%d Y%d\n", x, y);
|
||||||
|
return OUT_OF_IMAGE;
|
||||||
|
}
|
||||||
|
return (int)((img->Apix[y])[x]);
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* no boundary control ?
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
Image_pixel_copy(Image_Desc *s, int x, int y, Image_Desc *d, int i, int j)
|
||||||
|
{
|
||||||
|
|
||||||
|
(d->Rpix[j])[i] = (s->Rpix[y])[x];
|
||||||
|
(d->Gpix[j])[i] = (s->Gpix[y])[x];
|
||||||
|
(d->Bpix[j])[i] = (s->Bpix[y])[x];
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
* Le nom de cette fonction n'a pas trop de rapport avec ce qu'elle fait,
|
||||||
|
* mais elle permet de faire reculer Crash Coredump.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
Image_compare_desc(Image_Desc *a, Image_Desc *b)
|
||||||
|
{
|
||||||
|
char *fmt = "Image at %p have no 'Dead Beef' in it\n";
|
||||||
|
|
||||||
|
if ( (a==NULL) || (b==NULL) ) return NULL_DESCRIPTOR;
|
||||||
|
|
||||||
|
if ( a->magic != MAGIC_OF_IMAGE )
|
||||||
|
{
|
||||||
|
fprintf(stderr, fmt, a);
|
||||||
|
return NOT_AN_IMAGE_DESC;
|
||||||
|
}
|
||||||
|
if ( b->magic != MAGIC_OF_IMAGE )
|
||||||
|
{
|
||||||
|
fprintf(stderr, fmt, a);
|
||||||
|
return NOT_AN_IMAGE_DESC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( a->width != b->width ) return DIFFERENT_WIDTH;
|
||||||
|
if ( a->height!= b->height) return DIFFERENT_HEIGHT;
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
||||||
|
/*
|
||||||
|
Cette fonction ne rend pas toute la memoire
|
||||||
|
Pour le moment, le header n'est pas restitue.
|
||||||
|
|
||||||
|
le probleme, si on desalloue le header
|
||||||
|
c'est qu'il reste un pointeur fou chez
|
||||||
|
l'appelant ...
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
Image_DeAllocate(Image_Desc *im)
|
||||||
|
{
|
||||||
|
int line;
|
||||||
|
|
||||||
|
if (getenv("MALLOC_CHECK_") != NULL) {
|
||||||
|
fprintf(stderr, "-+- libimage %s %d: free %p\n",
|
||||||
|
__FILE__, __LINE__, im);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( im->magic != MAGIC_OF_IMAGE ) {
|
||||||
|
fprintf(stderr, "at %p, there was no 'Dead Beef' to deallocate\n", im);
|
||||||
|
/* emergency exit */
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, ">> de-allocating image %p, cross your fingers.\n", im);
|
||||||
|
fprintf(stderr, " %p %p %p %p\n", im->Rpix, im->Gpix, im->Bpix, im->Apix);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
im->magic = 0L; /* mark dirty/invalid. */
|
||||||
|
im->type = IMAGE_NONE; /* -1, et tusors */
|
||||||
|
|
||||||
|
if (im->Rpix != NULL)
|
||||||
|
{
|
||||||
|
for (line=0; line<im->height; line++)
|
||||||
|
if (im->Rpix[line] != NULL) free(im->Rpix[line]);
|
||||||
|
free(im->Rpix); im->Rpix = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (im->Gpix != NULL)
|
||||||
|
{
|
||||||
|
for (line=0; line<im->height; line++)
|
||||||
|
if (im->Gpix[line] != NULL) free(im->Gpix[line]);
|
||||||
|
free(im->Gpix); im->Gpix = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (im->Bpix != NULL)
|
||||||
|
{
|
||||||
|
for (line=0; line<im->height; line++)
|
||||||
|
if (im->Bpix[line] != NULL) free(im->Bpix[line]);
|
||||||
|
free(im->Bpix); im->Bpix = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (im->Apix != NULL)
|
||||||
|
{
|
||||||
|
for (line=0; line<im->height; line++)
|
||||||
|
if (im->Apix[line] != NULL) free(im->Apix[line]);
|
||||||
|
free(im->Apix); im->Apix = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if DEBUG_LEVEL > 1
|
||||||
|
fprintf(stderr, "DeAllocate >> are we alive ?\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return OLL_KORRECT;
|
||||||
|
}
|
||||||
|
/*::------------------------------------------------------------------::*/
|
1383
tthimage.h
Normal file
1383
tthimage.h
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user