Pourquoi utiliser la ligne de commande pour manipuler des images ou des vidéos ?
La ligne de commande permet de traiter des images et des vidéos en lots, de façon scriptée et reproductible. Wget télécharge en masse, ExifTool extrait les métadonnées, ImageMagick redimensionne et mosaïque, FFmpeg monte et anime, Inkscape convertit du vectoriel. Ce guide te montre deux scénarios concrets du début à la fin.
Tu veux télécharger des images ou des vidéos depuis une page web, effectuer des traitements massifs (redimensionnement, ajout d’un logo, conversion de format, application de filtres, mosaïque), créer des animations GIF, extraire une section d’une vidéo, monter plusieurs vidéos ou héberger une image sur un serveur libre ? La ligne de commande est ton amie.
🌘 Les outils
🌘 GNU Wget
GNU Wget est un client pour les protocoles FTP, HTTP et HTTPS. Il est entre autre utile pour extraire toutes les images d’un certain format d’une page web. Il est disponible sous la licence GPL.
🌘 ExifTool
ExifTool est un logiciel qui permet de manipuler les métadonnées dans des fichiers images. L’installation ne se fait pas par un gestionnaire de paquets, mais en suivant les instructions sur le site web.
🌘 CSVKit
CSVKit est un ensemble d’outils qui permettent d’effectuer des opérations sur des fichiers de données au format CSV.
- Site officiel
Nous l’utiliserons pour extraire des informations pertinentes depuis les fichiers de sortie d’ExifTool.
🌘 ImageMagick
ImageMagick sert à créer, modifier, composer et convertir des images matricielles (bitmaps). C’est un logiciel libre sous une licence permissive de type BSD 2-Clause.
🌘 FFmpeg
FFmpeg permet d’enregistrer, de convertir et de diffuser de l’audio et de la vidéo. Il est disponible sous la licence LGPL.
🌘 Inkscape
Inkscape est un logiciel bien connu pour éditer graphiquement des images vectorielles. Mais il est aussi possible de l’utiliser depuis la ligne de commande.
🌘 Scénario 1 : Téléchargement, redimensionnement, mosaïque et hébergement sur Lutim
graph TD
A[Page web Animalphotos.info] --> B[wget: télécharger les .jpg]
B --> C[ExifTool: extraire métadonnées<br>ImageWidth, ImageHeight]
C --> D[csvkit: calculer dimensions min]
D --> E[ImageMagick: redimensionner<br>avec couleur de fond moyenne]
E --> F[ImageMagick: montage 5×4]
F --> G[curl: uploader sur Lutim<br>via API REST]
G --> H[URL publique de la mosaïque]
Dans ce scénario, nous allons télécharger les images d’une page web, les redimensionner, créer une mosaïque et la publier en ligne sur un serveur d’images libre Lutim.
Nous allons créer une mosaïque de corneilles à partir des photos de la page Animalphotos.info.
🌘 Téléchargement avec Wget
wget -P photos_corneille/ -nd -p -H -A jpg \
http://animalphotos.info/a/topics/animals/birds/crows/
Les options :
-P photos_corneille/télécharge les fichiers dans le répertoirephotos_corneille;-ndne crée pas de hiérarchie de répertoires ;-ptélécharge tous les fichiers dépendants de la page ;-Htélécharge les fichiers même s’ils sont hébergés ailleurs (dans notre cas, ils sont hébergés sur Flickr) ;-A jpgtélécharge seulement les fichiers qui ont l’extension.jpg.
🌘 Caractéristiques des images téléchargées avec ExifTool et CSVKit
Tu peux facilement lister les caractéristiques des images téléchargées dans un fichier CSV :
exiftool -ImageWidth -ImageHeight -csv photos_corneille \
> exif_photo_corneille.csv
Ensuite, on obtient la largeur et la hauteur minimales des images pour créer la mosaïque :
dims=`csvsql --query "SELECT min(ImageWidth), min(ImageHeight) from exif_photo_corneille" exif_photo_corneille.csv | sed '2q;d'`
minImageWidth=$(cut -d',' -f1 <<< "$dims")
minImageHeight=$(cut -d',' -f2 <<< "$dims")
🌘 Redimensionnement avec ImageMagick
On redimensionne les images dans un rectangle ayant les dimensions respectives de minImageWidth par minImageHeight.
echo "Largeur: $minImageWidth\nHauteur:$minImageHeight"
C’est ici qu’on utilise la commande convert d’ImageMagick. La première utilisation permet de convertir l’image en un seul pixel, ce qui permet de retrouver la couleur « moyenne » de l’image, que l’on va utiliser comme couleur d’arrière-plan mainColor pour l’image redimensionnée. La seconde utilisation effectue la conversion de l’image selon les dimensions identifiées précédemment. L’image redimensionnée est centrée (-gravity center) dans le canevas de dimensions spécifiées par -extent avec un arrière-plan de couleur mainColor.
for i in $(find photos_corneille -type f)
do
myFilename=$(basename -- "$i")
mainColor=`convert "$i" +dither -colors 1 -unique-colors -format "%f\n%c\n" txt: | sed -r -n 's/^.*(\#[A-F0-9]{6}).*$/\1/p'`
convert "$i" \
-resize ${minImageWidth}x${minImageHeight} \
-background $mainColor \
-gravity center \
-extent ${minImageWidth}x${minImageHeight} \
"resize_photos_corneille/resize_${myFilename}"
done
🌘 Mosaïque avec ImageMagick
On a maintenant 20 images. On crée une mosaïque d’une largeur de 5 images et d’une hauteur de 4 images.
montage resize_photos_corneille/* \
-tile 5x4 \
-mode Concatenate montage_photos_corneille/montage.jpg
🌘 Chargement sur un hébergeur d’images en ligne Lutim
On charge l’image générée sur un hébergeur d’images en ligne Lutim avec le client HTTP cURL et son API REST.
curl -F "format=json" -F "file=@montage_photos_corneille/montage.jpg" https://francoispelletier.org/lutim
On reçoit une réponse en JSON comme suit :
{
"msg": {
"created_at": 1550955875,
"del_at_view": false,
"ext": "jpg",
"filename": "montage.jpg",
"limit": 0,
"real_short": "Ux46pjrt",
"short": "Ux46pjrt\\/rauu3q7P",
"thumb": null,
"token": "lWsOFhIqRYgLNA6ZbxKLXvFF"
},
"success": true
}
L’URL de la photo est, dans ce cas : https://francoispelletier.org/lutim/Ux46pjrt/rauu3q7P
🌘 Scénario 2 : Animation SVG, ajout de logo, GIF et superposition vidéo
graph TD
A[9 images SVG: bienvenue001..009] --> B[Inkscape: SVG → PNG]
B --> C[ImageMagick: ajouter logo LinuQ<br>avec -draw]
C --> D1[ImageMagick: créer GIF animé<br>-delay 50 -loop 0]
C --> D2[FFmpeg: créer MP4<br>-framerate 3 -vcodec png]
D2 --> E[FFmpeg: superposer animation<br>sur vidéo d'arrière-plan]
E --> F[animation-final.mp4<br>overlay centré, codec h264]
Dans ce scénario, nous allons animer une séquence d’images vectorielles, ajouter un logo et la joindre à un court extrait vidéo.
Nous avons 9 images qui épellent le mot Bienvenue.
for i in animation_bienvenue/*.svg; do echo "$i"; done
animation_bienvenue/bienvenue001.svg
animation_bienvenue/bienvenue002.svg
animation_bienvenue/bienvenue003.svg
animation_bienvenue/bienvenue004.svg
animation_bienvenue/bienvenue005.svg
animation_bienvenue/bienvenue006.svg
animation_bienvenue/bienvenue007.svg
animation_bienvenue/bienvenue008.svg
animation_bienvenue/bienvenue009.svg
🌘 Conversion SVG → PNG avec Inkscape
Pour convertir les images vectorielles en images matricielles, on utilise l’interface en ligne de commande d’Inkscape.
for i in animation_bienvenue/*.svg
do
inkscape -f "$i" -e "${i%.*}.png"
done
🌘 Ajout du logo avec ImageMagick
On utilise l’option -draw de convert pour ajouter une image à la position désirée. Notez que pour nos besoins, l’image du logo est déjà redimensionnée à la largeur désirée.
for i in animation_bienvenue/bienvenue*.png
do
convert "$i" -gravity south -draw "image over 0,0 0,0 animation_bienvenue/logo-linuq.png" "${i%.*}-aveclogo.png"
done
-gravity south: aligne les transformations au bas de l’image.image over 0,0 0,0: positionne l’image ajoutée au coin inférieur gauche.
🌘 Animation GIF avec ImageMagick
On utilise ImageMagick pour créer une animation au format GIF.
convert -delay 50 -loop 0 animation_bienvenue/bienvenue*-aveclogo.png animation_bienvenue/animation.gif
-delay 50: ajoute un délai de 50/100 seconde entre les images.-loop 0: crée une boucle d’animation infinie.
🌘 Téléchargement d’une vidéo d’arrière-plan
On ajoute une vidéo en arrière-plan à notre animation.
wget https://videos.pond5.com/automatic-data-processing-machine-footage-044586354_main_xl.mp4 -O video/automatic-data-processing-machine-footage-044586354_main_xl.mp4
🌘 Animation en MP4 avec FFmpeg
Création de l’animation Bienvenue avec le logo de LinuQ au format MP4.
ffmpeg -framerate 3 -i animation_bienvenue/bienvenue%03d-aveclogo.png -vcodec png video/animation-linuq.mov
-framerate 3: 3 images par seconde.-vcodec png: codec PNG pour garder la transparence.
🌘 Superposition de l’animation sur la vidéo avec FFmpeg
ffmpeg -i video/automatic-data-processing-machine-footage-044586354_main_xl.mp4 -i video/animation-linuq.mov -filter_complex "overlay=(W-w)/2:(H-h)/2" -pix_fmt rgba -vcodec h264 video/animation-final.mp4
-filter_complex "overlay=(W-w)/2:(H-h)/2": aligne les deux vidéos au centre du plus grand des deux.-pix_fmt rgba: garde le profil de couleur avec transparence.-vcodec h264: encode avec le codec H.264, très performant.
Résultat final :
Vidéo finale