211 votes

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 Shell Shell serait idéal.

310voto

Matías Points 3008

Votre meilleure chance serait d'utiliser ImageMagick .

Je ne suis pas un expert dans 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 :

convert image.png image.jpg

qui conservera l'original tout en créant l'image convertie.

Pour ce qui est de la conversion par lots, je pense que vous devez utiliser la fonction Mogrify qui fait partie d'ImageMagick.

Gardez à l'esprit que cette écrase les anciennes images.

La commande est :

mogrify -format jpg *.png

7 votes

Génial, c'est exactement ce que je cherchais et je l'utiliserai à nouveau. Au fait, juste pour clarifier, car je n'avais pas réalisé que c'était ce que vous vouliez dire : convert est utilisé pour générer un fichier de sortie séparé, mogrify est utilisé pour modifier l'image originale.

1 votes

Les images en png avec un fond transparent ne sont pas converties correctement en jpg.

6 votes

Pour convertir des PNG avec un fond transparent, utilisez la commande suivante : mogrify -format jpg -background black -flatten *.png

105voto

Brother Erryn Points 803

J'ai encore quelques solutions.

La solution la plus simple est comme la plupart de ceux qui ont déjà posté. Un simple bash boucle for.

for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done

Pour une raison quelconque, j'ai tendance à éviter les boucles en bash. Voici donc une approche plus unixienne de xargs, en utilisant bash pour le mélange des noms.

ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'

Celui 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 dépôt (c'est un bon programme à avoir sous la main).

ls -1 *.png | parallel convert '{}' '{.}.jpg'

Le nombre de tâches correspond par défaut au nombre de cœurs de processeur dont vous disposez. J'ai trouvé une meilleure utilisation du CPU en utilisant 3 tâches sur mon système à deux cœurs.

ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'

Et si vous souhaitez obtenir des statistiques (heure d'arrivée prévue, travaux terminés, temps moyen par travail, etc.)

ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'

Il existe également 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

0 votes

Correction d'une erreur de frappe. C'est une syntaxe cool que je ne connaissais pas. Je ne sais pas laquelle je préfère, probablement pour la même raison que je préfère ne pas utiliser de boucles en bash. J'ai mis la solution parce que c'est probablement la manière la plus "correcte", mais je vais probablement m'en tenir à la syntaxe suivante ls méthode pour moi, car elle a plus de sens pour moi.

1 votes

...bien qu'il faille noter que cette syntaxe ne fonctionne que sur GNU parallel. Le parallel qui est empaqueté dans certaines distros linux (comme Debian et Ubuntu) est en fait une version différente avec une syntaxe légèrement différente (utiliser -- statt ::: ) - et même dans ce cas, il manque de manière frustrante certaines des fonctionnalités de GNU parallel.

0 votes

(bien que ceux qui utilisent des distributions qui n'intègrent pas GNU parallel peuvent l'installer à partir des sources assez facilement, en utilisant les instructions suivantes ici )

26voto

Marcin Points 3474

Die convert que l'on trouve sur de nombreuses distributions Linux est installée dans le cadre de la suite ImageMagick. Voici le code bash à 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

8 votes

Selon la page de manuel de convert : "Le programme convert est un membre de la suite d'outils ImageMagick(1)."

1 votes

Vous avez raison. Pour une raison quelconque, je pensais que cela faisait partie d'une autre bibliothèque. Quoi qu'il en soit, le code que j'ai posté ci-dessus est la bonne façon d'automatiser la conversion par lots dans un répertoire.

2 votes

Vous pouvez utiliser l'expansion de bash pour améliorer cette commande comme : for f in *.png; do convert "$f" "${f/%png/jpg}"; done

14voto

Steven Jeffries Points 303

En résumé

Pour ceux qui ne veulent que les commandes les plus simples :

Convertir y garder les fichiers originaux :

mogrify -format jpg *.png

Convertir y supprimer les fichiers originaux :

mogrify -format jpg *.png && rm *.png

La conversion par lots expliquée

Je suis un peu en retard sur la fête, mais pour dissiper toute confusion pour quelqu'un qui n'est pas très à l'aise avec la cli, voici une référence et une explication très simplifiées.

Exemple de répertoire

bar.png
foo.png
foobar.jpg

Simple conversion

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

  • mogrifier fait partie de la ImageMagick une suite d'outils pour le traitement des images.
    • mogrifier les processus d'images en place ce qui signifie que le fichier original est écrasé, à l'exception de l'option -format option. (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) )
  • Die - format spécifie que vous allez changer le format, et l'argument suivant doit être le type (dans ce cas, jpg).
  • Enfin, *.png est le fichier 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.
  • Die && est un opérateur booléen. En bref :
    • Lorsqu'un programme se termine, il renvoie un état de sortie. Un état de 0 signifie qu'il n'y a pas d'erreur.
    • Seit && réalise évaluation des courts-circuits la partie droite ne sera exécutée que si il n'y a pas eu d'erreurs . Ceci est utile car vous ne souhaitez peut-être pas supprimer tous les fichiers d'origine si une erreur s'est produite lors de leur conversion.
  • Die rm supprime les fichiers.

Trucs et astuces

Maintenant, voici quelques goodies pour les personnes qui sind à l'aise avec la cli.

Si vous voulez une sortie 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 la sortie pour chacun d'eux :

find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done

Convertir tous les fichiers png dans tous les sous-répertoires, mettre tous les jpgs résultants dans le répertoire all les numéroter, supprimer les fichiers png originaux, et afficher la sortie 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

0 votes

Probablement la meilleure réponse à condition de se débarrasser de la while read la pièce (la remplacer ou l'enlever complètement)...

0 votes

@don_crissti, qu'est-ce qui ne va pas avec "while read" ?

0 votes

Elle est sujette aux erreurs (à moins d'être sûr à 100% d'avoir affaire à des noms de fichiers sains) et lente (très, très, très lente).

8voto

emdog4 Points 181
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50

2 votes

Merci pour une solution d'annuaire profond/récursif en une seule ligne qui laisse l'annuaire résultant *.jpg à côté de l'original *.png montre comment réduire la taille et la qualité des fichiers et ne s'arrête pas à cause de caractères impairs dans le nom du répertoire ou du fichier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X