Conversion par lots de PNG en JPG sous linux
Quelqu'un connaît-il un bon moyen de convertir par lots un tas de PNG en JPG sous linux ? (J'utilise Ubuntu).
Un binaire png2jpg que je pourrais simplement déposer dans un script shell serait idéal.
Quelqu'un connaît-il un bon moyen de convertir par lots un tas de PNG en JPG sous linux ? (J'utilise Ubuntu).
Un binaire png2jpg que je pourrais simplement déposer dans un script shell serait idéal.
Votre meilleure chance serait d'utiliser Imagemagick
Je ne suis pas un expert de l'utilisation réelle, mais je sais que vous pouvez faire à peu près tout ce qui est lié à l'image avec cela !
Un exemple est :
convert image.png image.jpg
et il conservera l'original ainsi que la création de l'image convertie. Quant au lot. Je pense que vous devez utiliser l'outil Mogrify (à partir de la même ligne de commande quand vous êtes en imagemagick). Gardez à l'esprit que cela écrase les anciennes images.
La commande est :
mogrify -format jpg *.png
J'ai quelques autres solutions.
La solution la plus simple est comme la plupart déjà postée. Un simple bash pour la boucle.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Pour une raison quelconque, j'ai tendance à éviter les boucles dans le bash, donc voici une approche plus unixy xargs, utilisant le bash pour la gestion des noms.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Celle que j'utilise. Il utilise GNU Parallel pour exécuter plusieurs tâches à la fois, ce qui vous donne un gain de performance. Il est installé par défaut sur de nombreux systèmes et se trouve presque certainement dans votre répertoire (c'est un bon programme à avoir à portée de main).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Le nombre de jobs par défaut correspond au nombre de processus que vous avez. J'ai trouvé une meilleure utilisation du CPU en utilisant 3 jobs sur mon système dual-core.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Et si vous voulez des statistiques (une ETA, les jobs terminés, le temps moyen par job…)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Il y a aussi une syntaxe alternative si vous utilisez GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
Et une syntaxe similaire pour certaines autres versions (y compris debian).
parallel convert '{}' '{.}.jpg' -- *.png
La commande convert
présente sur de nombreuses distributions Linux est installée dans le cadre de la suite ImageMagick. Voici le code bash pour exécuter convert
sur tous les fichiers PNG d'un répertoire et éviter le problème de la double extension :
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
Pour ceux qui veulent juste les commandes les plus simples :
Convertir et conserver les fichiers originaux :
mogrify -format jpg *.png
Convertir et enlever les fichiers originaux :
mogrify -format jpg *.png && rm *.png
Un peu en retard à la fête, mais juste pour dissiper toute la confusion pour quelqu'un qui n'est peut-être pas très à l'aise avec cli, voici une référence et une explication super débile.
Exemple Directory
bar.png
foo.png
foobar.jpg
Conserve tous les fichiers png originaux et crée des fichiers jpg.
mogrify -format jpg *.png
Résultat
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Explication
-format
. (De le site : This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
) - format
spécifie que vous allez changer le format, et le prochain argument doit être le type (dans ce cas, jpg). *.png
est les fichiers d'entrée (tous les fichiers se terminant par .png). Convertit tous les fichiers png en jpg, supprime l'original.
mogrify -format jpg *.png && rm *.png
Résultat
bar.jpg
foo.jpg
foobar.jpg
Explication
&&
est un opérateur booléen. En bref : 0
signifie aucune erreur. &&
effectue évaluation de court-circuit , la bonne partie ne sera exécutée que si il n'y avait pas d'erreurs. Ceci est utile car vous ne voudrez peut-être pas supprimer tous les fichiers originaux s'il y avait une erreur lors de leur conversion. rm
supprime les fichiers. Voici maintenant quelques goodies pour les personnes qui sont à l'aise avec le cli. Si vous voulez un résultat pendant la conversion des fichiers :
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Convertissez tous les fichiers png dans tous les sous-répertoires et donnez un résultat pour chacun d'entre eux :
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Convertissez tous les fichiers png dans tous les sous-répertoires, placez tous les jpgs résultants dans le répertoire all
, numérotez-les, supprimez les fichiers png originaux, et affichez le résultat pour chaque fichier au fur et à mesure :
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
Bien des années trop tard, il existe un utilitaire png2jpeg spécialement conçu à cet effet, dont je suis l'auteur.
Adaptation du code par @Marcin :
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Pour le traitement par lots :
for img in *.png; do
convert "$img" "$img.jpg"
done
Vous vous retrouverez avec des noms de fichiers comme image1.png.jpg cependant.
Cela fonctionnera en bash, et peut-être en bourne. Je ne sais pas pour les autres shells, mais la seule différence serait probablement la syntaxe de la boucle.
C'est ce que j'utilise pour convertir lorsque les fichiers s'étendent sur plus d'un répertoire. Le concept est le suivant : vous find
les fichiers dont vous avez besoin, vous enlevez l'extension et vous la réinsérez avec xargs
. Donc pour les PNG en JPG, vous changez les extensions et vous faites une chose supplémentaire pour gérer les canaux alpha, à savoir définir le fond (dans cet exemple blanc, mais vous pouvez le changer) puis aplatir l'image
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png