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/addtga2fimg
|
||||||
tools/addpnm2fimg
|
tools/addpnm2fimg
|
||||||
tools/cumulfimgs
|
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
|
J'ai donc souhaité aller plus loin, et coder chaque canal de
|
||||||
chaque pixel en virgule flottante sur 32bits, le type
|
chaque pixel en virgule flottante sur 32bits, le type
|
||||||
\texttt{float}\index{float} du langage C.
|
\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}
|
\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,
|
Pour commencer par quelques chose de simple,
|
||||||
nous allons créer une image RGB\index{RGB} complètement noire,
|
nous allons créer une image RGB\index{RGB} complètement noire,
|
||||||
puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg},
|
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.
|
et pour conclure, enregistrement dans un fichier.
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
foo = fimg_create(&fimg, width, height, 3);
|
foo = fimg_create(&fimg, width, height, FIMG_TYPE_RGB);
|
||||||
if (foo) {
|
if (foo) {
|
||||||
fprintf(stderr, "create floatimg -> %d\n", foo);
|
fprintf(stderr, "create floatimg -> %d\n", foo);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -90,7 +102,7 @@ nous pouvons entrevoir, grâce au logiciel
|
|||||||
le résultat sous forme de chiffres divers, et/ou inutiles~:
|
le résultat sous forme de chiffres divers, et/ou inutiles~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
$ ./fimgstats quux.img
|
$ ./fimgstats quux.img
|
||||||
----------- numbers from 'quux.img' :
|
----------- numbers from 'quux.img' :
|
||||||
640 480 3 0x7f3718c4f010 0x7f3718d7b010 0x7f3718ea7010
|
640 480 3 0x7f3718c4f010 0x7f3718d7b010 0x7f3718ea7010
|
||||||
surface 307200
|
surface 307200
|
||||||
@ -102,24 +114,36 @@ mean values:
|
|||||||
max value 0.000000
|
max value 0.000000
|
||||||
\end{verbatim}
|
\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/}
|
Vous trouverez dans le répertoire \texttt{tools/}\index{tools/}
|
||||||
d'autres exemples de mise en œuvre des fonctions disponibles
|
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}
|
\section{Installation}
|
||||||
|
|
||||||
\subsection{Prérequis}
|
\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}
|
avoir quelques bibliothèques installées\footnote{Les \texttt{-dev}
|
||||||
pour Debain et dérivées}~: libv4l2, libpnglite, libtiff, et
|
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}
|
\subsection{Compilation}
|
||||||
|
|
||||||
Un script \texttt{build.sh} permet de construire approximativement
|
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}
|
\vspace{1em}
|
||||||
|
|
||||||
Pour le moment, la procédure d'installation est un peu rude,
|
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}.
|
\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},
|
Classiquement, il y a un fichier à inclure, \texttt{floatimg.h},
|
||||||
contenant un certain nombre de
|
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
|
Affichage de quelques valeurs calculées à partir d'un fichier
|
||||||
\texttt{.fimg}\index{.fimg}.
|
\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}
|
\subsection{fimgops}\index{fimgops}\label{fimgops}
|
||||||
|
|
||||||
Operations diverses sur ou entre des images.
|
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}
|
\subsection{fimg2png, fimg2pnm, fimg2tiff}
|
||||||
@ -301,6 +333,26 @@ Il reste plein de choses à faire pour que ce soit vraiment utilisable.
|
|||||||
\
|
\
|
||||||
\end{itemize}
|
\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}
|
\section{Video for Linux}\index{v4l2}
|
||||||
|
|
||||||
@ -334,6 +386,10 @@ options :
|
|||||||
-v increase verbosity
|
-v increase verbosity
|
||||||
\end{verbatim}
|
\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 ?}
|
\section{Et pour la suite ?}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ DEPS = ../floatimg.h ../libfloatimg.a Makefile
|
|||||||
# ----------
|
# ----------
|
||||||
|
|
||||||
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
|
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
|
||||||
addpnm2fimg cumulfimgs
|
addpnm2fimg cumulfimgs fimgops
|
||||||
|
|
||||||
fimgstats: fimgstats.c $(DEPS)
|
fimgstats: fimgstats.c $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||||
@ -20,6 +20,9 @@ cumulfimgs: cumulfimgs.c $(DEPS)
|
|||||||
mkfimg: mkfimg.c $(DEPS)
|
mkfimg: mkfimg.c $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
|
fimgops: fimgops.c $(DEPS)
|
||||||
|
gcc $(COPT) $< ../libfloatimg.a -o $@
|
||||||
|
|
||||||
fimg2pnm: fimg2pnm.c $(DEPS)
|
fimg2pnm: fimg2pnm.c $(DEPS)
|
||||||
gcc $(COPT) $< ../libfloatimg.a -o $@
|
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 <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
@ -7,9 +8,27 @@
|
|||||||
int verbosity;
|
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);
|
exit(0);
|
||||||
}
|
}
|
||||||
@ -20,32 +39,45 @@ int foo, opt;
|
|||||||
int width, height;
|
int width, height;
|
||||||
char *fname;
|
char *fname;
|
||||||
float fvalue;
|
float fvalue;
|
||||||
|
int type = 0;
|
||||||
|
|
||||||
FloatImg fimg;
|
FloatImg fimg;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "ho:v")) != -1) {
|
while ((opt = getopt(argc, argv, "ht:v")) != -1) {
|
||||||
switch(opt) {
|
switch(opt) {
|
||||||
case 'h': help(0); break;
|
case 'h': help(0); break;
|
||||||
|
case 't': type = get_type(optarg); break;
|
||||||
case 'v': verbosity++; break;
|
case 'v': verbosity++; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (4 != argc) {
|
#if DEBUG_LEVEL
|
||||||
fimg_print_version(1);
|
fprintf(stderr, "argc %d optind %d\n", argc, optind);
|
||||||
fprintf(stderr, "Usage:\n\t%s quux.fimg width height\n", argv[0]);
|
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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fname = argv[optind];
|
fname = argv[optind];
|
||||||
width = atoi(argv[optind+1]); height = atoi(argv[optind+2]);
|
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);
|
foo = fimg_create(&fimg, width, height, 3);
|
||||||
if (foo) {
|
if (foo) {
|
||||||
fprintf(stderr, "create floatimg -> %d\n", foo);
|
fprintf(stderr, "create floatimg -> %d\n", foo);
|
||||||
exit(1);
|
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);
|
foo = fimg_dump_to_file(&fimg, fname, 0);
|
||||||
if (foo) {
|
if (foo) {
|
||||||
|
Loading…
Reference in New Issue
Block a user