Compare commits
3 Commits
a5d4e5cc98
...
9f42b813e7
Author | SHA1 | Date | |
---|---|---|---|
9f42b813e7 | |||
0eff0039eb | |||
7afe2b1b63 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -36,3 +36,4 @@ tools/png2fimg
|
||||
tools/addtga2fimg
|
||||
tools/addpnm2fimg
|
||||
tools/cumulfimgs
|
||||
tools/fimgops
|
||||
|
@ -41,6 +41,11 @@ 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}.
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
@ -50,6 +55,13 @@ chaque pixel en virgule flottante sur 32bits, le type
|
||||
% -------------------------------------------------------------------
|
||||
\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},
|
||||
@ -70,7 +82,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, 3);
|
||||
foo = fimg_create(&fimg, width, height, FIMG_TYPE_RGB);
|
||||
if (foo) {
|
||||
fprintf(stderr, "create floatimg -> %d\n", foo);
|
||||
exit(1);
|
||||
@ -102,24 +114,36 @@ 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 page \pageref{outils}.
|
||||
sous formes d'outils en ligne de commande,
|
||||
décrits en page \pageref{outils}.
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
\section{Installation}
|
||||
|
||||
\subsection{Prérequis}
|
||||
|
||||
Vous devez, en dehors des outils classiques (gcc, make\dots),
|
||||
Vous devez, en dehors des outils classiques (bash, 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.
|
||||
probablement d'autres choses. Être familier avec l'utilisation du
|
||||
shell\index{shell} sera un plus.
|
||||
|
||||
\subsection{Compilation}
|
||||
|
||||
Un script \texttt{build.sh} permet de construire approximativement
|
||||
le bouzin. Il est loin d'être parfait.
|
||||
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.
|
||||
\vspace{1em}
|
||||
|
||||
Pour le moment, la procédure d'installation est un peu rude,
|
||||
@ -131,7 +155,7 @@ approprié, par exemple
|
||||
\texttt{/usr/local/include} et \texttt{/usr/local/lib}.
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
\section{Utilisation coté codeur}
|
||||
\section{Utilisation coté codeur}\label{codaz}
|
||||
|
||||
Classiquement, il y a un fichier à inclure, \texttt{floatimg.h},
|
||||
contenant un certain nombre de
|
||||
@ -260,12 +284,20 @@ 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.
|
||||
|
||||
Syntaxe CLI\index{CLI} à définir.
|
||||
|
||||
\begin{verbatim}
|
||||
Usage:
|
||||
fimgops [options] A.fimg B.fimg operator D.fimg
|
||||
\end{verbatim}
|
||||
|
||||
|
||||
\subsection{fimg2png, fimg2pnm, fimg2tiff}
|
||||
@ -301,6 +333,26 @@ 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}
|
||||
|
||||
@ -334,6 +386,10 @@ 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 ?}
|
||||
|
||||
|
@ -9,7 +9,7 @@ DEPS = ../floatimg.h ../libfloatimg.a Makefile
|
||||
# ----------
|
||||
|
||||
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
|
||||
addpnm2fimg cumulfimgs
|
||||
addpnm2fimg cumulfimgs fimgops
|
||||
|
||||
fimgstats: fimgstats.c $(DEPS)
|
||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||
@ -20,6 +20,9 @@ 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 $@
|
||||
|
||||
|
81
tools/fimgops.c
Normal file
81
tools/fimgops.c
Normal file
@ -0,0 +1,81 @@
|
||||
#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;
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
@ -1,4 +1,5 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@ -7,9 +8,27 @@
|
||||
int verbosity;
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
void help(int lj)
|
||||
#define T_BLACK 0
|
||||
#define T_DRAND48 1
|
||||
#define T_RGB_0 2
|
||||
static int get_type(char *name)
|
||||
{
|
||||
fimg_print_version(1);
|
||||
|
||||
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);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
@ -20,32 +39,45 @@ int foo, opt;
|
||||
int width, height;
|
||||
char *fname;
|
||||
float fvalue;
|
||||
int type = 0;
|
||||
|
||||
FloatImg fimg;
|
||||
|
||||
while ((opt = getopt(argc, argv, "ho:v")) != -1) {
|
||||
while ((opt = getopt(argc, argv, "ht:v")) != -1) {
|
||||
switch(opt) {
|
||||
case 'h': help(0); break;
|
||||
case 't': type = get_type(optarg); break;
|
||||
case 'v': verbosity++; break;
|
||||
}
|
||||
}
|
||||
|
||||
if (4 != argc) {
|
||||
fimg_print_version(1);
|
||||
fprintf(stderr, "Usage:\n\t%s quux.fimg width height\n", argv[0]);
|
||||
#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]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
fname = argv[optind];
|
||||
width = atoi(argv[optind+1]); height = atoi(argv[optind+2]);
|
||||
fprintf(stderr, "making '%s' %d x %d\n", fname, width, height);
|
||||
|
||||
if (verbosity) 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);
|
||||
}
|
||||
fimg_clear(&fimg);
|
||||
|
||||
switch(type) {
|
||||
default:
|
||||
case T_BLACK: fimg_clear(&fimg); break;
|
||||
case T_DRAND48: fimg_drand48(&fimg, 1.0); break;
|
||||
}
|
||||
|
||||
foo = fimg_dump_to_file(&fimg, fname, 0);
|
||||
if (foo) {
|
||||
|
Loading…
Reference in New Issue
Block a user