.. title: Pense-bête ImageMagick .. slug: pense-bete-imagemagick .. date: 2017-12-24 12:44:48 UTC+01:00 .. tags: imagemagick, bash .. category: blog .. link: .. description: .. type: text ImageMagick permet de réaliser énormément de tâches pour modifier ou convertir des images. Ce n'est pas toujours facile de se souvenir des commandes idoines pour utiliser ce couteau suisse de la manipulation d'images, d'où la raison de ce pense-bête. .. TEASER_END ``mogrify`` *vs* ``convert`` ============================ Les deux commandes peuvent s'utiliser de manière quasiment indistincte, mais ``mogrify`` est mieux adaptée à des modifications sur un ensemble de fichiers tandis que ``convert`` se destine à la modification d'un fichier. Il est possible malgré tout de faire l'un ou l'autre avec les deux commandes, comme le montrent les exemples ci-dessous. Redimensionner des images ========================= Il est facile de redimensionner une série d'images pour les harmoniser (en les convertissant, au passage, dans un même format) avec l'option ``-resize``. Pour obtenir des images avec une même hauteur, on peut utiliser ``-resize x[hauteur]``, pour avoir une même largeur, ``-resize [largeur]x``, avec les dimensions données en pixel. Il est par ailleurs possible de conserver le nom de l'image en utilisant l'option ``-set filename:base "%[base]"``. Voilà un exemple pour redimensionner un ensemble d'images avec une hauteur constante de 100 pixels : .. code-block:: bash convert ../{image-pattern} -resize x100 -set filename:base "%[base]" "%[filename:base]_100.png" Conversion de fichiers ====================== ``mogrify`` et ``convert`` permettent simplement de réaliser des conversions de fichiers ; pour modifier la qualité de l'image il est possible de jouer sur la résolution en dpi avec l'option ``density`` (à 72 par défaut). Voici un exemple pour convertir des fichiers EPS en PNG : .. code-block:: bash mogrify -format png -density 150 *eps Réaliser des animations ======================= ImageMagick permet de réaliser simplement des animations — sous forme de GIF animés — à partir d'une série d'images. Il est possible de fixer le délai entre chaque image (et donc définir un équivalent de *framerate*) avec l'option ``-delay``. Voici un exemple simple : .. code-block:: bash convert -delay 20 $(ls *png) animation.gif Et si on veut réaliser une animation en réalisant une sélection sur les fichiers disponibles : .. code-block:: bash convert -delay 20 $(ls *png | head -n40) animation.gif Retirer des images d'une animation ================================== La première étape est de récupérer les images à partir de l'animation : .. code-block:: bash convert animation.gif +adjoin temp_%02d.gif Ensuite, on peut sélectionne une image toutes les ``n`` images avec une boucle ``for`` sur l'ensemble des images. Par exemple, on peut vérifier que l'itérateur est un multiple de 2, si c'est le cas, on le copie dans un nouveau fichier : .. code-block:: bash j=0; for i in $(ls temp_*gif); do if [ $(( $j%2 )) -eq 0 ]; then cp $i sel_`printf %02d $j`.gif; fi; j=$(echo "$j+1" | bc); done Si on veut garder les images dont le numéro n'est **pas** divisible par 2, on peut utiliser ``-ne`` au lieu de ``-eq``. Il ne reste ensuite plus qu'à créer la nouvelle animation : .. code-block:: bash convert -delay 20 $( ls sel_*) new_animation.gif