Compare commits
No commits in common. "db715485a2ae84bd362815d8fc5d8d0ca5268def" and "a78d6c2a75ac1a8702832ced960fb2ad30101267" have entirely different histories.
db715485a2
...
a78d6c2a75
@ -7,7 +7,7 @@ gnuplot << __EOF__
|
|||||||
|
|
||||||
set term latex
|
set term latex
|
||||||
set output "$OUT"
|
set output "$OUT"
|
||||||
set title "COS01"
|
set title "COS010"
|
||||||
|
|
||||||
plot \
|
plot \
|
||||||
[0:1] [0:1] \
|
[0:1] [0:1] \
|
||||||
|
@ -110,10 +110,9 @@ basiques en C, gérant la structure des données d'image en mémoire
|
|||||||
et sur disque. Ça a été imaginé de façon presque empirique,
|
et sur disque. Ça a été imaginé de façon presque empirique,
|
||||||
mais nous sommes tous là pour améliorer les choses, dans
|
mais nous sommes tous là pour améliorer les choses, dans
|
||||||
la mesure de nos moyens.
|
la mesure de nos moyens.
|
||||||
Nous allons donc directement rentrer au cœur du problème,
|
Nous allons donc directement rentrer au cœur du problème.
|
||||||
en écrivant quelques lignes de code.
|
|
||||||
|
|
||||||
Pour commencer par quelque 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},
|
||||||
un format complètement inconnu, puisque je viens de l'inventer
|
un format complètement inconnu, puisque je viens de l'inventer
|
||||||
@ -296,9 +295,9 @@ pas être la même chose dans l'avenir.
|
|||||||
|
|
||||||
\subsection{Les fondations}\index{lib/}
|
\subsection{Les fondations}\index{lib/}
|
||||||
|
|
||||||
La première chose que nous devons absolument voir est la gestion
|
La première chose à voir est la gestion dynamique de la mémoire occupée
|
||||||
dynamique de la mémoire qui sera occupée par tous ces pixels flottants,
|
par tous ces pixels flottants, ce est un sujet parois
|
||||||
ce qui est un sujet parfois délicat\footnote{GC or not GC ?}.
|
délicat\footnote{GC}.
|
||||||
Elle est donc faite, à la base, par ces deux fonctions~:
|
Elle est donc faite, à la base, par ces deux fonctions~:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
@ -307,7 +306,7 @@ int fimg_destroy(FloatImg *fimg);
|
|||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
L'appelant doit lui-même gérer le descripteur d'image (une structure
|
L'appelant doit lui-même gérer le descripteur d'image (une structure
|
||||||
C décrite plus haut) en le considérant comme un type semi-opaque dont
|
C décrite plus haur) en le considérant comme un type semi-opaque dont
|
||||||
la forme peut varier. Certains membres de cette structure sont
|
la forme peut varier. 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
|
||||||
@ -327,27 +326,18 @@ 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 ram doit être
|
(taille, type...), donc l'image en ram doit être
|
||||||
pré-allouée. On peut connaitre ces valeurs en appelant
|
pré-allouée. Mias comment peut-on connaitre ces valeurs ?
|
||||||
\texttt{int fimg\_fileinfos(char *fname, int datas[3])}.
|
|
||||||
|
\begin{verbatim}
|
||||||
|
int fimg_fileinfos(char *fname, int datas[3]);
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
Si tout s'est bien passé (valeur retournée égale à 0),
|
Si tout s'est bien passé (valeur retournée égale à 0),
|
||||||
on va trouver la largeur dans \texttt{datas[0]},
|
on va trouver la largeur dans \texttt{datas[0]},
|
||||||
la hauteur dans \texttt{datas[1]} et le type dans
|
la hauteur dans \texttt{datas[1]} et le type dans \texttt{datas[2]}.
|
||||||
\texttt{datas[2]}\footnote{La fonction
|
|
||||||
\texttt{fimg\_type\_is\_valid(int type)} peut vous aider}.
|
|
||||||
|
|
||||||
Je sais aussi que certains d'entre vous aiment la facilité, aussi
|
|
||||||
je vais vous révéler l'existence d'un nouveau truc bien plus
|
|
||||||
simple, une fonction qui enchaine ces deux actions
|
|
||||||
(allocation, puis lecture), et s'utilise
|
|
||||||
comme ça :
|
|
||||||
|
|
||||||
\begin{verbatim}
|
|
||||||
FloatImg head;
|
|
||||||
memset(&head, 0, sizeof(FloatImg));
|
|
||||||
foo = fimg_create_from_dump("lena.fimg", &head);
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
|
La fonction \texttt{fimg\_type\_is\_valid(int type)} peut
|
||||||
|
vous aider.
|
||||||
|
|
||||||
% _________
|
% _________
|
||||||
|
|
||||||
@ -446,26 +436,22 @@ Et le résultat est très moyen : il n'y a pas d'interpolation.
|
|||||||
|
|
||||||
% ----------------------------------
|
% ----------------------------------
|
||||||
|
|
||||||
\subsection{Exportation \& Importation}\index{export}\label{export}
|
\subsection{Exportation}\index{export}\label{export}
|
||||||
|
|
||||||
Notre format de fichier étant totalement inconnu, il nous
|
Notre format de fichier étant totalement inconnu, il nous
|
||||||
faut bien exporter nos images en quelque chose de plus
|
faut bien exporter nos images en quelque chose de plus
|
||||||
connu. Bien entendu, c'est toujours affaire de compromis
|
connu. Bien entendu, c'est toujours affaire de compromis
|
||||||
entre précision de valeurs et taille des fichiers.
|
entre précision de valeurs et taille des fichiers.
|
||||||
|
|
||||||
Et dans le sens inverse, il serait bien de savoir importer
|
Il faut aussi reconnaitre que c'est un peu la jungle dans les
|
||||||
le monde extérieur dans nos sombres caves à pixel.
|
formats de fichiers d'image\dots
|
||||||
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
|
|
||||||
dans ce domaine\dots
|
|
||||||
|
|
||||||
\subsubsection{Vers PNM}\index{PNM}
|
\subsubsection{Vers PNM}\index{PNM}
|
||||||
|
|
||||||
Nous avons ici 16 bits par composante, mais au prix
|
Nous avons ici 16 bits par composante, mais au prix
|
||||||
d'une taille énorme sur les fichiers. D'un autre coté,
|
d'une taille énorme sur les fichiers. D'autre coté,
|
||||||
l'utilisation du codage \textsc{ascii}\index{ascii}
|
l'utilisation du codage \textsc{ascii}\index{ascii}
|
||||||
(alors qu'on pourrait mettre du binaire, plus compact) y est
|
(alors qu'on pourrait mettre du binaire, plus compact) y est pour quelque chose.
|
||||||
pour quelque chose.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int fimg_save_as_pnm(FloatImg *head, char *fname, int flags);
|
int fimg_save_as_pnm(FloatImg *head, char *fname, int flags);
|
||||||
@ -477,58 +463,29 @@ Le bit \texttt{0} du paramètre \texttt{flags} mis à \texttt{1} demande
|
|||||||
Et si il est à zéro, c'est la fonction de recherche de valeur
|
Et si il est à zéro, c'est la fonction de recherche de valeur
|
||||||
maximale (cf page \pageref{contraste}) qui est utilisée.
|
maximale (cf page \pageref{contraste}) qui est utilisée.
|
||||||
|
|
||||||
Le bit \texttt{1} permettra bientôt\index{vaporware} de demander
|
|
||||||
l'enregistrement de métadonnées\index{metadata} pertinentes, telle
|
|
||||||
que l'epochtime de l'enregistrement.
|
|
||||||
|
|
||||||
Les autres bits ne sont pas utilisés et doivent être à zéro.
|
Les autres bits ne sont pas utilisés et doivent être à zéro.
|
||||||
|
|
||||||
\subsubsection{Vers PNG}\index{PNG}
|
\subsubsection{Vers PNG}\index{PNG}
|
||||||
|
|
||||||
Actuellement, on peut enregistrer uniquement en mode RGB, 8 bits par composante,
|
Actuellement, on peut enregistrer uniquement en mode RGB, 8 bits par composante,
|
||||||
mais on a quand même une bonne compression, ça compense.
|
mais on a quand même une bonne compression, ça compense.
|
||||||
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.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int fimg_save_as_png(FloatImg *src, char *outname, int flags);
|
int fimg_save_as_png(FloatImg *src, char *outname, int flags);
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
\subsubsection{Vers TIFF}\index{TIFF}
|
\subsubsection{Vers TIFF}\index{TIFF}
|
||||||
|
|
||||||
Le format canonique de la PAO\index{PAO} du siècle dernier. Il permet
|
|
||||||
de gérer une foultitude de formats numériques. C'est aussi un format
|
|
||||||
classique proposé par les scanners corporates.
|
|
||||||
|
|
||||||
To be done\index{XXX}
|
To be done\index{XXX}
|
||||||
|
|
||||||
\subsubsection{Vers FITS}\index{FITS}
|
|
||||||
|
|
||||||
Essentiellement des images d'astronomie.
|
|
||||||
|
|
||||||
To be done\index{XXX}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Utilitaires}
|
\subsection{Utilitaires}
|
||||||
|
|
||||||
Commençons par quelques petits trucs pour nous faciliter la vie
|
|
||||||
dans des domaines annexes,
|
|
||||||
tels que l'interprétation d'arguments dans la ligne de commande ou un
|
|
||||||
fichier de configuration.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
int parse_WxH(char *str, int *pw, int *ph)
|
int parse_WxH(char *str, int *pw, int *ph)
|
||||||
int parse_double(char *str, double *dptr)
|
int parse_double(char *str, double *dptr)
|
||||||
|
int format_from_extension(char *fname)
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
|
||||||
La fonction \texttt{int format\_from\_extension(char *fname)} examine un
|
|
||||||
nom defichier tel que \texttt{lena.xxx}, et retourne, si la partie
|
|
||||||
\texttt{xxx} un éventuel nombre positif, dont les valeurs sont dans floatimg.h
|
|
||||||
le valeureux.
|
|
||||||
Les extensions connues sont : fimg, png, pnm et tiff.
|
|
||||||
|
|
||||||
To be continued\index{XXX}
|
To be continued\index{XXX}
|
||||||
|
|
||||||
|
|
||||||
@ -547,8 +504,7 @@ int fimg_killcolors_b(FloatImg *fimg, float fval);
|
|||||||
|
|
||||||
\subsection{Filtrages}
|
\subsection{Filtrages}
|
||||||
|
|
||||||
To be done\index{XXX}, et il faut que je réfléchisse au traitement
|
To be done\index{XXX}
|
||||||
des bords d'image.
|
|
||||||
|
|
||||||
|
|
||||||
% ----------------------------------
|
% ----------------------------------
|
||||||
|
@ -160,11 +160,6 @@ FimgFileHead filehead;
|
|||||||
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, head);
|
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, head);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* may be we can crash coredump here if the head
|
|
||||||
* descriptor is not blank ?
|
|
||||||
*/
|
|
||||||
|
|
||||||
fp = fopen(fname, "r");
|
fp = fopen(fname, "r");
|
||||||
if (NULL==fp) {
|
if (NULL==fp) {
|
||||||
perror(fname);
|
perror(fname);
|
||||||
|
Loading…
Reference in New Issue
Block a user