2009-11-16 02:06:38 +0000 2009-11-16 02:06:38 +0000
172
172

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.

Réponses (10)

247
247
247
2009-11-16 02:15:29 +0000

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
83
83
83
2013-01-28 02:45:11 +0000

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
26
26
26
2009-11-16 03:28:26 +0000

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
11
11
11
2015-10-17 15:02:05 +0000

tl;dr

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

Batch Converting Explained

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

Simple Convert

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

  • mogrify fait partie de la suite d'outils ImageMagick pour le traitement des images.
  • mogrify traite les images en place, ce qui signifie que le fichier original est écrasé, à l'exception de l'option -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))
  • L'option - format spécifie que vous allez changer le format, et le prochain argument doit être le type (dans ce cas, jpg).
  • Enfin, *.png est les fichiers d'entrée (tous les fichiers se terminant par .png).

Convertir et supprimer

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

  • La première partie est exactement la même que ci-dessus, elle va créer de nouveaux fichiers jpg.
  • Le && est un opérateur booléen. En bref :
  • Lorsqu'un programme se termine, il renvoie un statut de sortie. Un statut de 0 signifie aucune erreur.
  • Puisque && 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.
  • La commande rm supprime les fichiers.

Fancy Stuff

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
8
8
8
2009-11-16 05:29:10 +0000

La commande “png2jpg” que vous recherchez est en réalité divisée en deux commandes appelées pngtopnm et cjpeg, et elles font partie des paquets netpbm et libjpeg-progs, respectivement.

png2pnm foo.png | cjpeg > foo.jpeg
6
6
6
2014-10-13 17:12:00 +0000
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
5
5
5
2012-05-07 12:42:40 +0000

ma solution rapidefor i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

4
4
4
2016-10-22 09:37:31 +0000

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
3
3
3
2009-11-16 02:28:02 +0000

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.

1
1
1
2016-09-17 02:34:45 +0000

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