Compare commits

..

No commits in common. "7c378f1f7e7e95206fec2840531753d80d6ed8c5" and "faf008265cddd5ff560ae1557459e385e9499383" have entirely different histories.

5 changed files with 45 additions and 170 deletions

View File

@ -138,18 +138,18 @@ un format complètement inconnu, puisque je viens de l'inventer
Tout d'abord, nous devons déclarer et garnir quelques variables
pour gérer la machinerie interne.
\begin{lstlisting}
\begin{verbatim}
int width = 640, height = 480;
char *fname = "exemple.fimg";
FloatImg fimg;
\end{lstlisting}
\end{verbatim}
Ensuite, nous enchainerons trois étapes : création de l'image
en mémoire centrale, initialisation des valeurs de chaque pixel à 0.0,
et pour conclure, enregistrement dans un fichier\footnote{Au format
ésotérique, mais très véloce.} binaire.
\begin{lstlisting}
\begin{verbatim}
foo = fimg_create(&fimg, width, height, FIMG_TYPE_RGB);
if (foo) {
fprintf(stderr, "create floatimg -> %d\n", foo);
@ -161,7 +161,7 @@ if (foo) {
fprintf(stderr, "dump fimg -> %d\n", foo);
exit(1);
}
\end{lstlisting}
\end{verbatim}
Une fois ce code enrobé dans un \texttt{main()}, compilé et exécuté,
@ -261,7 +261,7 @@ sont décrits par un ensemble
de données (certains appelent ça des \textsl{metadatas}) regroupées
dans une jolie structure que nous allons examiner dès maintenant.
\begin{lstlisting}
\begin{verbatim}
/* in memory descriptor */
typedef struct {
int width;
@ -272,7 +272,7 @@ typedef struct {
float *R, *G, *B, *A;
int reserved;
} FloatImg;
\end{lstlisting}\index{FloatImg}
\end{verbatim}\index{FloatImg}
Les deux premiers champs sont \textsl{obvious}.
Le troisième est le type d'image : pour le moment, il y en a trois
@ -280,12 +280,12 @@ qui sont définis\footnote{et plus ou moins bien gérés\dots} :
gris, rgb et rgba\index{rgba}.
Les constantes adéquates sont dans \texttt{floatimg.h}
\begin{lstlisting}
\begin{verbatim}
#define FIMG_TYPE_GRAY 1
#define FIMG_TYPE_RGB 3
#define FIMG_TYPE_RGBA 4
#define FIMG_TYPE_RGBZ 99
\end{lstlisting}
\end{verbatim}
Un peu plus loin, nous avons les pointeurs vers les
différents \textsl{pixmaps} de l'image. En principe l'organisation
@ -324,10 +324,10 @@ dynamique de la mémoire qui sera occupée par tous ces pixels flottants,
ce qui est un sujet parfois délicat\footnote{GC or not GC ?}.
Elle est donc faite, à la base, par ces deux fonctions~:
\begin{lstlisting}
\begin{verbatim}
int fimg_create(FloatImg *fimg, int w, int h, int type);
int fimg_destroy(FloatImg *fimg);
\end{lstlisting}
\end{verbatim}
L'appelant doit lui-même gérer le descripteur d'image (une structure
C décrite plus haut) en le considérant comme un type semi-opaque dont
@ -341,10 +341,10 @@ pouvoir aussi exister à long terme en étant stocké dans la matrice
est tout aussi pertinent. Il y a deux opérations qui supportent le
reste des transits ram/ps.
\begin{lstlisting}
\begin{verbatim}
int fimg_dump_to_file(FloatImg *fimg, char *fname, int notused);
int fimg_load_from_dump(char *fname, FloatImg *where);
\end{lstlisting}
\end{verbatim}
Recharger une image depuis un fichier nécessite que celle-ci et
l'image de destination en mémoire
@ -365,11 +365,11 @@ simple, une fonction qui enchaine ces deux actions
(allocation, puis lecture), et s'utilise
comme ça :
\begin{lstlisting}
\begin{verbatim}
FloatImg head;
memset(&head, 0, sizeof(FloatImg));
foo = fimg_create_from_dump("lena.fimg", &head);
\end{lstlisting}
\end{verbatim}
Si la valeur retournée est différente de 0, c'est que quelque
chose s'est mal passé.
@ -383,9 +383,9 @@ Bon, vous avez une image latente, et vous souhaitez dessiner dessus
(ou dedans ?) avec vos encres flottantes ?
Il y a des fonctions pour ça, par exemple~:
\begin{lstlisting}
\begin{verbatim}
int fimg_plot_rgb(FloatImg *head, int x, int y, float r, float g, float b);
\end{lstlisting}
\end{verbatim}
Les paramètres sont explicites, mais leur validité doit être
sévèrement controlée par l'appelant. Il y a une fonction
@ -420,13 +420,13 @@ est un nombre en double précision donnant la valeur
maximale \textsl{supposée} de l'image source,
valeur qui peut être déterminée de plusieurs manières.
\begin{lstlisting}
\begin{verbatim}
/* source in lib/contrast.c */
int fimg_square_root(FloatImg *s, FloatImg *d, double maxval);
int fimg_power_2(FloatImg *s, FloatImg *d, double maxval);
int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval);
int fimg_cos_010(FloatImg *s, FloatImg *d, double maxval);
\end{lstlisting}
\end{verbatim}
Si vous souhaitez rajouter votre propre méthode de modification
@ -475,10 +475,10 @@ de pixel flottant.
Très prochainement, le retour du blitter\index{blitter}.
\begin{lstlisting}
\begin{verbatim}
/* module funcs/geometry.c */
int fimg_halfsize_0(FloatImg *src, FloatImg *dst, int notused);
\end{lstlisting}
\end{verbatim}
Attention lors de l'appel, le descripteur \texttt{dst} ne doit pas
contenir d'image, et doit être effacé avec un bon
@ -510,9 +510,9 @@ l'utilisation du codage \textsc{ascii}\index{ascii}
(alors qu'on pourrait mettre du binaire, plus compact) y est
pour quelque chose.
\begin{lstlisting}
\begin{verbatim}
int fimg_save_as_pnm(FloatImg *head, char *fname, int flags);
\end{lstlisting}
\end{verbatim}
Le bit \texttt{0} du paramètre \texttt{flags} mis à \texttt{1} demande
à la fonction de faire la mise à l'échelle avec le couple
@ -533,9 +533,9 @@ 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.
\begin{lstlisting}
\begin{verbatim}
int fimg_save_as_png(FloatImg *src, char *outname, int flags);
\end{lstlisting}
\end{verbatim}
Tous les flags doivent être à zéro.
@ -561,10 +561,10 @@ dans des domaines annexes,
tels que l'interprétation d'arguments dans la ligne de commande ou un
fichier de configuration.
\begin{lstlisting}
\begin{verbatim}
int parse_WxH(char *str, int *pw, int *ph)
int parse_double(char *str, double *dptr)
\end{lstlisting}
\end{verbatim}
La fonction \texttt{int format\_from\_extension(char *fname)} examine un
@ -580,27 +580,20 @@ To be continued\index{XXX}
Quelques routines qui servent futilement à \textsl{brotcher} les images.
\begin{lstlisting}
\begin{verbatim}
int fimg_killcolors_a(FloatImg *fimg, float fval);
int fimg_killcolors_b(FloatImg *fimg, float fval);
\end{lstlisting}
\end{verbatim}
% ----------------------------------
\subsection{Filtrages}\index{filtrage}
\subsection{Filtrages}
Pour commencer, il faut que je réfléchisse au traitement
des bordures des images.
Ensuite que je débuggue\index{bug} cette fonction~:
To be done\index{XXX}, et il faut que je réfléchisse au traitement
des bords d'image.
\begin{lstlisting}
int fimg_lissage_2x2(FloatImg *img);
\end{lstlisting}
To be continued\index{XXX}\dots
% ----------------------------------
@ -621,7 +614,7 @@ Pour simplifier les choses, nous n'allons traiter que les
images de type \textsc{FIMG\_TYPE\_RGB}, de loin le plus
répandu par les temps qui courent.
\begin{lstlisting}
\begin{verbatim}
int fimg_example(FloatImg *s, FloatImg *d, float value)
{
int size, index;
@ -640,7 +633,7 @@ for (idx=0; idx<size; idx++) {
return 0;
}
\end{lstlisting}
\end{verbatim}
Je vous laisse imaginer les dégats que peut faire cette
fontion en utilisation réelle. Mieux, je vous propose
@ -655,7 +648,7 @@ de fonctions prévues à cet effet..
% -------------------------------------------------------------------
\section{Les outils}\label{outils}
\textsf{3615mavie} : sur des projets comme celui-ci, qui travaillent
\textsl{3615mavie} : sur des projets comme celui-ci, qui travaillent
in-fine sur des objets que l'on peut considérer comme « physiques »,
il est important de passer à une utilisation
normale\footnote{Il y a une vie en dehors de git.} et construire
@ -701,7 +694,7 @@ devra être donné avec l'option \texttt{-k F.F} avec une valeur par défaut
\subsection{png2fimg}\index{png2fimg}\label{png2fimg}
Grosse panne\index{bug} à réparer.
Grosse panne à réparer.
\begin{verbatim}
tth@debian:~/TMP/floatimg$ png2fimg A.png foo.fimg
@ -760,9 +753,8 @@ sera lisible avec le sélecteur \texttt{-L}.
\subsection{fimgops}\index{fimgops}\label{fimgops}
Quelques opérations diverses entre deux images, qui doivent être
de la même taille, et uniquement du type \textsl{RGB}. Certaines
de ces opérations peuvent avoir un effet étrange sur vos images,
par exemple si un pixel se retrouve avec une valeur négative.
de la même taille, et du même type \textsl{pour le moment,
uniquement RGB}.
\begin{verbatim}
usage:
@ -778,7 +770,6 @@ options:
-g convert output to gray
-k N.N set float value
-v increase verbosity
-X explosive action
\end{verbatim}
Pour des operateurs paramétrable (comme \texttt{mix}), le paramêtre
@ -800,9 +791,6 @@ D'un autre coté, écrire un greffon d'import/export pour
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
seul devrait être nécessaire ?}
\subsection{fimg2gray}\index{fimg2gray}\label{fimg2gray}
Nous avons vu dans ce document que chaque image flottante pouvait
@ -848,6 +836,7 @@ nous faisons la somme de plusieurs centaines de ces images ?
ACCU="quux.fimg"
TMPF="tmp.fimg"
DIMS="320 240"
mkfimg $ACCU $DIMS
for i in {0..1000}
do

View File

@ -2,7 +2,7 @@
* floatimg.h
*/
#define FIMG_VERSION 94
#define FIMG_VERSION 93
/*
* in memory descriptor
@ -80,9 +80,6 @@ int fimg_minimum(FloatImg *a, FloatImg *b, FloatImg *d);
int fimg_maximum(FloatImg *a, FloatImg *b, FloatImg *d);
int fimg_killborders(FloatImg *img);
int fimg_lissage_2x2(FloatImg *img);
/* 'sfx0' module */
int fimg_killcolors_a(FloatImg *fimg, float fval);
int fimg_killcolors_b(FloatImg *fimg, float fval);

View File

@ -10,8 +10,6 @@
int fimg_lissage_2x2(FloatImg *img)
{
int x, y, offset;
float cr, cg, cb;
float *pr, *pg, *pb;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p )\n", __func__, img);
@ -19,77 +17,15 @@ fprintf(stderr," type %d size %dx%d\n", img->type,
img->width, img->height);
#endif
pr = img->R; pg = img->G; pb = img->B;
for (y=1; y<img->height; y++) {
for (y=1; y < img->height-1; y++) {
for (x=1; x < img->width-1; x++) {
for (x=1; x<img->width; x++) {
offset = x + (y * img->width);
cr = pr[offset] + pr[offset+1] +
pr[offset+img->width] + pr[offset+img->width+1];
cg = pg[offset] + pg[offset+1] +
pg[offset+img->width] + pg[offset+img->width+1];
cb = pb[offset] + pb[offset+1] +
pb[offset+img->width] + pb[offset+img->width+1];
pr[offset] = cr / 4.0;
pg[offset] = cg / 4.0;
pb[offset] = cb / 4.0;
}
}
return 0;
}
/* -------------------------------------------------------------------- */
int fimg_killborders(FloatImg *img)
{
int idx, h, w, o;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p )\n", __func__, img);
fprintf(stderr," type %d size %dx%d\n", img->type,
img->width, img->height);
#endif
h = img->height; w = img->width;
for (idx=0; idx<h; idx++) {
#define FAST 1
#if FAST
img->R[idx*w] = 0.0;
img->G[idx*w] = 0.0;
img->B[idx*w] = 0.0;
img->R[(idx*w)+w-1] = 0.0;
img->G[(idx*w)+w-1] = 0.0;
img->B[(idx*w)+w-1] = 0.0;
#else
fimg_plot_rgb(img, 0, idx, 0.0, 0.0, 0.0);
fimg_plot_rgb(img, w-1, idx, 0.0, 0.0, 0.0);
#endif
}
o = w * (h - 1);
for (idx=0; idx<w; idx++) {
#if FAST
img->R[idx] = 0.0;
img->G[idx] = 0.0;
img->B[idx] = 0.0;
img->R[idx+o] = 0.0;
img->G[idx+o] = 0.0;
img->B[idx+o] = 0.0;
#else
fimg_plot_rgb(img, idx, 0, 0.0, 0.0, 0.0);
fimg_plot_rgb(img, idx, h-1, 0.0, 0.0, 0.0);
#endif
}
return -1;
}
/* -------------------------------------------------------------------- */

View File

@ -12,40 +12,6 @@ int verbosity;
float global_fvalue;
/* --------------------------------------------------------------------- */
int essai_filtrage(char *infile)
{
FloatImg fimg;
int foo, idx;
char buffer[100];
if (NULL != infile) {
fprintf(stderr, "loading %s\n", infile);
foo = fimg_create_from_dump(infile, &fimg);
if (foo) {
fprintf(stderr, "%s: err load '%s'\n", __func__, infile);
return foo;
}
}
else {
fprintf(stderr, "%s is creating the picz\n", __func__);
fimg_create(&fimg, 512, 512, FIMG_TYPE_RGB);
fimg_draw_something(&fimg);
}
foo = fimg_save_as_pnm(&fimg, "source.pnm", 0);
for (idx=0; idx<20; idx++) {
foo = fimg_lissage_2x2(&fimg);
foo = fimg_killborders(&fimg);
sprintf(buffer, "filter%03d.pnm", idx);
foo = fimg_save_as_pnm(&fimg, buffer, 0);
}
fimg_destroy(&fimg);
return 0;
}
/* --------------------------------------------------------------------- */
int essai_geometrie(char *infile)
{
@ -207,7 +173,6 @@ return 0;
int main(int argc, char *argv[])
{
int foo, opt;
char *filename;
puts("++++++++++++++++++++++++++++++++");
@ -221,14 +186,9 @@ while ((opt = getopt(argc, argv, "hk:v")) != -1) {
}
}
fprintf(stderr, "argc %d optind %d\n", argc, optind);
filename = NULL;
if (1 == argc-optind) filename = argv[optind];
foo = essai_filtrage(filename);
foo = essai_geometrie("foo.fimg");
if (foo) {
fprintf(stderr, "====> %d\n", foo);
fprintf(stderr, "************ %d\n", foo);
}
return 0;

View File

@ -5,20 +5,13 @@ _Attention_, ce ne sont que des exemples, pas forcément adaptés
## shoot.sh
Front-end de prise de photographies floues. C'est un script assez
simple à configurer : les valeurs par défaut fonctionnent.
Il faut juste renseigner l'emplacement de votre `grabviseq`
en début du script.
Front-end de prise de photographies floues
## contrast-test.sh
Démonstrateur d'ajustements de contraste. La configuration est
en dur dans le code.
Démonstrateur d'ajustements de contraste.
## echomix.sh
Comment générer des videos psychotiques avec un peu de bash.
Ce script est expliqué dans la documentation PDF.