Compare commits

..

No commits in common. "63bc4ed7af3ee51a0ea29ffe7470ba85911a03b2" and "63674c8eee95a8a7c701cd6e8d7952e0edec11e6" have entirely different histories.

8 changed files with 43 additions and 191 deletions

View File

@ -173,15 +173,13 @@ quelques milliers d'images standard à 256 niveaux, sans trop avoir
Dynamique, précision et \textsl{macheps} ? Peu de gens connaissent Dynamique, précision et \textsl{macheps} ? Peu de gens connaissent
la fourbitude des calculs en virgule flottante avec les ordinateurs. la fourbitude des calculs en virgule flottante avec les ordinateurs.
Moi-même compris. Il est évident qu'une étude théorique doit être Moi-même compris.
effectuée afin d'éviter les potentiels inconvénients.
\subsection{Pixel négatif ?} \subsection{Pixel négatif ?}
Il est très difficle d'imaginer une lumière négative. Sauf peut-être Il est très difficle d'imaginer une lumière négative. Sauf peut-être
si nous songeons à des coefficients d'absorption, ou un canal si nous songeons à des coefficients d'absorption, ou un canal
\textsl{alpha} qui inverserait les valeurs ? Un domaine dont \textsl{alpha} qui inverserait les valeurs ?
l'exploration peut confiner au mysticisme.
% =================================================================== % ===================================================================
@ -202,8 +200,8 @@ Pour commencer par quelque 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},
un format complètement inconnu, puisque je viens de l'inventer un format complètement inconnu, puisque je viens de l'inventer
à l'instant même\footnote{Enfin, non, il y a déja longtemps, à l'instant même.
avant la grande pandémie.} Enfin, non, il y a déja longtemps, avant la grande pandémie.
Tout d'abord, nous devons déclarer et garnir quelques variables Tout d'abord, nous devons déclarer et garnir quelques variables
pour gérer la machinerie interne. pour gérer la machinerie interne.
@ -218,8 +216,7 @@ Ensuite, nous enchainerons trois étapes : la création de l'image
en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0 en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0
(une valeur que certains associent au noir complet, et d'autres à une (une valeur que certains associent au noir complet, et d'autres à une
impossibilité quantique), impossibilité quantique),
et pour conclure, l'enregistrement de cette image dans un et pour conclure, l'enregistrement dans un fichier\footnote{Au format
fichier\footnote{Au format
ésotérique, mais très véloce.} binaire. ésotérique, mais très véloce.} binaire.
\begin{lstlisting} \begin{lstlisting}
@ -238,9 +235,9 @@ if (foo) {
\end{lstlisting} \end{lstlisting}
Une fois ce code enrobé dans un \texttt{main()}, compilé puis exécuté, Une fois ce code enrobé dans un \texttt{main()}, compilé et exécuté,
nous pouvons entrevoir, grâce au logiciel nous pouvons entrevoir, grâce au logiciel
\texttt{fimgstats} (décrit en page \pageref{fimgstats}), \texttt{fimgstats} (voir page \pageref{fimgstats}),
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}
@ -264,9 +261,9 @@ Avec un bon script bash, il y a déja de quoi faire.
La suite vers la page \pageref{codaz}. La suite vers la page \pageref{codaz}.
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 de quelques fonctions disponibles d'autres exemples de mise en œuvre des fonctions disponibles
sous formes d'outils en ligne de commande, sous formes d'outils en ligne de commande,
lesquels outils sont approximativement décrits en page \pageref{outils}. lesquels sont approximativement décrits en page \pageref{outils}.
% =================================================================== % ===================================================================
\section{Installation} \section{Installation}
@ -282,15 +279,15 @@ soucis de boutisme.
\subsection{Prérequis} \subsection{Prérequis}
Vous devez, en dehors des outils classiques (gcc, Awk, make\dots), Vous devez, en dehors des outils classiques (gcc, Awk, make\dots),
avoir quelques bibliothèques installées~: avoir quelques bibliothèques installées\footnote{Les \texttt{-dev}
en plus pour Debian et dérivées}~:
\textsf{ \textsf{
libv4l2, libpnglite, libtiff, libv4l2, libpnglite, libtiff,
libnetpbm\footnote{package libnetpbm10-dev}, libnetpbm\footnote{package libnetpbm10-dev},
libz\footnote{package zlib1g-dev}, libcurses, libz\footnote{package zlib1g-dev}, libcurses,
libcfitsio... libcfitsio-dev
} % end of textsf } % end of textsf
éventuellement avec le \textsf{-dev} correspondant, qui contient, entre éventuellement avec le \textsf{-dev} correspondant,
autres, les fichiers \texttt{.h} associés
et probablement d'autres choses. et probablement d'autres choses.
Il est même quasiment certain que Bash soit indispensable, tout Il est même quasiment certain que Bash soit indispensable, tout
@ -299,8 +296,7 @@ Une connaissance de base de l'utilisation du shell\index{shell}
et de l'écriture de Makefile's sera un plus. et de l'écriture de Makefile's sera un plus.
Il faut aussi savoir où trouver le code. Il est dans le Git du Il faut aussi savoir où trouver le code. Il est dans le Git du
Tetalab\footnote{\texttt{https://git.tetalab.org/tTh/FloatImg}}. Tetalab. Mais comme je ne comprend rien à Git, c'est pas la peine
Mais comme je ne comprend rien à Git, c'est pas la peine
de m'envoyer des trucs genre \textsl{pull-request} auquels je ne de m'envoyer des trucs genre \textsl{pull-request} auquels je ne
comprend rien. comprend rien.
@ -342,7 +338,7 @@ Faites-en ce que vous voulez.
Classiquement, il y a un fichier \texttt{.h} à inclure dans chacun Classiquement, il y a un fichier \texttt{.h} à inclure dans chacun
de vos codes source, de vos codes source,
\texttt{floatimg.h}, généralement logé dans \texttt{/usr/local/include} \texttt{floatimg.h}, généralement logé dans \texttt{/usr/local/include}
et contenant un certain nombre de définition de structures, de macros, contenant un certain nombre de définition de structures, de macros,
de constantes\footnote{À l'ancienne, via le pré-processeur} de constantes\footnote{À l'ancienne, via le pré-processeur}
et les prototypes des fonctions utilisables par vos logiciels. et les prototypes des fonctions utilisables par vos logiciels.
@ -351,7 +347,7 @@ classées en deux catégories : \texttt{lib/} et \texttt{funcs/}.
La première contient les choses qui sont relativement figées, La première contient les choses qui sont relativement figées,
et la seconde celles qui risquent de bouger. Cette classification et la seconde celles qui risquent de bouger. Cette classification
est en fait indécement arbitraire. est en fait indécement arbitraire.
D'autant plus qu'il y a aussi un répertoire nommé « experimental ». D'autant plus qu'il y a aussi un répertoire nommé « experiemental ».
\subsection{Structures, macros\dots} \subsection{Structures, macros\dots}
@ -410,7 +406,7 @@ quelques images...
Le champ \textsl{count} sera mis à 0 et Le champ \textsl{count} sera mis à 0 et
le champ \textsl{fval} sera initialisé à 15.0 le champ \textsl{fval} sera initialisé à 15.0
(ce qui est la valeur maximale que peut renvoyer ce capteur). (qui est la valeur maximale que peut renvoyer ce capteur).
Ensuite, dans la boucle capture/cumul, \textsl{count} sera Ensuite, dans la boucle capture/cumul, \textsl{count} sera
incrémenté à chaque passe, et nous aurons donc, en finale, incrémenté à chaque passe, et nous aurons donc, en finale,
toutes les informations nécessaires pour exploiter au mieux la dynamique toutes les informations nécessaires pour exploiter au mieux la dynamique
@ -449,16 +445,15 @@ avant le moindre usage\footnote{\texttt{man 3 memset}}.
Certains membres de cette structure sont Certains membres de cette structure sont
documentés dans ce document, et les autres sont dangereux à documentés dans ce document, et les autres sont dangereux à
toucher. Les types d'images actuellement gérés sont les trois grands toucher. Les types d'images actuellement gérés sont les trois grands
classiques : niveau de gris, rouge-vert-bleu et rgb avec un canal alpha, classiques : gray, rgb et rgba. et expliquées quelques lignes plus haut.
et expliquées quelques lignes plus haut.
Comme vous allez le voir plus loin, il y a plein de fonctions qui Comme vous allez le voir plus loin, il y a plein de fonctions qui
prennent en argument deux images: la source et la destination. prennent en argument deux images: une source et une destination.
Dans la plupart des cas, ces deux images doivent être compatibles, Et dans la plupart des cas, ces deux images doivent être compatibles,
c'est à dire même type et mêmes dimensions. c'est à dire même type et mêmes dimensions.
\begin{lstlisting} \begin{lstlisting}
/* return 0 if pictures are compatible */ /* return 0 if compatible */
int fimg_images_not_compatible(FloatImg *a, FloatImg *b); int fimg_images_not_compatible(FloatImg *a, FloatImg *b);
\end{lstlisting} \end{lstlisting}
@ -467,7 +462,7 @@ C'est bien beau d'être enfin une image résidente en mémoire centrale, mais
pouvoir aussi exister à long terme en étant stocké dans la matrice pouvoir aussi exister à long terme en étant stocké dans la matrice
est tout aussi pertinent. est tout aussi pertinent.
Il y a deux opérations qui supportent le reste des transits ram/ps. Il y a deux opérations qui supportent le reste des transits ram/ps.
Le format de ces fichiers est décrit page \pageref{formatfimg}. Le format des fichiers est décrit page \pageref{formatfimg}.
\begin{lstlisting} \begin{lstlisting}
int fimg_dump_to_file(FloatImg *fimg, char *fname, int notused); int fimg_dump_to_file(FloatImg *fimg, char *fname, int notused);
@ -477,7 +472,7 @@ int fimg_load_from_dump(char *fname, FloatImg *where);
Recharger une image depuis un fichier nécessite que celle-ci et Recharger une image depuis un fichier nécessite que celle-ci et
l'image de destination en mémoire l'image de destination en mémoire
ait précisément les mêmes caractéristiques ait précisément les mêmes caractéristiques
(taille, type...), donc l'image en mémoire centrale doit être (taille, type...), donc l'image en ram doit être
pré-allouée. On peut connaitre ces valeurs en appelant pré-allouée. On peut connaitre ces valeurs en appelant
\texttt{int fimg\_fileinfos(char *fname, int datas[3])}. \texttt{int fimg\_fileinfos(char *fname, int datas[3])}.
@ -502,8 +497,6 @@ foo = fimg_create_from_dump("lena.fimg", &head);
Si la valeur retournée est différente de 0, c'est que quelque Si la valeur retournée est différente de 0, c'est que quelque
chose s'est probablement mal passé. chose s'est probablement mal passé.
Certains messages sont parfois explicites. Mais parfois non. Certains messages sont parfois explicites. Mais parfois non.
Quand aux valeurs retournées en cas d'erreur, c'est le désordre
intégral.
% _________ % _________
@ -533,8 +526,7 @@ $x$ et $y$ de la demande.
Quand au canal \textsl{alpha}\index{alpha}, il est pour le moment Quand au canal \textsl{alpha}\index{alpha}, il est pour le moment
superbement ignoré. Ceci dit, on vient de me faire remarquer qu'il superbement ignoré. Ceci dit, on vient de me faire remarquer qu'il
peut être utilisable aussi pour faire du peut être utilisable aussi pour faire du
\textsl{z-buffer}\index{z-buffer}\index{rgbz}, une technique \textsl{z-buffer}\index{z-buffer}\index{rgbz}\dots
classique dans la génération d'images en trois dimensions.\dots
% ---------------------------------- % ----------------------------------
@ -654,8 +646,7 @@ aux bonnes dimensions (échange W et H).
D'un design très empirique, c'est certainement à revoir pour l'avenir. D'un design très empirique, c'est certainement à revoir pour l'avenir.
Tout d'abord pour normaliser l'endianess et le packing dans les structs% Tout d'abord pour normaliser l'endianess et le packing dans les structs%
\footnote{Ce qui n'est pas encore fait}, et surtout l'ajout \footnote{Ce qui n'est pas encore fait}, et surtout l'ajout
de données sur la prise de vue, du genre type de capteur, date et heure, de données sur la prise de vue.
réglages divers\dots
\begin{lstlisting} \begin{lstlisting}
typedef struct { typedef struct {
@ -664,6 +655,9 @@ typedef struct {
} FimgFileHead; } FimgFileHead;
\end{lstlisting} \end{lstlisting}
\dots Mais aussi pour faciliter l'ajout de métadonnées, telles que
la valeur maximale, la date de création, une longueur d'onde,
et bien plus encore.
Le champ \texttt{magic[8]} doit contenir une valeur magique~: Le champ \texttt{magic[8]} doit contenir une valeur magique~:
les quatre premier octets doivent contenir les quatre caractères les quatre premier octets doivent contenir les quatre caractères
@ -680,11 +674,11 @@ fichier \texttt{floatimg.h}, et quelques informations
\subsection{Métadonnées} \subsection{Métadonnées}
\index{metadata} \index{timestamp} \index{metadata} \index{timestamp}
Attention, ce n'est pas encore une version définitive, beaucoup de Attention, ce n'est pas encore une version déinitive, beaucoup de
choses restent à préciser sur le contenu de cette structure, mais choses restent à préciser sur le contenu de cette structure, mais
l'essentiel est déja là. On reconnait un fichier avec metadata l'essentiel est déja là. On reconnait un fichier avec metadata
quand l'octet \texttt{magic[4]} du premier header est égal à quand l'octet \texttt{magic[4]} du premier header est égal à
la lettre \texttt{'a'}. \texttt{'a'}.
\begin{lstlisting} \begin{lstlisting}
typedef struct { typedef struct {
@ -701,8 +695,6 @@ Voyons maintenant chacun des champs de cette structure, en prenant bien
en compte qu'à ce moment\footnote{4 avril 2022}, tout n'est pas figé. en compte qu'à ce moment\footnote{4 avril 2022}, tout n'est pas figé.
Ceci dit, nous allons aussi retrouver de vieilles connaissances. Ceci dit, nous allons aussi retrouver de vieilles connaissances.
\textbf{to be continued}
% ---------------------------------- % ----------------------------------
\subsection{Exportation \& Importation}\index{export}\label{export} \subsection{Exportation \& Importation}\index{export}\label{export}
@ -718,7 +710,7 @@ Et dans le sens inverse, il serait bien de savoir importer
le monde extérieur dans nos sombres caves à pixel. le monde extérieur dans nos sombres caves à pixel.
Il faut quand même reconnaitre que c'est un peu la jungle dans les Il faut quand même reconnaitre que c'est un peu la jungle dans les
formats de fichiers d'image, ce qui explique le retard formats de fichiers d'image, ce qui explique le retard
du développement dans ce domaine\dots dans ce domaine\dots
\subsubsection{Vers PNM}\index{PNM} \subsubsection{Vers PNM}\index{PNM}
@ -754,8 +746,7 @@ mais on a quand même une bonne compression, ça compense.
J'utilise \textsl{libpnglite} avec qui j'ai un peu de mal à suivre. 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. Mais je me soigne. Le mode 16 bits va bientôt arriver.
On peut aussi songer à l'export des metadonnées, pour celles qui On peut aussi songer à l'export des metadatas.
sont compatibles avec le standard PNG.
\begin{lstlisting} \begin{lstlisting}
int fimg_save_as_png(FloatImg *src, char *outname, int flags); int fimg_save_as_png(FloatImg *src, char *outname, int flags);
@ -763,8 +754,8 @@ int fimg_save_as_png(FloatImg *src, char *outname, int flags);
Tous les flags doivent être à zéro. Sinon, ça foire parfois. Tous les flags doivent être à zéro. Sinon, ça foire parfois.
Et en fait (mars 2021) je ne suis pas très content de Et en fait (mars 2021) je ne suis pas très content de
\texttt{pnglite}, donc un de ces jours, je prendrais cinq jours pour \texttt{pnglite}, donc un de ces jours\footnote{Rendez-nous notre
régler ce souci en passant à la bibliothèque canonique Mixou !}, je prendrais cinq jours pour régler le souci.
\subsubsection{Vers TIFF}\index{TIFF} \subsubsection{Vers TIFF}\index{TIFF}
@ -888,8 +879,7 @@ int fimg_filter_3x3(FloatImg *src, FloatImg *dst, FimgFilter3x3 *filtr)
\end{lstlisting} \end{lstlisting}
Comme dans la plupart des cas, la gestion des valeurs négatives Comme dans la plupart des cas, la gestion des valeurs négatives
de pixel est laissé au hasard, qui fait souvent du portnawak. de pixel est laissé au hasard. Quoique, il doit bien exister
Quoique, il doit bien exister
quelques solutions de contournement : clamping ou shift ? quelques solutions de contournement : clamping ou shift ?
\textsl{To be continued\index{XXX}\dots} \textsl{To be continued\index{XXX}\dots}
@ -1089,7 +1079,7 @@ les valeurs négatives peuvent être la cause de \textsl{glitches}
de qualitay. de qualitay.
La liste des opérations est susceptible d'être agrémenté de quelques La liste des opérations est susceptible d'être agrémenté de quelques
possibilités bien féroces\footnote{Stay tuned, flim at 11.}. possibilités bie féroce\footnote{Stau tuned, flim at 11.}.
% ------------------------- % -------------------------
@ -1574,15 +1564,12 @@ Ajustement \textsl{Brightness Contrast Saturation Hue\dots}
\section{À l'extérieur} \section{À l'extérieur}
Il existe une foultitude de logiciels (composants ou end-yuser) et Il existe une foultitude de logiciels (composants ou end-yuser) et
il est souvent nécessaire de pouvoir communiquer facilement il est souvent nécessaire de pouvoir comminiquer facilement
avec eux. Nous avons déja quelques possibilité d'exportation, avec eux.
mais passer par cette étape intermédiaire est parfois délicat
à gérer dans un \textsl{pipedeprod} autrement bien huilé.
\subsection{ImageMagick}\index{ImageMagick} \subsection{ImageMagick}\index{ImageMagick}
Pour afficher notre format .fimg exotique avec \texttt{display}, un Pour afficher notre format .fimg exotique avec \texttt{display}, vous
des éléments du package ImageMagick, vous
devez mettre ce bout de XML\index{XML} dans le fichier devez mettre ce bout de XML\index{XML} dans le fichier
\texttt{\$HOME/.magick/delegates.xml}~: \texttt{\$HOME/.magick/delegates.xml}~:

View File

@ -20,7 +20,7 @@
* https://git.tetalab.org/tTh/FloatImg * https://git.tetalab.org/tTh/FloatImg
*/ */
#define FIMG_VERSION (210) #define FIMG_VERSION (208)
#define RELEASE_NAME ("noname") #define RELEASE_NAME ("noname")
/* XXX add a test for stdint.h / uint32_t XXX */ /* XXX add a test for stdint.h / uint32_t XXX */

View File

@ -11,8 +11,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <sys/time.h> #include <sys/time.h>
#include <floatimg.h>
#include "../floatimg.h"
/* --------------------------------------------------------------------- !*/ /* --------------------------------------------------------------------- !*/
static struct static struct

View File

@ -116,20 +116,12 @@ int xs, ys, xd, yd;
int count; int count;
float rgb[3]; float rgb[3];
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p %p %p )\n", __func__, in, out, rect);
#endif
if (verbosity > 1) { if (verbosity > 1) {
fimg_describe(in, "extractor: source"); fimg_describe(in, "extractor: source");
fimg_describe(out, "extractor: destination"); fimg_describe(out, "extractor: destination");
// print_rectangle(rect); // print_rectangle(rect);
} }
/*
* some sanity controls, please ! XXX
*/
count = 0; count = 0;
for (yd=0; yd<rect->h; yd++) { for (yd=0; yd<rect->h; yd++) {
ys = yd + rect->y; ys = yd + rect->y;
@ -143,7 +135,7 @@ for (yd=0; yd<rect->h; yd++) {
} }
} }
if (verbosity > 1) fprintf(stderr, "%s: %d pix moved\n", __func__, count); // fprintf(stderr, "%s: %d pix moved\n", __func__, count);
return 0; return 0;
} }

View File

@ -9,7 +9,6 @@ cp tools/mkfimg tools/fimg2pnm tools/fimgops \
tools/cumulfimgs tools/fimg2text \ tools/cumulfimgs tools/fimg2text \
tools/fimghalfsize \ tools/fimghalfsize \
tools/fimgmetadata \ tools/fimgmetadata \
tools/fimgextract \
/usr/local/bin /usr/local/bin
cp v4l2/grabvidseq v4l2/video-infos \ cp v4l2/grabvidseq v4l2/video-infos \

View File

@ -14,14 +14,11 @@ all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
fimg2tiff fimg2text fimg2fits \ fimg2tiff fimg2text fimg2fits \
addpnm2fimg cumulfimgs fimgops fimgfx \ addpnm2fimg cumulfimgs fimgops fimgfx \
fimgmetadata \ fimgmetadata \
fimghalfsize fimgextract fimghalfsize
fimgmetadata: fimgmetadata.c $(DEPS) fimgmetadata: fimgmetadata.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -lm -o $@ gcc $(COPT) $< ../libfloatimg.a -lm -o $@
fimgextract: fimgextract.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -lm -o $@
fimgstats: fimgstats.c $(DEPS) fimgstats: fimgstats.c $(DEPS)
gcc $(COPT) $< ../libfloatimg.a -lm -o $@ gcc $(COPT) $< ../libfloatimg.a -lm -o $@

View File

@ -47,7 +47,3 @@ afin de les rendre machinables. Voir aussi *fimgmetadata*.
Nouveau avril 2022. Need more doc... Nouveau avril 2022. Need more doc...
Voir aussi *fimg2text*. Voir aussi *fimg2text*.
## fimgextract
nouveau novembre 2022.

View File

@ -1,118 +0,0 @@
/*
* This thing is just a mess !
* ***************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include "../floatimg.h"
int verbosity; // nasty global var.
/* --------------------------------------------------------------------- */
/* nouveau ~ 2 octobre 2022 */
int extractor(char *srcname, char *dstname, FimgArea51 *rect)
{
FloatImg src, dst;
int foo;
fprintf(stderr, ">>> %s ( %s %s %p )\n", __func__, srcname, dstname, rect);
if (verbosity) {
print_rectangle((char *)__func__, rect);
}
foo = fimg_create_from_dump(srcname, &src);
if (foo) {
fprintf(stderr, "%s: load %s from dump --> %d\n", __func__,
srcname, foo);
return foo;
}
foo = fimg_create(&dst, rect->w, rect->h, 3);
if (foo) {
fprintf(stderr, "%s: fimg create dst --> %d\n", __func__, foo);
return foo;
}
/* REAL operation was here ! */
foo = fimg_extractor(&src, &dst, rect);
if (foo) {
fprintf(stderr, "%s: fimg extractor --> %d\n", __func__, foo);
#ifdef MUST_ABORT
abort(); // kill me hardly !
#endif
return foo;
}
// debug code XXX (void)fimg_save_as_pnm(&dst, "f.pnm", 0);
foo = fimg_dump_to_file(&dst, dstname, 0);
if (foo) {
fprintf(stderr, "%s: dumping datas to '%s' give us a %d\n",
__func__, dstname, foo);
return foo;
}
return 0;
}
/* --------------------------------------------------------------------- */
void help(void)
{
printf("-- Fimg Extractor -- lib v%d -- %s %s\n", FIMG_VERSION,
__DATE__, __TIME__);
puts("usage:\n\tfimgextract [options] source.fimg width,height,xpos,ypos");
puts("options:");
puts("\t-o out.fimg\tname the output file");
puts("\t-v\t\tmake be a blabla box");
puts("\t-x\t\tenable crashy feature");
exit(0);
}
/* --------------------------------------------------------------------- */
int main(int argc, char *argv[])
{
int foo, idx;
int opt;
int experiment = 0;
FimgArea51 area;
char *output_file = "out.fimg";
while ((opt = getopt(argc, argv, "ho:vx")) != -1) {
switch(opt) {
case 'h': help(); break;
case 'o': output_file = optarg; break;
case 'v': verbosity++; break;
case 'x': experiment++; break;
}
}
fprintf(stderr, "argc = %d optind = %d\n", argc, optind);
for (idx=optind; idx<argc; idx++) {
fprintf(stderr, " %5d %s\n", idx, argv[idx]);
}
if (argc==optind) {
fprintf(stderr, "wuh ?\n");
exit(0);
}
foo = parse_rectangle(argv[argc-1], &area, 0);
if (4 != foo) {
fprintf(stderr, "%s: parse_rectangle --> %d\n", argv[0], foo);
exit(1);
}
foo = extractor(argv[argc-2], output_file, &area);
if (foo) {
fprintf(stderr, "%s: extractor --> %d\n", __func__, foo);
exit(1);
}
return 0;
}
/* --------------------------------------------------------------------- */