Compare commits

..

3 Commits

Author SHA1 Message Date
tth
9f42b813e7 adding a new tool : fimgops 2019-09-11 07:43:08 +02:00
tth
0eff0039eb bla 2019-09-11 06:19:32 +02:00
tth
7afe2b1b63 better better better image maker 2019-09-11 06:06:59 +02:00
5 changed files with 191 additions and 18 deletions

1
.gitignore vendored
View File

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

View File

@ -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 ?}

View File

@ -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
View 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;
}
/* --------------------------------------------------------------------- */

View File

@ -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) {