Imagemagick est un logiciel en ligne de commande pour la manipulation de fichiers images. Il fait partie des logiciels “couteaux suisses” de manipulation de fichiers multimédia (avec ffmpeg et sox). Imagemagick est utile pour :
Ce logiciel porte bien son nom, arriver à s'en servir correctement tient parfois de la magie noire…
Imagemegick se compose de plusieurs commandes indépendantes : convert, identify, mogrify, composite, montage, display, animate, compare, stream, import
Avec la version 7 d'Imagemagick, magick est ajoutée pour l'ensemble des commandes précédentes (magick convert, magick composite, etc.).
Appliquer une palette à une image existante (exemple plus fourni)
# ImageMagick 6.9.11-60 Q16 x86_64 2021-01-25 @ Debian 12 / tenko # Définir la palette en indiquant des couleurs convert xc:'#1268b9' xc:'#dfebf6' -append palette.png # Appliquer convertimage.png -remap palette.png image_convertie.png
La commande mogrify permet de traiter toutes les images d'un répertoire. (cf : http://www.imagemagick.org/Usage/basics/#mogrify )
Si mogrify ne fait pas l'affaire, il est aussi possible d'utiliser convert, dans ce cas il vaut mieux passer par un script qui traitera les images une par une, car convert charge toutes les images en mémoire avant de les transformer.
Réduire toutes les images d'un répertoire
# 20200510 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin mogrify -path small -resize 16x24! *.png
Toutes les images au format png seront réduites à exactement 16×24 pixels et enregistrées dans le sous-dossier “small” (à créer au préalable)
Variante, en pourcentage avec adaptation de la qualité du JPEG (recherche poussée sur le sujet)
# 20220511 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin mogrify -resize 50% -quality 82 *.JPG
Agrandir toutes les images d'un répertoire sans interpolation
# 20210525 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin mogrify -resize 200% -filter point *.png
Utile pour agrandir du pixel art sans aliasing
Rotation de toutes les images correspondant à un certain motif
# 20220308 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin mogrify -rotate 90 *td.jpg # tous les fichiers finissant par td.jpg (tructd.jpg, machin_td.jpg)
90 pour 1/4 de tour dans le sens des aiguilles d'une montre (dextrogyre!)
Passer toutes les images PNG en JPG
# 202204017 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin mogrify -format jpg -quality 85 *.png
Les images PNG originales ne seront pas effacées
Convertir des images WEBP en JPEG vers un sous-dossier
# 20220512 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin mkdir ./conversion # créer le dossier si nécessaire mogrify -format JPEG -path conversion *.webp # enregistrer le résultat dans le dossier conversion
Convertir des GIF en MP4
# 20230123 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin ffmpeg -i bloavezh_mat.gif -movflags faststart -pix_fmt yuv420p bloavezh_mat.mp4
Attention, les dimensions d'un mp4 sont obligatoirement un multiple de 2
Réduire en fixant une dimension
# 20220322 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert in.jpg -resize 400x -quality 85% out.jpg
Toutes les images seront converties pour avoir une largeur de 400 pixels
Redimensionner à un format fixe
# 20220322 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert *.jpg -resize 1200x900^ -gravity center -extent 1200x900 test_%d.jpg
Toutes les images JPEG seront converties à 1200×900, en agrandissant la plus petite dimension sans changer les proportions : l'image remplit toute la surface demandée et peut la dépasser, dans ce cas elle est tronquée. (nb : pas de wildcard dans le nom de fichier en sortie).
Assembler deux images
# 20210824 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin # deux images de 877x1240px assemblées en un A4 paysage @ 150dpi convert -page +0+0 gauche.png -page +878+0 droite.png -mosaic compo.png
Composer une planche contact
# 20210913 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin # une image est composée à partir d'une série d'images à taille réduite montage 001.tif 002.tif 003.tif 004.tif 005.tif 006.tif 007.tif 008.tif -tile 2x4 -geometry 150x225 montage.jpg
Variante en gardant le fond transparent.
# 20220212 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin montage p1.png p2.png p3.png p4.png -tile 4x -background none -geometry 32x24 PNG32:montage.png
Script plus complet par ici : https://lephotographelibre.wordpress.com/2017/07/01/script-faire-une-planche-contact-noir-et-blanc-avec-imagemagick/
Miniatures de tout un répertoire
# 20210913 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin # [0] permet d'utiliser uniquement la 1re image de fichiers multi images (gif animé, par exemple) montage *[0] montage.jpg
Montage d'une liste de fichiers
Aller chercher tous les fichiers d'un certain type depuis les sous-répertoires, les copier dans un répertoire et en faire une planche contact
# 20210913 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin find ./ -name '*.png' -exec cp -prv '{}' '/home/emoc/fichiers_a_traiter/' ';' ls *.png > files.txt montage @files.txt -geometry 800x800+0+0 -tile 6x6 -background none montage.png
Ajouter une bordure de couleur à une image (source)
# 20200515 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert image.png -shave 1x1 -bordercolor black -border 1 image_avec_bordure.png # mogrify -shave 1x1 -bordercolor black -border 1 -format png *.png # utile pour le faire sur tout un répertoire
Travailler sur des fichiers PDF
Sur Debian 12 LXDE l'erreur attempt to perform an operation not allowed by the security policy `PDF
', il est nécessaire de modifier le fichier /etc/ImageMagick-7/policy.xml
pour ajouter ou modifier la ligne suivante : <policy domain=“coder” rights=“read | write” pattern=“PDF” />
sudo nano /etc/ImageMagick-6/policy.xml
Conversion d'un fichier .pdf en une série d'images
# 20200705 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert -density 150 fichier.pdf image_%02d.png
Conversion d'une série d'images en pdf
# 20210604 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin # Les images ont une définition identique + attention à l'ordre des arguments : placer les fichiers bitmap avant density et units convert ./recto.png ./verso.png -density 300 -units pixelsperinch document.pdf
Conversion pdf avec images compressées en jpeg
# 20210913 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert -density 100 -compress jpeg -quality 70% image.jpg document.pdf
Pour convertir toutes les images d'un répertoire, on peut utiliser le joker * :
# 20210913 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert -density 150 -compress jpeg -quality 80% * file.pdf
Ou les nommer une par une
convert -density 150 -compress jpeg -quality 80% image_1.jpg image_2.jpg image_3.jpg file.pdf
Ou utiliser le «joker» *
convert -density 150 -compress jpeg -quality 80% image_*.jpg file.pdf
Réduire la taille d'un fichier pdf
Adapter density et quality selon les besoins
# 20210927 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert -density 150 ./original.pdf -compress jpeg -quality 80% reduit.pdf
Créer des pages factices
Utile pour tester des modèles PAO, la boucle permet de définir le nombre de pages
#!/bin/bash # 20210913 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin for i in $(seq -f "%02g" 1 16) do (convert -background white -fill black -size 877x1240 -gravity center label:"$i" page_"$i".png) # version alternative avec un bord noir de 1 pixel # (convert -background white -fill black -size 877x1240 -gravity center label:"$i" -shave 1x1 -bordercolor black -border 1 page_"$i".png) done
Découper / remonter
#!/bin/bash # 20230313 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin # Prendre une image de 1920 x 800 et la découper en 3 images de 640 x 800 # Et la mettre sur fond blanc dans un carré de 1920 x 1920 FICHIER=swamp # Découpe convert "$FICHIER".png +gravity -crop 640x800 "$FICHIER"_%02d.png # Recadrage convert -size 1920x2400 canvas:white "$FICHIER".png -geometry +0+800 -composite "$FICHIER"_cadre.png
Voir les scripts de ce repo pour différents types d'imposition : https://github.com/emoc/edition_imposition/
Monter plusieurs exemplaires du même document
A partir d'un original en A4, en mettre deux exemplaires en A5 sur le même feuillet
# 20211113 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / Debian Stretch 9.5 @ Kirin convert -density 300 ./original.pdf original.png montage -geometry 1748x2480 -tile 2x1 original.png original.png 2xoriginal.png convert ./2xoriginal.png -density 300 -units pixelsperinch -compress jpeg -quality 80% 2xoriginal.pdf
D'un fichier pdf exporté depuis Scribus à un fichier pdf comprenant 4 exemplaires montés pour impression (pour imprimer des vero de flyers). J'ai préparé le fichier Scribus en A5 au lieu de A6, pdfjam est utilisé pour remettre le fichier au format A4.
#!/bin/bash # debian 9.5 Stretch + LXDE @ kirin 2022725 # Scribus 1.4.6 / ImageMagick 6.9.7-4 Q16 x86_64 20170114 / pdfjam 2.0.8 # prendre le fichier flyer-verso.pdf exporté depuis scribus (A5 :/ ) # le transformer en fichier png @ 300dpi convert -density 300 flyer-verso.pdf flyer-verso.png # le monter sous forme 2x2 pour imprimer sur un A4 montage flyer-verso.png flyer-verso.png flyer-verso.png flyer-verso.png -tile 2x2 -geometry 1748x2480 flyer_montage.png # transformer en pdf convert flyer_montage.png -density 300 -units pixelsperinch flyer_montage.pdf # adapter le format en A4 avec pdfjam pdfjam --paper a4paper --outfile flyer_montage_A4.pdf flyer_montage.pdf # effacer les fichiers temporaires rm flyer_montage.png rm flyer_montage.pdf
Conversion du pdf simple page en image
convert -density 300 affiche.pdf image.png
A partir d'images A5 @ 600 dpi
montage image.png image.png -tile 2x1 -geometry 3508x4961 flyer_montage.png convert flyer_montage.png -density 600 -units pixelsperinch 2xA5.pdf