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).
Comments powered by CComment