Compare commits

..

No commits in common. "9f42b813e77d6ee086291f11eb2b50c5ec2db2be" and "a5d4e5cc98b8db4a2be6cd3353ae8ee475eb7807" have entirely different histories.

5 changed files with 18 additions and 191 deletions

1
.gitignore vendored
View File

@ -36,4 +36,3 @@ tools/png2fimg
tools/addtga2fimg
tools/addpnm2fimg
tools/cumulfimgs
tools/fimgops

View File

@ -41,11 +41,6 @@ composante, mais c'est loin d'être le cas général.
J'ai donc souhaité aller plus loin, et coder chaque canal de
chaque pixel en virgule flottante sur 32bits, le type
\texttt{float}\index{float} du langage C.
\vspace{1em}
Attention, tout le code que nous allons voir ensemble est en
perpétuelle évolution\footnote{voir page \pageref{TODO}},
et sa fiablité reste à démontrer\index{valgrind}.
% -------------------------------------------------------------------
@ -55,13 +50,6 @@ et sa fiablité reste à démontrer\index{valgrind}.
% -------------------------------------------------------------------
\section{Premier example}\index{example}\label{example}
\textsc{FloatImg} a débuté sous la forme de quelques fonctions
basiques en C, gérant la structure des données d'image en mémoire
et sur disque.
Nous allons donc directement rentrer au cœur du problème.
\vspace{1em}
Pour commencer par quelques chose de simple,
nous allons créer une image RGB\index{RGB} complètement noire,
puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg},
@ -82,7 +70,7 @@ en mémoire centrale, initialisations des valeurs de pixel à 0.0,
et pour conclure, enregistrement dans un fichier.
\begin{verbatim}
foo = fimg_create(&fimg, width, height, FIMG_TYPE_RGB);
foo = fimg_create(&fimg, width, height, 3);
if (foo) {
fprintf(stderr, "create floatimg -> %d\n", foo);
exit(1);
@ -102,7 +90,7 @@ nous pouvons entrevoir, grâce au logiciel
le résultat sous forme de chiffres divers, et/ou inutiles~:
\begin{verbatim}
$ ./fimgstats quux.img
$ ./fimgstats quux.img
----------- numbers from 'quux.img' :
640 480 3 0x7f3718c4f010 0x7f3718d7b010 0x7f3718ea7010
surface 307200
@ -114,36 +102,24 @@ mean values:
max value 0.000000
\end{verbatim}
Nous avons donc sous la main une mécanique qui ne demande qu'à
faire des trucs futiles et des images qui clignotent.
La suite vers la page \pageref{codaz}.
\vspace{1em}
Vous trouverez dans le répertoire \texttt{tools/}\index{tools/}
d'autres exemples de mise en œuvre des fonctions disponibles
sous formes d'outils en ligne de commande,
décrits en page \pageref{outils}.
sous formes d'outils en ligne de commande, décrits page \pageref{outils}.
% -------------------------------------------------------------------
\section{Installation}
\subsection{Prérequis}
Vous devez, en dehors des outils classiques (bash, gcc, make\dots),
Vous devez, en dehors des outils classiques (gcc, make\dots),
avoir quelques bibliothèques installées\footnote{Les \texttt{-dev}
pour Debain et dérivées}~: libv4l2, libpnglite, libtiff, et
probablement d'autres choses. Être familier avec l'utilisation du
shell\index{shell} sera un plus.
probablement d'autres choses.
\subsection{Compilation}
Un script \texttt{build.sh} permet de construire approximativement
le bouzin. Il est loin d'être parfait\footnote{Il doit être possible
de faire un Makefile récursif, mais\dots}.
Dans chacun des
répertoires à traiter, ce script devrait trouver un Makefile et un fichier
\texttt{t.c} source de la cible par défaut du make.
le bouzin. Il est loin d'être parfait.
\vspace{1em}
Pour le moment, la procédure d'installation est un peu rude,
@ -155,7 +131,7 @@ approprié, par exemple
\texttt{/usr/local/include} et \texttt{/usr/local/lib}.
% -------------------------------------------------------------------
\section{Utilisation coté codeur}\label{codaz}
\section{Utilisation coté codeur}
Classiquement, il y a un fichier à inclure, \texttt{floatimg.h},
contenant un certain nombre de
@ -284,20 +260,12 @@ l'on peut assimiler à un noir absolu\index{absolu}.
Affichage de quelques valeurs calculées à partir d'un fichier
\texttt{.fimg}\index{.fimg}.
\begin{verbatim}
usage : fimgstats [options] file.fimg
-c make a machinable csv
-v increase verbosity
\end{verbatim}
\subsection{fimgops}\index{fimgops}\label{fimgops}
Operations diverses sur ou entre des images.
\begin{verbatim}
Usage:
fimgops [options] A.fimg B.fimg operator D.fimg
\end{verbatim}
Syntaxe CLI\index{CLI} à définir.
\subsection{fimg2png, fimg2pnm, fimg2tiff}
@ -333,26 +301,6 @@ Il reste plein de choses à faire pour que ce soit vraiment utilisable.
\
\end{itemize}
% -------------------------------------------------------------------
\section{Exemples pour yusers}\index{example}
\begin{verbatim}
#!/bin/bash
ACCU="quux.fimg"
TMPF="tmp.fimg"
DIMS="640 480"
mkfimg ${ACCU} ${DIMS}
for i in {0..100}
do
fname=$( printf "f%04d.pnm" $i )
echo $fname
mkfimg -t drand48 ${TMPF} ${DIMS}
done
\end{verbatim}
% -------------------------------------------------------------------
\section{Video for Linux}\index{v4l2}
@ -386,10 +334,6 @@ options :
-v increase verbosity
\end{verbatim}
\subsection{video-infos}\index{video-infos}\label{video-infos}
Que contient, que peut faire mon périphérique \textsl{àlc} ?
% -------------------------------------------------------------------
\section{Et pour la suite ?}

