\chapter{Image}
\label{chap:image}

Le traitement des images est un art à part entière. Nous allons
voir quelques grands classiques de la catégorie pas du tout
interactif. Le genre de machin que l'on peut ranger au fond
d'un script shell pour le réutiliser la semaine prochaine.

%  -------------------------------------------------------------------

\section{ImageMagick}\index{ImageMagick}

Attention, ça va devenir \textsl{hardu}%
\footnote{Nous attendons tous avec impatience l'ouvrage magistral
de maitre Brunus},
l'abondance d'options des outils ImageMagick est vraiment énorme,
et leurs interactions parfois troublantes\dots

Il y a plusieurs binaires dans le paquet : \texttt{convert} pour
la plupart des traitements,
\texttt{display} et \texttt{animate} pour visualiser des images,
\texttt{identify} pour en lire les méta-données.

\subsection{L'option \texttt{-geometry}}

C'est une notion importante, car elle est utilisée comme paramètre
par beaucoup d'options. C'est avec ça que l'on peut définir des
choses comme la taille (largeur et hauteur) d'une image, ou
la position d'un texte dans l'image, ou une zone sur laquelle
on va travailler.

Et c'est assez compliqué, mais pas que.

\begin{tabular}{|l|p{7cm}|}
\hline
Code		&		Signification			\\
\hline
scale\% 	&	Height and width both scaled by specified percentage.						\\
scale-x\%xscale-y\% &	Height and width individually scaled by specified percentages. (Only one \% symbol needed.)	\\
width 		&	Width given, height automagically selected to preserve aspect ratio.				\\
xheight 	&	Height given, width automagically selected to preserve aspect ratio.				\\
widthxheight 	&	Maximum values of height and width given, aspect ratio preserved.				\\
widthxheight\^ 	&	Minimum values of width and height given, aspect ratio preserved.				\\
widthxheight! 	&	Width and height emphatically given, original aspect ratio ignored.				\\
widthxheight> 	&	Shrinks an image with dimension(s) larger than the corresponding width and/or height argument(s). \\
widthxheight< 	&	Enlarges an image with dimension(s) smaller than the corresponding width and/or height argument(s). \\
area@ 		&	Resize image to have specified area in pixels. Aspect ratio is preserved.			\\
x:y 		&	Here x and y denotes an aspect ratio (e.g. 3:2 = 1.5).						\\
\hline
\end{tabular}


\subsection{Écrire du texte}

Voici un exemple concret
(tiré du script d'encodage du \textsc{cloître}\index{cloître})
qui montre l'essentiel pour bien débuter. C'est une fonction
écrite en bash\index{bash} qui rajoute un texte sur une image~:

\lstinputlisting[language=sh]{code/tagpic.sh}

Quelques explications semblent nécessaires, parce que certaines
options sont un peu ésotériques et parfois inter-dépendantes\dots

\begin{itemize}
\item{txtfont}
\item{fontsize}
\item{kerning}
\item{colors}
\item{txtopts}
\item{gravity}
\item{annotate}
\end{itemize}

Question : comment mettre une couleur de fond à ce texte ?

\subsection{montage}

Krkrkr

\subsection{Faire des GIFs animées}\index{GIF}

Ces petites images clignotantes sont l'essence même du
Web\index{web} moderne depuis 1992 malgré leurs limitations,
et \texttt{convert} sait très bien les générer.

\begin{verbatim}
convert -delay 20 -loop 0 a.png b.png c.png foo.gif
\end{verbatim}

Ce sujet pertinent est abordé plus en détails en
page \pageref{chap:gif89a}

%	------------------------------------------

\subsection{Extraire une partie de l'image}

Dans cette fonctionnalité aussi, il semble y avoir quelques
subtilités.

\begin{verbatim}
DIMENSION="1024x768"
POSITION="+R12+0"
convert -crop ${DIMENSION}${POSITION} +repage $img $dst
\end{verbatim}

\textsl{Use +repage to completely remove/reset the virtual canvas
meta-data from the images.}
En gros, on en a besoin quand une opération va
changer la dimension de l'image. En détail, j'ai pas tout compris.

%	------------------------------------------

\subsection{Trucs}

convert -average frame*.png output.png

%	------------------------------------------

\subsection{Ressources}

Le futur livre de Brunus. Réclamez les prmiers drafts dans
l'IRC\index{IRC} \texttt{freenode\#paulla} \textit{:)}

\texttt{http://www.fmwconcepts.com/imagemagick/index.php}

% https://legacy.imagemagick.org/Usage/resize/

%  -------------------------------------------------------------------

\section{Gmic}\index{Gmic}

\textsl{Perform generic image processing operations, through the G'MIC
language interpreter. gmic: GREYC's Magic for Image Computing.}

Gmic se base sur une grosse bibliothèque de fonctions écrite
en \texttt{C++}\index{C++} dont l'utilisation est bien
docummentée dans le livre ???\index{XXX}

Existe aussi en plugin pour Gimp\index{Gimp} avec une interface
pleine de curseurs et de boutons, qui facilite (ou pas) l'exploration
des possibles.

%  -------------------------------------------------------------------

\section{NetPBM}\index{netpbm}\label{netpbm}

With the Netpbm file formats, it’s trivial to output pixels using
nothing but text based IO%
\footnote{https://www.vidarholen.net/contents/blog/?p=904}.

\begin{verbatim}
#!/bin/bash
exec > my_image.ppm    # All echo statements will write here
echo "P3 250 250 255"  # magic, width, height, max component value
for ((y=0; y<250; y++)) {
  for ((x=0; x<250; x++)) {
    echo "$((x^y)) $((x^y)) $((x|y))" # r, g, b
  }
}
\end{verbatim}

\subsection{Questions}

Comment faire un \textsl{resize} avec NetPBM ?
Est-il nécessaire d'apprendre la bibliothèque de fonctions
\texttt{libnetpbm}\footnote{Réponse: oui.} ?

%  -------------------------------------------------------------------

\section{Portable Network Graphic}\index{PNG}

Voici le problème du soir%
\footnote{\textsl{trollday} Fri Nov 13 00:07:19 CET 2020} :
j'utilise pour lire ce format de fichier la bibliothèque
\texttt{pnglite} qui a de gros soucis avec beaucoup de
ceux-ci, par exemple ceux qui sont en \texttt{sRGB} crées
par des outils essentiels comme POVray\index{POVray}.
Il serait bon de voir la \texttt{libpng} officielle.

pngcrush ? optipng ?

\texttt{pngtopnm \$png | pnmtopng > \$goodpng}

%  -------------------------------------------------------------------

\section{Tag Image File Format} \index{TIFF} \label{TIFF}

\begin{quote}
Yes, but tiffcp is by far the most significant case. And perhaps one of the
most used of the tools. I may not be impartial on this, though :-) because I
use it heavily.
\end{quote}

\begin{verbatim}
       tiffcp  combines  one  or more files created according to the Tag Image
       File Format, Revision 6.0 into a single TIFF file.  Because the  output
       file  may  be  compressed  using  a  different algorithm than the input
       files, tiffcp is most often used to convert between different  compres‐
       sion schemes.
\end{verbatim}



%  -------------------------------------------------------------------
