Compare commits

...

2 Commits

Author SHA1 Message Date
tth
34ab825670 bla bla 2021-04-18 00:46:45 +02:00
tth
4095750024 add a "magic" field to FloatImg descritor 2021-04-17 09:03:25 +02:00
4 changed files with 81 additions and 27 deletions

1
.gitignore vendored
View File

@ -24,6 +24,7 @@ doc/*.idx
doc/*.ilg
doc/*.ind
doc/co*.tex
doc/foo.html
funcs/t
funcs/*.o

11
doc/README.md Normal file
View File

@ -0,0 +1,11 @@
# The FloatImg Hack
Et voilà la documentation...
Pour la générer :
`bash mkdoc.sh`

View File

@ -12,7 +12,7 @@
\lstset{basicstyle=\ttfamily\small}
\lstset{aboveskip=0.222em,belowskip=0.222em}
\usepackage{babel}
\usepackage{babel} % ?
\usepackage{graphicx} % for gnuplot ylabel rotate
@ -29,7 +29,7 @@
\setlength \parskip {0.35em}
\makeatletter
% exlication de ce truc ?
% explication de ce truc ?
\def\verbatim@font{\normalfont\ttfamily\small}
\makeatother
@ -145,6 +145,7 @@ nous allons créer une image RGB\index{RGB} complètement noire,
puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg},
un format complètement inconnu, puisque je viens de l'inventer
à l'instant même.
Enfin, non, il y a déja longtemps, avant la pandémie.
Tout d'abord, nous devons déclarer et garnir quelques variables
pour gérer la machinerie interne.
@ -155,9 +156,9 @@ char *fname = "exemple.fimg";
FloatImg fimg;
\end{lstlisting}
Ensuite, nous enchainerons trois étapes : création de l'image
en mémoire centrale, initialisation des valeurs de chaque pixel à 0.0,
et pour conclure, enregistrement dans un fichier\footnote{Au format
Ensuite, nous enchainerons trois étapes : la création de l'image
en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0,
et pour conclure, l'enregistrement dans un fichier\footnote{Au format
ésotérique, mais très véloce.} binaire.
\begin{lstlisting}
@ -206,13 +207,13 @@ lesquels sont décrits en page \pageref{outils}.
\section{Installation}
Sauf indications contraires, ces instructions se réfèrent à
une distribution Debian\index{Debian} récente.
\textit{Attention, ça devient un peu gore. Myrys, punk, toussa\dots}
une distribution Debian\index{Debian} récente, mais ça marche
quasiment pareil avec Fedora\index{Fedora}.
\textit{Attention, ça devient un peu gore\dots}
\subsection{Prérequis}
Vous devez, en dehors des outils classiques (bash, gcc, make\dots),
Vous devez, en dehors des outils classiques (gcc, Awk, make\dots),
avoir quelques bibliothèques installées\footnote{Les \texttt{-dev}
en plus pour Debian et dérivées}~:
\textsf{
@ -250,7 +251,7 @@ vous pouvez copier les deux fichiers \texttt{floatimg.h} et
Le script \texttt{install.sh}, à la racine du projet, est censé
faciliter un peu la chose. Il prend également en compte la copie
des divers binaires du dossier \texttt{tools/} (cf page \pageref{outils})
dans le répertoire prévu à cet effet : \texttt{/usr/local/bin}.
dans le répertoire prévu à cet effet~: \texttt{/usr/local/bin}.
Il reste enfin quelques exemples d'utilisation des outils de la
ligne de commande depuis un shell
@ -274,7 +275,7 @@ Au niveau du code source, ces fonctions sont approximativement
classées en deux catégories : \texttt{lib/} et \texttt{funcs/}.
La première contient les choses qui sont relativement figées,
et la seconde celles qui risquent de bouger. Cette classification
est en fait arbitraire.
est en fait indécement arbitraire.
\subsection{Structures, macros\dots}
@ -286,6 +287,7 @@ dans une jolie structure que nous allons examiner dès maintenant.
\begin{lstlisting}
/* in memory descriptor */
typedef struct {
int magic;
int width;
int height;
int type;
@ -296,7 +298,9 @@ typedef struct {
} FloatImg;
\end{lstlisting}\index{FloatImg}
Les deux premiers champs sont \textsl{obvious}.
Le premier champ, \texttt{magic}, servira un de ces jours à
robustifier l'ensemble du machin.
Les deux suivants sont \textsl{obvious}.
Le troisième est le type d'image : pour le moment, il y en a % trois
un certain nombre
qui sont définis\footnote{et plus ou moins bien gérés\dots} :
@ -328,7 +332,7 @@ quelques images...
Le champ \textsl{count} sera mis à 0 et
le champ \textsl{fval} sera initialisé à 15.0
(qui est la valeur maximale que peut renvoyer le capteur).
(qui est la valeur maximale que peut renvoyer ce capteur).
Ensuite, dans la boucle capture/cumul, \textsl{count} sera
incrémenté à chaque passe, et nous aurons donc, en finale,
toutes les informations nécessaires pour exploiter au mieux la dynamique
@ -338,11 +342,12 @@ maximale théorique est égale à $fval * count$.
La fonction \texttt{fimg\_printhead(FloatImg *h)} affiche
sommairement le contenu de ce descripteur,
et \texttt{fimg\_describe(FloatImg *head, char *txt)} propose
un affichage plus détaillé. Ça aide parfois.
un affichage plus détaillé. Ça peut parfois aider.
Une bonne partie des fonctions que nous allons voir est indéterministe.
Ce qui veut dire, en langage de tous les soirs, que ça risque de ne
pas être la même chose dans l'avenir.
pas être la même chose dans l'avenir. Mais après tout, ce n'est
encore qu'un concept en devenir, n'est-ce pas ?
% ----------------------------------
@ -360,7 +365,8 @@ int fimg_destroy(FloatImg *fimg);
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
la forme peut varier. Certains membres de cette structure sont
la forme \emph{peut} varier.
Certains membres de cette structure sont
documentés dans ce document, et les autres sont dangereux à
toucher. Les types d'images actuellement gérés sont les trois grands
classiques : gray, rgb et rgba. et expliquées quelques lignes plus haut.
@ -529,12 +535,15 @@ inutile, en fait l'inverse de l'upscaling.
\begin{lstlisting}
int fimg_halfsize_0(FloatImg *src, FloatImg *dst, int notused);
int fimg_halfsize_1(FloatImg *src, FloatImg *dst, int notused);
\end{lstlisting}
Attention lors de l'appel, le descripteur \texttt{dst} ne doit pas
contenir d'image, et doit être effacé avec un bon
\texttt{memset(\&result, 0, sizeof(FloatImg));} bien senti.
Et le résultat est très moyen : il n'y a pas d'interpolation.
La première propose un résultat très moyen : il n'y a pas d'interpolation,
alors que la seconde semble bien mieux.
\begin{lstlisting}
int fimg_extract_0(FloatImg *src, FloatImg *dst, int x, int y);
@ -572,6 +581,9 @@ typedef struct {
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{t} (le type de l'image) doit avoir les trois octets
de poids fort à 0.
% ----------------------------------
@ -639,10 +651,10 @@ de gérer une foultitude de formats numériques. C'est aussi un format
classique proposé par les gros scanners corporates.
\begin{lstlisting}
int fimg_write_as_png(FloatImg *src, char *outname, int flags);
int fimg_write_as_tiff(FloatImg *src, char *outname, int flags);
\end{lstlisting}
Tous les flags doivent être à zéro.
Tous les flags doivent être à zéro. Pour le moment.
\subsubsection{Vers FITS}\index{FITS}
@ -1157,7 +1169,8 @@ des deux valeurs \textsc{nbre} et \textsc{offs} calculées en préambule.
\end{verbatim}
Cette seconde partie sert à calculer avec la commande
\texttt{bc}\index{bc}
\texttt{bc}\index{bc}%
\footnote{\texttt{bc}, c'est vraiment un truc à découvrir.}
un coefficient variable en fonction du temps :
$sin(idx/16)$ afin d'avoir une oscillation du coefficient entre
-1.0 et 1.0, deux valeurs probablement glitchantes.
@ -1252,7 +1265,7 @@ vaguement expliqué page \pageref{contraste}.
L'option \texttt{-X} me permet d'intégrer des \textit{fritures}
expérimentales dans le binaire, et ne doit donc pas être
utilisée dans des scripts si on a des visions à long
utilisée dans des scripts si on a des visions à long (ou même)
terme.
\subsubsection{Upscaling}\index{upscaling}\label{upscaling}
@ -1321,7 +1334,7 @@ Je compte donc sur le bouquin de \textsl{Brunus} pour avancer\dots
Mmmmm... Ça semble un peu plus compliqué.
La documentation à ce sujet me semble ésotérique.
D'un autre coté, il
faut faire ça en \textbf{C}, ce qui ne peut être négatif.
faut faire ça en \textbf{C}, ce qui ne peut pas être négatif.
\subsection{ffmpeg}\index{ffmpeg}
@ -1341,9 +1354,37 @@ ffmpeg -nostdin \
Il y a d'autres logiciels pour lesquels écrire une fonction d'importation
serait bien~: \textsl{Geeqie}, un visualiseur d'image fort pratique, ou
\textsl{Krita} qui semble avoir les faveurs de dessinateurs de talent.
\textsl{Krita} qui semble avoir les faveurs de
dessinateurs de talent\footnote{Oui, David, c'est à toi que je pense.}.
% -------------------------------------------------------------------
% ===================================================================
\section{Le flou temporel}
Et si nous jouions sur l'axe du temps ?
Nous avons plus ou moins la magie du cumul sur la prise de vue
d'\textbf{image} en enchainant plusieurs capture d'image.
Maintenant, voyons ce que l'on peut faire à partir de plusieurs images.
On peut d'abord penser faire une moyenne (ou la somme, en fait) de toutes
ces images. Mais ce n'est qu'une façon déguisée de faire du cumul.
C'est à ce moment que nous changeons l'axe de vue du défi.
\subsection{textsl{moving average}}
Moyenne mobile.
\subsection{Interpolator}\index{interpolator}
Juste des calculs pas si simple que ça.
\subsection{Déviance}
Là, nous tombons dans la troiD de haut niveau, avec plein de maths
à l'intérieur.
% ===================================================================
\section{Et pour la suite ?}
En fait, je fait de la photo par la méthode du « cumul »\index{cumul}

View File

@ -4,12 +4,13 @@
* http://la.buvette.org/photos/cumul
*/
#define FIMG_VERSION 132
#define FIMG_VERSION 133
/*
* in memory descriptor
*/
typedef struct {
int magic;
int width;
int height;
int type;