29. Images en ligne de commande : imagemagick

Rentrons dans le vif du sujet :

Informations

Au préalable de toute opération, Image Magick (IM) va nous permettre d’obtenir des informations sur l’image. Celles-ci peuvent être basiques ou plus développées :

identify monimage.jpg
identify -verbose monimage.jpg

Le retour est dans le premier cas :

Neige.jpg JPEG 1211x2359 1211x2359+0+0 8-bit sRGB 1.60686MiB 0.000u 0:00.000

Après le nom du fichier vient son type, sa taille (avec d’éventuels décalages), sa profondeur de couleur, son type colorimétrique, son poids et le temps nécessaire pour la lire.

Les informations retournées dans le second cas (-verbose) étant très nombreuses, je vous laisse les découvrir.

Réduction à une taille donnée

Ici, le problème est de produire des images de fond d’écran.

Imaginons que l’écran ait une taille de 2048×1152 pour des dimension de 10.8×6.1 in, ou 27.5×15.5 cm. La résolution en pixel per inch, ou en points par pouce est alors de 189 ppp.

L’objectif est de produire des images de 2048×1152 en 189 dpi. Évidemment, celles-ci doivent conserver leur ratio. On sait d’autre part que l’écran sera toujours en mode paysage.

Cn commence par réduire la hauteur de toutes les images à 1152 pixels (avec une résolution de 189 dpi, sa taille sera donc celle de l’écran). Trois cas peuvent alors se présenter :

  • la largeur est alors plus petite que 2048, auquel cas, il faudra faire apparaître des bordures noires pour combler le vide,
  • la largeur est précisément de 2048 et il n’y a rien à faire et
  • la largeur est supérieure à 2048, auquel cas, il faudra la réduire et faire apparaître des bordures noires en haut et bas de celle-ci.

Avec IM, il faut savoir que par défaut, le ratio de l’image est préservé. De plus, l’option « – resize » de convert ou mogrify, les deux utilitaires d’IM permettant respectivement de modifier une image en en produisant une nouvelle et de modifier une image en l’écrasant, non seulement préserve le ratio, mais agit simplement en réduisant la taille de l’image pour la placer à l’intérieur du cadre imposé par les dimensions spécifiées, avec l’une ou l’autre des dimensions maximales.

Enfin, le choix de mogrify est intéressant, car il évite de devoir spécifier un nom d’image particulier pour chaque image créée par convert. Mais, évidemment, la prudence exige un backup préalable des images, réalisée avec :

cp *.jpg ../rep_back/

alors qu’on est dans le répertoire contenant les images et que le répertoire de backup se nomme « rep_back » et se situe au même niveau que le répertoire précédent.

Ensuite, c’est très simple. Il suffit de se trouver dans le répertoire contenant les images et de lancer :

mogrify -resize '2048x1152>' *.jpg

Deux précisions :

  • le signe > signifie que toutes les images dont l’une ou l’autre des dimensions est plus importante que celle demandée et
  • les ‘…’ sont présents pour éviter que le signe > ne soit interprété par le shell.

On se retrouve alors avec des images toutes plus petites que ou égale à la taille de l’image demandée.

Référence pour resize : https://legacy.imagemagick.org/Usage/resize/#resize.

Reste à remplir les vides. Malgré que les afficheurs de fond d’écran permettent d’afficher des images sans les déformer au dessus d’un fond noir, par exemple, il peut être intéressant de laisser l’afficheur adapter les images à l’écran parce que certaines le permettent. Alors, pour celles qui ne le permettent pas, il est nécessaire d’en faire des images à la bonne taille.

Conversion jpg vers pdf

Le problème est de convertir toutes les images jpg situées dans un unique répertoire en un seul pdf.

Deux étapes sont à réaliser :

ls *.jpg | xargs -I% convert % %.pdf 

où le ls crée une liste des fichiers, le « pipe » (|) envoie cette liste à la commande xargs. En effet, la commande convert ne dispose pas d’entrée standard et xargs utilise la commande passée sur son premier argument pour passer le fichier en entrée standard comme argument de la commande convert. Le drapeau -I de xarg, évite de passer tous les fichiers images en une fois à convert (comme de multiples arguments) pour faire le même fichier de sortie. Avec -I on récupère le nom de fichier dans % et on demande de réaliser la commande simple « convert fichier.jpg fichier.pdf » sur chaque fichier fournis par ls.

Puis, il faut créer l’unique pdf à partir des fichiers .jpg.pdf par :

pdftk *.pdf cat output merged.pdf && rm *.jpg.pdf

où, on récupère tous les fichiers d’extension .pdf et demande à pdftk de réaliser un « cat » (catenate), c’est-à-dire une concaténation, de ceux-ci dans le fichier donné en valeur d’argument de output, c’est-à-dire merged.pdf.

Finalement, si et seulement si (&&) le fichier merged.pdf est réalisé sans erreurs, on efface (rm : remove) les pdf de chaque page.


Mais il est apparu d’entrée un problème dont la solution se trouve dans un fichier de configuration d’Imagemagick. En effet, ce dernier refusait d’effectuer la conversion et renvoyait une erreur de « policy » peu compréhensible. Les recherches ont montré qu’il fallait autoriser Imagemagick à créer des pdf dans ce fichier :

/etc/ImageMagick-6/policy.xml

Les modifications se font évidemment en root. Se trouve dans ce fichier la ligne suivante :

<policy domain="coder" rights="none" pattern="PDF">

qu’il montre que le droit de faire des pdf n’est pas présent. Il faut donc la changer par :

<policy domain="coder" rights="read | write" pattern="PDF">

pour résoudre le problème.

Laisser un commentaire