View File

@ -9,7 +9,7 @@ DEPS = ../floatimg.h ../libfloatimg.a Makefile
# ----------
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
addpnm2fimg cumulfimgs fimgops
addpnm2fimg cumulfimgs
fimgstats: fimgstats.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -o $@
@ -20,9 +20,6 @@ cumulfimgs: cumulfimgs.c $(DEPS)
mkfimg: mkfimg.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -o $@
fimgops: fimgops.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -o $@
fimg2pnm: fimg2pnm.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -o $@

View File

@ -1,81 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "../floatimg.h"
int verbosity;
/* --------------------------------------------------------------------- */
#define OP_ADD 1
#define OP_MUL 2
typedef struct {
int code;
char *op;
} Opcode;
Opcode opcodes[] = {
{ OP_ADD, "add" },
{ OP_MUL, "mul" },
{ 0, NULL }
};
static void pr_opcodes(void)
{
Opcode *optr;
puts("operators:");
for (optr = opcodes; optr->code; optr++) {
printf("\t%-20s %d\n", optr->op, optr->code);
}
}
static int look_opcodes(char *txt)
{
Opcode *optr;
for (optr = opcodes; optr->code; optr++) {
if (!strcmp(txt, optr->op)) {
printf("found %s as %d\n", optr->op, optr->code);
return optr->code;
}
}
return -1;
}
/* --------------------------------------------------------------------- */
static void help(int lj)
{
puts("usage:\n\tfimgops [options] A.fimg B.fimg operator D.fimg");
pr_opcodes();
if (verbosity) fimg_print_version(1);
exit(0);
}
/* --------------------------------------------------------------------- */
int main(int argc, char *argv[])
{
int foo, opt;
float fvalue;
FloatImg fimg;
while ((opt = getopt(argc, argv, "hk:v")) != -1) {
switch(opt) {
case 'h': help(0); break;
case 'k': fvalue = atof(optarg); break;
case 'v': verbosity++; break;
}
}
#if DEBUG_LEVEL
fprintf(stderr, "argc %d optind %d\n", argc, optind);
for (foo=0; foo<argc; foo++)
fprintf(stderr, "%3d %s\n", foo, argv[foo]);
#endif
if (4 != argc-optind) {
fprintf(stderr, "%s need some arguments...\n", argv[0]);
exit(1);
}
return 0;
}
/* --------------------------------------------------------------------- */

View File

@ -1,5 +1,4 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
@ -8,27 +7,9 @@
int verbosity;
/* --------------------------------------------------------------------- */
#define T_BLACK 0
#define T_DRAND48 1
#define T_RGB_0 2
static int get_type(char *name)
void help(int lj)
{
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, name);
#define TEST(str) ( ! strcmp(name, str) )
if TEST("black") return T_BLACK;
if TEST("drand48") return T_DRAND48;
return -1;
}
/* --------------------------------------------------------------------- */
static void help(int lj)
{
puts("Usage:\n\tmkfimg [options] quux.fimg width height\n");
if (verbosity) fimg_print_version(1);
fimg_print_version(1);
exit(0);
}
@ -39,45 +20,32 @@ int foo, opt;
int width, height;
char *fname;
float fvalue;
int type = 0;
FloatImg fimg;
while ((opt = getopt(argc, argv, "ht:v")) != -1) {
while ((opt = getopt(argc, argv, "ho:v")) != -1) {
switch(opt) {
case 'h': help(0); break;
case 't': type = get_type(optarg); break;
case 'v': verbosity++; break;
}
}
#if DEBUG_LEVEL
fprintf(stderr, "argc %d optind %d\n", argc, optind);
for (foo=0; foo<argc; foo++)
fprintf(stderr, "%3d %s\n", foo, argv[foo]);
#endif
if (3 != argc-optind) {
fprintf(stderr, "%s need filename, width & height\n", argv[0]);
if (4 != argc) {
fimg_print_version(1);
fprintf(stderr, "Usage:\n\t%s quux.fimg width height\n", argv[0]);
exit(1);
}
fname = argv[optind];
width = atoi(argv[optind+1]); height = atoi(argv[optind+2]);
if (verbosity) fprintf(stderr, "making '%s' %d x %d\n", fname, width, height);
fprintf(stderr, "making '%s' %d x %d\n", fname, width, height);
foo = fimg_create(&fimg, width, height, 3);
if (foo) {
fprintf(stderr, "create floatimg -> %d\n", foo);
exit(1);
}
switch(type) {
default:
case T_BLACK: fimg_clear(&fimg); break;
case T_DRAND48: fimg_drand48(&fimg, 1.0); break;
}
fimg_clear(&fimg);
foo = fimg_dump_to_file(&fimg, fname, 0);
if (foo) {