Présentation
ImageMagick est un logiciel libre, comprenant une bibliothèque, ainsi qu'un ensemble d'utilitaires en ligne de commande, permettant de créer, de convertir, de modifier et d'afficher des images dans un très grand nombre de formats. Les images peuvent être découpées, les couleurs peuvent être modifiées, différents effets peuvent être appliqués aux images, les images peuvent subir des rotations, il est possible d'y inclure du texte, des segments, des polygones, des ellipses et des courbes de Bézier, etc.
ImageMagick est un logiciel libre : sa licence est compatible avec la licence GNU GPL. Il est disponible sur la plupart des plates-formes. ImageMagick est une marque déposée.
La plupart des fonctionnalités d'ImageMagick peuvent être utilisées en ligne de commande, mais souvent, toutefois, ImageMagick est combiné avec d'autres programmes écrits dans des langages comme Perl, C, C++, Python, Ruby, PHP, OCaml ou Java, pour lesquels des interfaces prêtes à l'emploi (PerlMagick, Magick++, PythonMagick, RMagick, MagickWand pour PHP et JMagick) sont disponibles. Cela permet de manipuler des images de façon plus automatisée.
En ligne de commande ImageMagick propose notamment les commandes suivantes :
- display
- convert
- mogrify
- identify
- import
- animate
- compare
- ...
Installation
Pour installer ImageMagick, utilisez simplement votre gestionnaire de paquets :
$ apt install imagemagick
Exemples d'utilisation
Convert
Conversion d'images en fichier PDF
Imaginez que vous souhaitiez transformer toutes les images du répertoire /home ou un ensemble d'images choisi en un document PDF unique. Pour cela, vous pouvez utiliser la première ou la deuxième des commandes suivantes :
$ cd /home
# Convertir toutes les images en un fichier PDF unique
$ convert *.jpg file.pdf
# Convertir les images choisies en un fichier PDF unique
$ convert foto1.jpg foto2.jpg foto3.jpg file.pdf
Vous pouvez également utiliser la compression avec l'option + compress, ou l'option -rotate pour faire pivoter l'image des degrés que vous spécifiez comme paramètre, etc. Par exemple, vous pouvez faire pivoter l'image de 90 degrés et ajouter une compression avec la commande suivante :
$ convert -rotate 90 foto.jpg +compress file.pdf
L'option -compress jpeg force la compression des images au format JPEG plutôt qu'au format MTIF par défaut. Cela a pour effet d'offrir un fichier PDF nettement plus petit et plus compatible avec Adobe Reader.
$ convert -compress jpeg image_*.png document.pdf
Conversion dans différents formats
- Créer une image
TGAà partir d'une imageJPEG:
$ convert image.jpg image.tga
- Convertir une image
JPEGenTIFF:
$ convert image.jpg image.tiff
- Convertir une capture
PNGenJPEGet la compresser à 20 % :
$ convert -quality 20 image.png image.jpg
- Créer un fichier
GIF animéà partir de plusieurs imagesPNG:
$ convert image_*.png fichier_anime.gif
- Créer un fichier
GIF animéà partir de plusieurs imagesJPG:
# Cette commande permet la création d'un GIF animé d'assez bonne qualité
# à partir de photos JPEG.
# - l'option -delay permet de spécifier un temps en centièmes de secondes,
# - l'option -loop 2 permet de faire 2 boucles des photos et 0 une lecture en continu.
$ convert -delay 50 -loop 0 *.jpg animation.gif
Redimensionnement d'images
- Redimensionner en conservant les proportions (l'une des dimensions de l'image finale pourra être inférieure aux valeurs passées en paramètre) :
$ convert test1.jpg -resize 500x1050 test1b.jpg
- Redimensionner en forçant un changement de proportions :
$ convert test1.jpg -resize 500x1050\! test1b.jpg
- Diminuer les dimensions d'une image tout en effectuant une rotation de 90° dans le sens horaire :
$ convert images.jpg -resize 50% -rotate 90 image.jpg
- Modifier la résolution de l'image :
# Les dimensions de l'image ne sont pas modifiées par cette opération,
# à l'affichage celle-ci apparaîtra donc plus grande ou plus petite selon les cas.
$ convert -units PixelsPerInch image.JPG -density 300 image.JPG
Gestion du format EXIF
- Tourner les images en fonction de leur orientation donnée dans le format
EXIF, comme par exemple les images issues d'un appareil photo numérique. L'image n'est retournée que si elle a été prise en portrait, si elle a été prise en paysage, celle-ci n'est pas modifiée :
$ convert image.jpg -auto-orient image_retournee.jpg
- Cette option est quasi-indispensable avec les images verticales dont on compte supprimer (option
-strip) ensuite lesexifset commentaires. Faute de quoi, une même image sera affichée verticalement ou horizontalement selon les visionneuses et - auteurs de blogs, songez-y ! - selon les navigateurs.
# L'ordre des options importe !
$ convert image.jpg -auto-orient -strip image_retournee.jpg
Extraction d'images à partir d'un fichier PDF
- Extraire des images
pngà partir de chaque page d'un document pdf :
$ convert -density 300 fichier.pdf page%d.png
- Ou si on ne veut qu'une page du fichier pdf (pour une page de couverture par exemple) :
$ convert -density 95 -quality 70 publication.pdf[0] couverture-publication.jpg
Une erreur du type suivant peut être rencontrée :
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert-im6.q16: no images defined `page%d.tif': Aucun fichier ou dossier de ce type @ error/blob.c/OpenBlob/2874.
convert-im6.q16: no images defined `fichier.pdf' @ error/convert.c/ConvertImageCommand/3258.
Dans ce cas, modifier le fichier policy.xml ainsi qu'indiqué en bas de cet article.
Mogrify
Mogrify est utilisé pour apporter la même modification à plusieurs images.
- Par exemple, pour augmenter le contraste d'une série de photos :
$ mogrify -sigmoidal-contrast 5,50% webcam-shot*.png
- Il est également possible d'utiliser
mogrifypour redimensionner une image (ou un lot d'images), avec la commande suivante :
$ mogrify -resize 800x600 image.jpg
- ou pour toutes les images d'un dossier :
$ mogrify -resize 800x600 *.jpg
- Attention,
mogrifyréécrit sur les images d'origine, pensez à faire des tests avant de lancer la commande finale ou utiliser l'option-pathpour que le résultat de la ligne de commande s'écrive dans un autre répertoire :
$ mogrify -resize 800x600 -path /autre_repertoire *.jpg
- Conversion de gif en jpg dans le même répertoire :
$ mogrify -format jpg *.gif
- Conversion et changement de proportions :
$ mogrify *.png -resize 500x1050\! -path /autre_repertoire *.jpg
Politique de sécurité d'Imagemagick
Description du problème
La politique de sécurité d'Imagemagick ne semble pas me permettre d'effectuer cette conversion de pdf en png. La conversion d'autres extensions semble fonctionner, mais pas à partir de pdf.
L'erreur suivante est rencontrée :
user@machine $ convert -density 300 -depth 8 -quality 90 input.pdf output.png
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert: no images defined `output.png' @ error/convert.c/ConvertImageCommand/3288.
Solution du problème
Ce problème est une solution de contournement pour une vulnérabilité de sécurité. La vulnérabilité a été corrigée dans Ghostscript 9.24, donc si vous avez cette version ou une version plus récente, vous n'avez plus besoin de cette solution.
Sur Ubuntu 19.04 à 22.04 et probablement toutes les versions ultérieures avec ImageMagick 6, voici comment corriger le problème en supprimant cette solution de contournement :
Assurez-vous d'avoir Ghostscript ≥9.24 :
$ gs --version
Si oui, supprimez la section suivante du fichier /etc/ImageMagick-6/policy.xml :
<!-- disable ghostscript format types -->
<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="PS2" />
<policy domain="coder" rights="none" pattern="PS3" />
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />
Détails : Il suffirait de supprimer la ligne contenant pattern="PDF" pour réactiver la conversion PDF. Je supprime également les lignes pour les autres types de fichiers PostScript car je ne vois aucune raison d'empêcher Image Magick de les utiliser. (Concerne uniquement un ordinateur personnel. Sur un serveur web, vous pourriez considérer cela comme dangereux car les fichiers PostScript peuvent contenir des scripts).
Plutôt que d'effacer ces lignes, il est aussi possible de les réécrire de la manière suivante :
# Pour PDF, remplacer la ligne :
<policy domain="coder" rights="none" pattern="PDF" />
# Par la ligne :
<policy domain="coder" rights="read | write" pattern="PDF" />
# Pour EPS, remplacer la ligne :
<policy domain="coder" rights="none" pattern="EPS" />
# Par la ligne :
<policy domain="coder" rights="read | write" pattern="EPS" />