Astuce modifier en masse des images PNG vers JPG avec convert sous Linux

Dans mon métier, il arrive que l'on doit manipuler des images en masse. Soit on prend un logiciel comme XnViewMP, soit on le fait en ligne de commande. Dans mon cas, sous Linux, je devais modifier un peu plus de 19000 images directement sur un serveur.

Énoncé et solution du problème

Pour les pub sur Facebook et Google, jusqu'à présent, on utilisait les png avec fond transparent. Malheureusement, il semble que Chrome est changer le fond des images PNG avec transparence (hypothèse). Il est passé du blanc au noir (sous Firefox c'est un fond gris). Résultat, le service qui s'occupe de ces publications nous a alerté. Le Fond blanc a disparu ...

Bref, nous voilà obligé de fournir des images jpg avec un fond blancs

Les images que nous avons sont en 2000x2000  en PNG avec transparence, bref des trucs très très lourds.

Je vais devoir les transformer en JPG en 1100x1200 et fond blanc (et retirer la transparence). Le 1200 c'est pour ajouter un peu de difficultés.

Les solutions

Il existe plusieurs solutions

a) La ligne de commande

ls -1 *.png | xargs -n 1 bash -c 'convert -resize 1100x1100  -background white -verbose -transparent white -alpha remove -gravity center -extent 1100x1200 "$0" "../1200/${0%.*}.jpg"'

Bug rencontré : 

Le nom de l'image contient des caractères comme des  ' ou @ ou d'autre truc rigolo, ça plante.

b) le script bash

J'ai donc écrit un petit script bash (oui je l'ai recopié depuis le web ). C'est la même chose que la ligne de commande, mais moins sensible aux problèmes  des noms de fichiers (en théorie).

COUNT=$(find -name "*.png" | wc -l); \
find -name "*.png" | while read IMG; do \
    printf "\n$(( ++i )) / $COUNT\n" && \
    [ -s "../1200/${IMG%.*}.jpg" ] || \
     convert -resize 1100x1100  -background white -verbose -transparent white -alpha remove -gravity center -extent 1100x1200 "$IMG" "../1200/${IMG%.*}.jpg"; \
done

c) Petite variante

A partir d'un fichier contenant la liste des images à traiter

cat imagepourpub.txt | xargs -t -n 1 bash -c 'convert -resize 1100x1100  -background white -verbose -transparent white -alpha remove -gravity center -extent 1000x1000 "$0" "${0%.*}.jpg"'

Les explications

Bon c'est sympa de refiler une solution toute faite que j'ai copié par ci, par là et depuis le Man de convert d'imagemagick. Mais une explication s'impose

- resize ne doit pas pose largeur x hauteur
- background couleur, ici on spécifie la couleur d'arrière plan
- verbose , histoire de voir ce qu'il se passe, sinon la commande n'affiche rien
- alpha remove (le fameux canal de la transparence), on le vire
- gravity center on va modifier la taille du canvas (l'image est carré à l'origine, on va la rendre rectangulaire, il faut donc décidé de comment va ton faire, ici, comme la nouvelle image est plus grande que l'ancienne, on dit que l'ancienne sera calé au milieu)
- extent on redimensionne le canvas (et pas l'image), cela evite les déformations

ls -l *.png lister toutes les images PNG du répertoire courant | le pipe est un tuyaux (désolé c'est pour ceux qui ne font pas de Linux ou de bash).

xargs -n 1 signifie que l'on prend un argument 

bash ou sh -c 'ma commande' indique que l'on va exécuter une commande bash
$0 est le premier argument
../1200 c'est pour ranger les nouvelles images dans un autre répertoire (créé avec mkdir avant)

convert ... est la commande avec tous ses arguments (option décrite ci-dessus).

Related Articles