TetaTricks/chap/image.tex

371 lines
12 KiB
TeX
Raw Normal View History

2020-09-29 10:41:53 +02:00
\chapter{Image}
\label{chap:image}
2020-11-10 02:40:30 +01:00
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.
2022-06-24 03:19:32 +02:00
\begin{itemize}
\item{ImageMagick}
\item{Gmic}
\item{NetPBM}
\item{Portable Network Graphic}
\item{TIFF}
\end{itemize}
2020-09-29 10:41:53 +02:00
% -------------------------------------------------------------------
\section{ImageMagick}\index{ImageMagick}
2020-11-01 19:32:45 +01:00
Attention, ça va devenir \textsl{hardu}%
2020-11-10 02:40:30 +01:00
\footnote{Nous attendons tous avec impatience l'ouvrage magistral
de maitre Brunus},
2020-11-13 01:35:31 +01:00
l'abondance d'options des outils ImageMagick est vraiment énorme,
et leurs interactions parfois troublantes\dots
2020-12-12 04:13:54 +01:00
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.
2022-06-24 03:19:32 +02:00
Ils partagent un certain nombre d'options communes.
Certains d'entre eux peuvent avoir un effet destructif%
\footnote{En plus d'avoir un nom de série $Z$.},
vous êtes prévenus.
2020-12-12 04:13:54 +01:00
\subsection{L'option \texttt{-geometry}}
2020-11-13 01:35:31 +01:00
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.
2020-11-01 19:32:45 +01:00
2021-04-15 22:50:39 +02:00
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}
2022-09-12 01:36:48 +02:00
% !!!
% est-il nécessaire de traduire ce tableau ?
2021-04-15 22:50:39 +02:00
2020-11-01 19:32:45 +01:00
\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
2020-12-12 04:13:54 +01:00
écrite en bash\index{bash} qui rajoute un texte sur une image~:
2020-11-01 19:32:45 +01:00
2020-11-24 00:42:06 +01:00
\lstinputlisting[language=sh]{code/tagpic.sh}
2020-11-01 19:32:45 +01:00
2022-09-12 01:36:48 +02:00
Une petite commande toute bête pour rajouter la date facilement à une photo
daprès les données EXIF\index{EXIF}~:
\begin{lstlisting}
2022-10-30 22:51:57 +01:00
convert nom_du_fichier_source.jpg -gravity SouthEast \
-font Fudd-Regular -pointsize 40 -fill white \
-annotate +20+20 "%[exif:DateTimeOriginal]" \
2022-09-12 01:36:48 +02:00
-quality 100 nom_du_fichier_destination.jpg
\end{lstlisting}
2020-11-10 02:40:30 +01:00
Quelques explications semblent nécessaires, parce que certaines
2020-11-24 00:42:06 +01:00
options sont un peu ésotériques et parfois inter-dépendantes\dots
2020-11-10 02:40:30 +01:00
2022-10-30 22:51:57 +01:00
\begin{tabular}{|l|p{7cm}|}
\hline
2022-12-16 20:41:32 +01:00
Code & Signification \\
2022-10-30 22:51:57 +01:00
\hline
2022-12-16 20:41:32 +01:00
-txtfont & \\
-fontsize & taille des caractères \\
-kerning & espacement entre les caractères \\
-color & couleur de l'encre \\
-stroke & couleur 'bord' de caractère \\
-strokewidth & largeur de la bordure \\
-txtopts & \textsl{Gni?} \\
-gravity & vers quel point cardinal le texte va-t-il être \textsl{tiré} ? \\
-annotate & \texttt{+30+30 "texte à écrire"} \\
2022-10-30 22:51:57 +01:00
\hline
\end{tabular}
2022-12-16 20:41:32 +01:00
Pour avoir la liste des couleurs disponibles : \texttt{convert -list color}
2023-01-29 22:16:13 +01:00
et celles des fontes : \texttt{convert -list font}.
2022-12-16 20:41:32 +01:00
2023-01-29 22:16:13 +01:00
\subsubsection{Questions...}
2022-10-30 22:51:57 +01:00
2020-11-10 02:40:30 +01:00
\begin{itemize}
2022-10-30 22:51:57 +01:00
\item{Comment mettre une couleur de fond à ce texte ?}
2023-01-29 22:16:13 +01:00
\item{Et un texte semi-transparent ?}
2020-11-10 02:40:30 +01:00
\end{itemize}
2023-01-29 22:16:13 +01:00
% ------------------------------------------
% faire des affiches
\subsection{montage}\index{montage}
2021-01-20 04:53:48 +01:00
2022-09-12 01:36:48 +02:00
\begin{quote}
create a composite image by combining several separate images. The images are
tiled on the composite image optionally adorned with a border, frame,
image name, and more.
\end{quote}
Krkrkr\dots
2020-12-12 04:13:54 +01:00
2023-01-29 22:16:13 +01:00
% ------------------------------------------
2022-12-16 20:41:32 +01:00
\subsection{Faire des GIFs animées}\index{gif89a}
2020-11-10 02:40:30 +01:00
2020-12-12 04:13:54 +01:00
Ces petites images clignotantes sont l'essence même du
Web\index{web} moderne depuis 1992 malgré leurs limitations,
2023-01-29 22:16:13 +01:00
et \texttt{convert} sait très bien\footnote{modulo un taux de
compression pas génial.} les générer.
2022-09-12 01:36:48 +02:00
Encore un grand merci à Compuserve\index{Compuserve} pour cette
création essentielle à l'art graphique moderne.
2020-11-10 02:40:30 +01:00
\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
2023-01-29 22:16:13 +01:00
page \pageref{chap:gif89a} avec, nous l'espérons, un exemple
de dithering avec la palette de couleur \texttt{EGA}\index{EGA}.
2020-11-10 02:40:30 +01:00
2021-04-15 22:50:39 +02:00
% ------------------------------------------
2020-11-10 02:40:30 +01:00
\subsection{Extraire une partie de l'image}
Dans cette fonctionnalité aussi, il semble y avoir quelques
subtilités.
\begin{verbatim}
2020-11-13 01:35:31 +01:00
DIMENSION="1024x768"
POSITION="+R12+0"
convert -crop ${DIMENSION}${POSITION} +repage $img $dst
2020-11-10 02:40:30 +01:00
\end{verbatim}
2020-12-12 04:13:54 +01:00
\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
2021-04-15 22:50:39 +02:00
changer la dimension de l'image. En détail, j'ai pas tout compris.
% ------------------------------------------
2020-11-13 01:35:31 +01:00
2022-09-12 01:36:48 +02:00
\subsection{conversion vers TGA} \index{TGA}
On trouve encore en circulation de très vieux logiciels qui ne savent lire
qu'un encore plus ancien format : \textsl{Targa file format}.
2022-12-16 20:41:32 +01:00
Et dans une variante bien précise : mode \textsc{rgb} et non compressé%
\footnote{Un jour, peut-être, ça va changer\dots}.
2022-09-12 01:36:48 +02:00
2022-12-16 20:41:32 +01:00
Il nous faut donc une incantation bien précise avec, heureusement, des
arguments aux noms évocateurs :
2022-09-12 01:36:48 +02:00
\begin{lstlisting}
GOTO_TGA ()
{
convert $1 \
-compress none \
-alpha off \
-colorspace RGB \
-type truecolor \
$2
}
\end{lstlisting}
On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
\begin{verbatim}
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
\end{verbatim}
% ------------------------------------------
2023-01-29 22:16:13 +01:00
\subsection{identify}\index{identify}
Cette commande nous fournit un ensemble d'informations\footnote{aka metadata}
pertinentes sur un fichier image~: format, résolution, couleur ou n/b,
nombre de bits par pixel\dots
\begin{verbatim}
tth@konrad:~/GravityField $ identify WS/nanim//00000.pgm graph.png
WS/nanim//00000.pgm PGM 2048x2048 2048x2048+0+0 16-bit Grayscale
Gray 20.5765MiB 0.690u 0:00.690
graph.png PNG 640x640 640x640+0+0 8-bit sRGB 102c 18165B 0.000u 0:00.000
\end{verbatim}
https://imagemagick.org/script/escape.php
Et ces données peuvent être utilisé pour rajouter une simili
\textsc{IA}\footnote{Sorry, private joke inside\dots}
% ------------------------------------------
2022-01-29 22:46:41 +01:00
\subsection{Trucs}
2022-09-12 01:36:48 +02:00
\begin{itemize}
\item{convert -average frame*.png output.png}
\end{itemize}
2023-01-29 22:16:13 +01:00
Il y en plein d'autres, des tricks \textsl{àlc} à découvrir.
Ce sera, pour vous amis lecteurs, une dure mission à assumer.
2022-01-29 22:46:41 +01:00
% ------------------------------------------
2020-12-12 04:13:54 +01:00
\subsection{Ressources}
2020-09-29 10:41:53 +02:00
2023-10-08 21:56:41 +02:00
Le futur livre de Brunus.
Réclamez les prmiers drafts dans
l'IRC\index{IRC} \texttt{libera.chat\#paulla} \textit{:)}
2020-12-12 04:13:54 +01:00
\texttt{http://www.fmwconcepts.com/imagemagick/index.php}
2020-09-29 10:41:53 +02:00
2021-04-15 22:50:39 +02:00
% https://legacy.imagemagick.org/Usage/resize/
2020-11-01 19:32:45 +01:00
% -------------------------------------------------------------------
2020-09-29 10:41:53 +02:00
2020-11-01 19:32:45 +01:00
\section{Gmic}\index{Gmic}
2020-09-29 10:41:53 +02:00
2020-12-12 04:13:54 +01:00
\textsl{Perform generic image processing operations, through the G'MIC
language interpreter. gmic: GREYC's Magic for Image Computing.}
2022-09-12 01:36:48 +02:00
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
bibliothèque de fonctions écrite
2022-04-03 11:56:49 +02:00
en \texttt{C++}\index{C++} dont l'utilisation est bien
2022-12-16 20:41:32 +01:00
documentée dans le livre ???\index{XXX} mais nécessite quand même
de solides bases dans les subtilitées fourbes du \texttt{C++}.
2020-09-29 10:41:53 +02:00
2022-06-09 21:08:46 +02:00
Gmic existe aussi en plugin pour Gimp\index{Gimp} avec une interface
2022-04-03 11:56:49 +02:00
pleine de curseurs et de boutons, qui facilite (ou pas) l'exploration
des possibles.
2020-09-29 10:41:53 +02:00
% -------------------------------------------------------------------
2020-11-10 02:40:30 +01:00
\section{NetPBM}\index{netpbm}\label{netpbm}
With the Netpbm file formats, its trivial to output pixels using
nothing but text based IO%
\footnote{https://www.vidarholen.net/contents/blog/?p=904}.
2020-09-29 10:41:53 +02:00
2020-11-10 02:40:30 +01:00
\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
}
}
2020-11-13 01:35:31 +01:00
\end{verbatim}
\subsection{Questions}
2020-12-12 04:13:54 +01:00
Comment faire un \textsl{resize} avec NetPBM ?
2020-12-22 22:53:57 +01:00
Est-il nécessaire d'apprendre la bibliothèque de fonctions
2022-04-03 11:56:49 +02:00
\texttt{libnetpbm}\footnote{Réponse: oui.} ?
2020-11-13 01:35:31 +01:00
% -------------------------------------------------------------------
\section{Portable Network Graphic}\index{PNG}
Voici le problème du soir%
2020-12-12 04:13:54 +01:00
\footnote{\textsl{trollday} Fri Nov 13 00:07:19 CET 2020} :
2020-11-13 01:35:31 +01:00
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
2022-06-09 21:08:46 +02:00
par des outils essentiels comme POVray\index{Povray}.
2020-12-22 22:53:57 +01:00
Il serait bon de voir la \texttt{libpng} officielle.
2020-11-13 01:35:31 +01:00
2020-12-22 22:53:57 +01:00
pngcrush ? optipng ?
2020-11-13 01:35:31 +01:00
\texttt{pngtopnm \$png | pnmtopng > \$goodpng}
2020-12-22 22:53:57 +01:00
% -------------------------------------------------------------------
\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}
2020-11-13 01:35:31 +01:00
2022-12-16 20:41:32 +01:00
% -------------------------------------------------------------------
\section {EXIF} \index{EXIF}
2022-12-31 15:39:58 +01:00
Un \textit{tag} EXIF est un petit morceau d'information nommée inclus
dans un fichier image. Il peut contenir des données comme la sensibilité
ISO\index{ISO} du capteur, ou le modèle d'objectif utilisé.
D'autres informations en page \pageref{whatisExdif}
2022-12-16 20:41:32 +01:00
2022-06-24 03:19:32 +02:00
% -------------------------------------------------------------------
2020-11-13 01:35:31 +01:00
2022-06-24 03:19:32 +02:00
\section{Cimg} \index{Cimg}
\texttt{Cimg} est l'énorme bibliothèque de fonctions
(écrites en \texttt{C++}\footnote{\textsc{wtf?}}) sur lesquelles
2022-12-16 20:41:32 +01:00
est basé Gmic. C'est long à compiler, ça produit des binaires
2022-06-24 03:19:32 +02:00
énormes, mais il semble bien que ça puisse faire des trucs géniaux.
2022-12-31 15:39:58 +01:00
Peut-être\footnote{Les rêves ne sont pas interdits.}, existe-il une
interface pour le Fortran moderne ?
2022-09-12 01:36:48 +02:00
\subsection{\textsc{hello world}}
2022-06-24 03:19:32 +02:00
\begin{lstlisting}
#define cimg_use_png
#include "CImg.h"
using namespace cimg_library;
#define BLUR 0.35
int main(int argc,char **argv)
{
if (3 != argc) {
fprintf(stderr, \
"Usage: %s infile.png outfile.png\n", argv[0]);
exit(1);
}
CImg<unsigned char> imgIn (argv[1]);
CImg<unsigned char> imgOut = \
imgIn.get_norm().blur(BLUR).normalize(0, 255);
imgOut.save(argv[2]);
return 0;
}
\end{lstlisting}
2020-11-13 01:35:31 +01:00
2022-12-16 20:41:32 +01:00
Un concept interessant, mais pas évident au premier abord. Un peu comme
les branchements dans Chuck\index{Chuck} ou les pipes du shell\dots
2022-09-12 01:36:48 +02:00
\subsection{Questions...}
\begin{itemize}
\item{Comment virer le canal alpha à l'enregistrement d'une image en PNG ?}
\end{itemize}
2020-11-13 01:35:31 +01:00
% -------------------------------------------------------------------