Table des matières

, , , ,

Imagemagick

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.).

Animation

Voir Création de gifs animés avec Imagemagick

Composition d'images

Voir composition d'images avec imagemagick

Couleur

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

Traitement par lot

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.

Exemples

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

Redimensionnement d'images

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).

Assemblages d'images

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

Petits trucs pratiques

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

Imposition

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

4 flyers sur la même page A4

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

2 flyers A5 sur la même page A4

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

Ressources