web-dev-qa-db-fra.com

Conversion par lots de PNG en JPG sous Linux

Est-ce que quelqu'un connaît un bon moyen de convertir par lots un groupe de PNG en JPG sous Linux? (J'utilise Ubuntu).

Un fichier binaire png2jpg que je pourrais simplement insérer dans un script Shell serait idéal.

151
nedned

Votre meilleur pari serait d’utiliser Imagemagick

Je ne suis pas un expert dans l'utilisation réelle, mais je sais que vous pouvez pratiquement faire n'importe quelle image liée à cela!

Un exemple est:

convert image.png image.jpg

et il conservera l'original et créera l'image convertie. Quant au lot. Je pense que vous devez utiliser l'outil Mogrify (à partir de la même ligne de commande lorsque vous êtes dans imagemagick). N'oubliez pas que cela écrase les anciennes images.

La commande est:

mogrify -format jpg *.png  
226
William Hilsum

J'ai encore quelques solutions.

La solution la plus simple est comme la plupart déjà postée. Une 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 bash, voici donc une approche plus unixy xargs, utilisant bash pour le nom mangling.

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 coup de fouet. Il est installé par défaut sur de nombreux systèmes et figure presque certainement dans votre dépôt (c’est un bon programme).

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

Le nombre de tâches par défaut correspond au nombre de processus que vous avez. J'ai trouvé une meilleure utilisation du processeur en utilisant 3 tâches sur mon système dual-core.

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

Et si vous voulez des statistiques (ETA, travaux terminés, temps moyen par travail ...)

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
76
Kevin Cox

La commande convert trouvée dans 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 ce problème de double extension:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
25
Marcin

tl; dr

Pour ceux qui veulent juste les commandes les plus simples:

Convertir et conserver fichiers originaux:

mogrify -format jpg *.png

Convertir et supprimer fichiers originaux:

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

La conversion par lots expliquée

Un peu tard pour le parti, mais pour dissiper toute la confusion qui règne pour quelqu'un qui n'est peut-être pas très à l'aise avec Cli, voici une référence et des explications parfaitement simplifiées.

Exemple de répertoire

bar.png
foo.png
foobar.jpg

Conversion simple

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 d'images.
    • mogrify traite les images in place, ce qui signifie que le fichier d'origine est écrasé, à l'exception de l'option -format. (Depuis 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 indique que vous allez modifier le format et que l'argument suivant doit être le type (dans ce cas, jpg).
  • Enfin, *.png correspond aux 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 créera de nouveaux fichiers jpg.
  • Le && est un opérateur booléen. En bref:
    • Lorsqu'un programme se termine, il retourne un statut de sortie. Un statut de 0 signifie aucune erreur.
    • Étant donné que && effectue évaluation de court-circuit , la partie droite ne sera exécutée que si il n'y a pas eu d'erreur. Cela est utile car vous ne souhaitez peut-être pas supprimer tous les fichiers d'origine en cas d'erreur de conversion. .
  • La commande rm supprime les fichiers.

Trucs de fantaisie

Maintenant, voici quelques cadeaux pour les personnes qui sontà 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 de tous les sous-répertoires et donnez le 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 de tous les sous-répertoires, placez tous les fichiers jpgs résultants dans le répertoire all, numérotez-les, supprimez les fichiers png d'origine et affichez la sortie de chaque fichier au fur et à mesure de son exécution:

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
Steven Jeffries

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

png2pnm foo.png | cjpeg > foo.jpeg
7
Teddy
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
4
emdog4

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

3
max

De nombreuses années trop tard, il existe un utilitaire png2jpeg spécialement conçu à cet effet, et dont je suis l'auteur.

Adapter le code par @Marcin:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
2
user7023624

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.

Cela fonctionnera à bash et peut-être même. Je ne connais pas les autres shells, mais la seule différence serait probablement la syntaxe de la boucle.

2
Jeffrey Aylesworth

C’est ce que j’utilise pour convertir lorsque les fichiers couvrent plusieurs répertoires. Mon original était TGA to PNG

find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png

Le concept est que vous find les fichiers dont vous avez besoin, supprimez l’extension, puis rajoutez-la avec xargs. Donc, pour PNG en JPG, vous devez modifier les extensions et faire une chose supplémentaire pour traiter les canaux alpha, à savoir régler le fond (dans cet exemple, le blanc, mais vous pouvez le changer), puis aplatir l'image.

find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten  %.jpg
0
Archimedes Trajano