diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index 4566a26..dc0dbdb 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -77,7 +77,7 @@ IRC de Freenode. \textbf{Attention !} ce document commence par une bonne rafale de technique parfois hardue\footnote{gni?}. -Vous avez parfaitement le droit de auter directement à +Vous avez parfaitement le droit de sauter directement à la page \pageref{outils} pour quelque chose de plus concret. % ------------------------------------------------------------------- @@ -194,7 +194,7 @@ lesquels sont décrits en page \pageref{outils}. % ------------------------------------------------------------------- \section{Installation} -\textit{Attention, ça devient un peu gore.} +\textit{Attention, ça devient un peu gore. Myrys, punk, toussa\dots} \subsection{Prérequis} @@ -209,6 +209,8 @@ comme \textsc{gnu}/make\index{make}. Une connaissance de base de l'utilisation du shell\index{shell} et de l'écriture de Makefile's sera un plus. +Il faut aussi savoir où trouver le code. + \subsection{Compilation} Un script \texttt{build.sh} permet de construire approximativement @@ -474,6 +476,8 @@ de pixel flottant. \subsection{Géométrie}\index{géométrie}\label{geometrie} Très prochainement, le retour du blitter\index{blitter}. +Et pour attendre, un truc improbable, voire même +inutile. \begin{lstlisting} /* module funcs/geometry.c */ @@ -485,6 +489,15 @@ contenir d'image, et doit être effacé avec un bon \texttt{memset(\&result, 0, sizeof(FloatImg));} bien senti. Et le résultat est très moyen : il n'y a pas d'interpolation. +\begin{lstlisting} +/* module funcs/geometry.c */ +int fimg_extract_0(FloatImg *src, FloatImg *dst, int x, int y); +\end{lstlisting} + +Contrairement à la fonction précédente, celle-ci demande absolument une +image de destination initialisée aux dimensions (largeur et hauteur) +désirées. + % ---------------------------------- \subsection{Exportation \& Importation}\index{export}\label{export} @@ -532,12 +545,13 @@ Actuellement, on peut enregistrer uniquement en mode RGB, 8 bits par composante, mais on a quand même une bonne compression, ça compense. J'utilise \textsl{libpnglite} avec qui j'ai un peu de mal à suivre. Mais je me soigne. Le mode 16 bits va bientôt arriver. +On peut aussi songer à l'export de metadatas. \begin{lstlisting} int fimg_save_as_png(FloatImg *src, char *outname, int flags); \end{lstlisting} -Tous les flags doivent être à zéro. +Tous les flags doivent être à zéro. Sinon, ça foire parfois. \subsubsection{Vers/depuis TIFF}\index{TIFF} @@ -549,7 +563,8 @@ To be done\index{XXX} \subsubsection{Vers FITS}\index{FITS} -Essentiellement des images d'astronomie. +Ce format est essentiellement utilisé pour stocker des images +d'astronomie. To be done\index{XXX} @@ -571,9 +586,9 @@ La fonction \texttt{int format\_from\_extension(char *fname)} examine un nom defichier tel que \texttt{lena.xxx}, et retourne, si la partie \texttt{xxx} un éventuel nombre positif, dont les valeurs sont dans floatimg.h le valeureux. -Les extensions connues sont : fimg, png, pnm et tiff. +Les extensions actuellement connues sont : fimg, png, pnm et tiff. -To be continued\index{XXX} +To be continued\index{XXX}\dots \subsection{Effets}\index{sfx} @@ -594,13 +609,45 @@ int fimg_killcolors_b(FloatImg *fimg, float fval); Pour commencer, il faut que je réfléchisse au traitement des bordures des images. -Ensuite que je débuggue\index{bug} cette fonction~: +Ensuite que je débuggue\index{bug} ces deux fonctions~: \begin{lstlisting} int fimg_lissage_2x2(FloatImg *img); +int fimg_killborders(FloatImg *img); \end{lstlisting} -To be continued\index{XXX}\dots +Bon, oké, ça marche ? Passons à l'tape suivante. +La convolution avec une matrice 3x3, c'est possible. +Et pas trop compliqué à faire. +Bon, il reste le souci avec les bordures, souci qui ne peut +être que temporaire, mais ésotérique à fixer. + +Passons maintenant aux choses sérieuses, et définissons la +description d'un filtre 3x3. + +\begin{verbatim} +typedef struct { + float matrix[9]; + float mult; + float offset; + } FimgFilter3x3; +\end{verbatim} + +L'usage des champs \texttt{mult} et \texttt{offset} n'est pas +clairement défini. Le prototype de la fonction de filtrage +non plus, mais assez simpe quand même. Source et destination +ne peuvent désigner la même image, et le champ \texttt{matrix} +du filtre doit contenir des valeurs cohérentes. + +\begin{verbatim} +int fimg_filter_3x3(FloatImg *src, FloatImg *dst, FimgFilter3x3 *filtr) +\end{verbatim} + +Comme dans la plupart des cas, la gestion des valeurs négatives +de pixel est laissé au hasard. Quoique, il doit bien exister +quelques solutions de contournement : clamping ou shift ? + +\textsl{To be continued\index{XXX}\dots} % ---------------------------------- @@ -787,6 +834,8 @@ La véracité mathématique n'est pas garantie. Et n'oubliez pas que les valeurs négatives peuvent être la cause de \textsl{glitches} de qualitay. +% ------------------------- + \subsection{fimg2png, fimg2pnm, fimg2tiff} \index{fimg2png}\label{fimg2png} \index{fimg2pnm}\label{fimg2pnm} @@ -797,7 +846,7 @@ vers des choses plus directement utilisables. À condition que le code soit écrit et documenté. D'un autre coté, écrire un greffon d'import/export pour -Gimp\index{Gimp} ou Imagemagick\index{Imagemagick} ou Krita\index{Krita} +Gimp\index{Gimp} ou ImageMagick\index{ImageMagick} ou Krita\index{krita} ne devrait pas être trop difficile. Des volontaires ? \textsl{D'ailleurs, pourquoi $n$ logiciels indépendants alors q'un @@ -821,7 +870,7 @@ C'est par ces frottements de techniques ayant du sens que les choses seront acquises. \begin{itemize} -\item Import/export au format \textsc{tiff}\index{tiff}. +\item Import/export au format \textsc{tiff}\index{TIFF}. \item Remplacer le « fait-maison » par \textsc{libnetpnm}\index{pnm}. \textsl{[en cours]}. \item Compléter les traitements mathémathiques (eg le gamma\index{gamma}). @@ -1094,6 +1143,39 @@ l'\textsc{api} de \textsc{v4l2}, et donc, que ce que raconte ce logiciel doit être pris avec des pincettes. En particulier la liste des résolutions disponibles. +% ------------------------------------------------------------------- +\section{À l'extérieur} + + +\subsection{ImageMagick}\index{ImageMagick} + +Pour afficher notre format .fimg exotique avec \texttt{display}, vous +devez mettre ce bout de XML\index{XML} dans le fichier +\texttt{\$HOME/.magick/delegates.xml}~: + +\begin{verbatim} + + + + +\end{verbatim} + +C'est juste un hack rapide, qui ne fonctionne pas très bien avec +d'autres commande de IM, comme identify, qui a tendance à +raconter un peu n'importe quoi... Je compte donc sur le bouquin +de \textsl{Brunus} pour avancer... + +\subsection{Gimp}\index{Gimp} + +Mmmmm... Ça semble un peu plus compliqué. D'un autre coté, il +faut faire ça en \textbf{C}, ce qui ne peut être négatif. + +\subsection{Et encore ?}\index{krita}\index{geeqie} + +Il y a d'autres logiciels pour lesquels écrire une fonction d'importation +serait bien~: \textsl{Geeqie}, un visualiseur d'image fort pratique, ou +\textsl{Krita} qui semble avoir les faveurs de dessinateurs de talent. + % ------------------------------------------------------------------- \section{Et pour la suite ?} diff --git a/funcs/Makefile b/funcs/Makefile index d4d538c..98875dc 100644 --- a/funcs/Makefile +++ b/funcs/Makefile @@ -1,6 +1,6 @@ #--------------------------------------------------------------- -COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0 +COPT = -Wall -fpic -g -pg -no-pie -DDEBUG_LEVEL=0 DEPS = ../floatimg.h Makefile OBJS = fimg-png.o fimg-tiff.o misc-plots.o filtrage.o utils.o \ fimg-libpnm.o rampes.o sfx0.o geometry.o diff --git a/funcs/filtrage.c b/funcs/filtrage.c index 2d7100c..bd6b418 100644 --- a/funcs/filtrage.c +++ b/funcs/filtrage.c @@ -7,7 +7,75 @@ #include "../floatimg.h" /* -------------------------------------------------------------------- */ -int fimg_lissage_2x2(FloatImg *img) +/* -------------------------------------------------------------------- */ +/* -------------------------------------------------------------------- */ +int fimg_filter_3x3(FloatImg *src, FloatImg *dst, FimgFilter3x3 *filtr) +{ +int x, y, w, h, of; +float *pr, *pg, *pb; /* alias for src pix filds */ +float *M; /* alias of filter matrix */ +double dval; + +#if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( %p %p %p)\n", __func__, s, d, filtr); +#endif + +/* aliasing some vars for cleaner code */ +pr = src->R; pg = src->G; pb = src->B; +w = src->width; h = src->height; +M = filtr->matrix; + +for (y=1; y < h-1; y++) { + + for (x=1; x < w-1; x++) { + + of = x + (y * w); + + dval = M[0] * pr[of-(w+1)] + + M[1] * pr[of-w] + + M[2] * pr[of-(w-1)] + + M[3] * pr[of-1] + + M[4] * pr[of] + + M[5] * pr[of+1] + + M[6] * pr[of+(w+1)] + + M[7] * pr[of+w] + + M[8] * pr[of+(w-1)] ; + + dst->R[of] = dval; + + dval = M[0] * pg[of-(w+1)] + + M[1] * pg[of-w] + + M[2] * pg[of-(w-1)] + + M[3] * pg[of-1] + + M[4] * pg[of] + + M[5] * pg[of+1] + + M[6] * pg[of+(w+1)] + + M[7] * pg[of+w] + + M[8] * pg[of+(w-1)] ; + + dst->G[of] = dval; + + dval = M[0] * pb[of-(w+1)] + + M[1] * pb[of-w] + + M[2] * pb[of-(w-1)] + + M[3] * pb[of-1] + + M[4] * pb[of] + + M[5] * pb[of+1] + + M[6] * pb[of+(w+1)] + + M[7] * pb[of+w] + + M[8] * pb[of+(w-1)] ; + + dst->B[of] = dval; + } +} + +return -1; +} +/* -------------------------------------------------------------------- */ +/* + * this is the more shifting hack on the block. + */ +static int fimg_lissage_2x2_a(FloatImg *img) { int x, y, offset; float cr, cg, cb; @@ -66,7 +134,6 @@ if (img->type != FIMG_TYPE_RGB) { return -99; } - h = img->height; w = img->width; for (idx=0; idx %d\n", foo); + fprintf(stderr, "Filtre 2x2 ====> %d\n", foo); + } +*/ + +foo = essai_filtrage_3x3(filename); +if (foo) { + fprintf(stderr, "Filtre 3x3 ====> %d\n", foo); } +fprintf(stderr, "++++++++++++++ end of pid %d\n", getpid()); return 0; } /* --------------------------------------------------------------------- */ diff --git a/lib/Makefile b/lib/Makefile index 83d026a..4dbdf43 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -2,7 +2,7 @@ # building the base library # -COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0 +COPT = -Wall -fpic -g -pg -no-pie -DDEBUG_LEVEL=0 OBJS = fimg-core.o fimg-pnm.o fimg-file.o fimg-math.o \ fimg-timers.o operators.o fimg-2gray.o \