Conversion par lots PNG en JPG dans linux

Est-ce que quelqu'un connait un bon moyen de convertir par lot de PNG en JPG dans linux? (J'utilise Ubuntu).

Un png2jpg binaire que je pourrais simplement tomber dans un script shell serait idéal.

10 Solutions collect form web for “Conversion par lots PNG en JPG dans linux”

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 quelque chose d'image liée à cela!

Un exemple est le suivant:

convert image.png image.jpg 

Et il gardera l'original ainsi que la création de l'image convertie. En ce qui concerne le lot. Je pense que vous devez utiliser l'outil Mogrify (à partir de la même ligne de commande lors de l'imageagick). Gardez à l'esprit que cela écrase les anciennes images.

La commande est:

 mogrify -format jpg *.png 

J'ai quelques solutions de plus.

La solution la plus simple est comme la plupart des publications. 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 bash, alors voici une approche xargs plus simple, en 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 travaux en même temps, vous donnant une impulsion de performance. Il est installé par défaut sur de nombreux systèmes et est presque définitivement dans votre compte de rechange (c'est un bon programme à avoir).

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

Le nombre de tâches par défaut est le 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 (un ETA, des emplois terminés, un 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 

La commande de convert trouvée sur de nombreuses distributions Linux est installée dans le cadre de la suite ImageMagick. Voici le code bash pour l'exécution de convert sur tous les fichiers PNG dans un répertoire et éviter ce double problème d'extension:

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

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

 png2pnm foo.png | cjpeg > foo.jpeg 

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

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

Tl dr

Pour ceux qui veulent juste les commandes les plus simples:

Convertir et conserver les fichiers originaux:

 mogrify -format jpg *.png 

Convertir et supprimer des fichiers originaux:

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

Conversion des lots expliquée

Un peu tard pour la fête, mais juste pour éclaircir toute la confusion pour quelqu'un qui peut ne pas être très à l'aise avec cli, voici une référence et une explication superbes et abondantes.

Exemple d'annuaire

 bar.png foo.png foobar.jpg 

Simple Convert

Gère 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'image.
    • Le mogrifiant traite les images en place , ce qui signifie que le fichier d'origine est écrasé, à l'exception de l'option -format . (Du 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 de - format spécifie que vous allez modifier 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 créera de nouveaux fichiers jpg.
  • Le && est un opérateur booléen. En bref:
    • Lorsqu'un programme se termine, il renvoie un état de sortie. Un état de 0 signifie aucune erreur.
    • Étant donné que && effectue une évaluation de court-circuit , la partie droite ne sera effectuée que s'il n'y avait pas d'erreurs . Ceci est utile car vous ne souhaitez peut-être pas supprimer tous les fichiers originaux s'il y avait une erreur de conversion.
  • La commande rm supprime les fichiers.

Fancy Stuff

Maintenant, voici quelques bonnes sorties pour les personnes qui sont à l' aise avec le cli.

Si vous voulez une certaine sortie alors qu'elle convertit des fichiers:

 for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done 

Convertir tous les fichiers png dans tous les sous-répertoires et donner une 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 

Convertissez tous les fichiers png dans tous les sous-répertoires, placez tous les jpgs résultants dans le répertoire entier, numérotez-les, supprimez les fichiers png originaux et affichez 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 

Pour le traitement par lot:

 for img in *.png; do convert "$img" "$img.jpg" done 

Vous allez finir avec des noms de fichiers comme image1.png.jpg.

Cela fonctionnera dans bash, et peut-être bourne. Je ne connais pas d'autres shells, mais la seule différence serait la syntaxe de la boucle.

Beaucoup d'années trop tard, il y a un utilitaire png2jpeg spécifiquement à cet effet, dont j'ai écrit.

Adaptation du code par @Marcin:

 #!/bin/sh for img in *.png do filename=${img%.*} png2jpeg -q 95 -o "$filename.jpg" "$filename.png" done 

C'est ce que j'utilise pour convertir lorsque les fichiers couvrent plus d'un répertoire. 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, effacez l'extension puis ajoutez-le avec xargs . Ainsi, pour PNG vers JPG, vous modifiez les extensions et faites une chose supplémentaire pour traiter les canaux alpha, à savoir définir l'arrière-plan (dans cet exemple blanc, mais vous pouvez le modifier) ​​puis aplatir l'image

 find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg 
  • Ssh et shell via ssh: comment sortir?
  • En passant par `ls` résultats dans bash shell script
  • Passer deux arguments à une commande à l'aide de tuyaux
  • Ligne de commande Linux: mode rapide pour désactiver Internet (maintien LAN)?
  • Évitez les chemins indésirables dans le fichier Zip
  • Montage automatique des volumes Truecrypt au moment de la connexion utilisateur
  • Exécuter un script shell sur OS X sans avoir une fenêtre de terminal apparaissant?
  • Forcer une tâche complexe en arrière-plan à fg lui-même?
  • Est-ce une méthode bash-specific d'appeler un script: VARIABLE = valeur bash somescript
  • Écran Gnu: Exécuter la commande à l'attache
  • Manipulation d'espaces blancs au nom d'un jeu de données ZFS dans un script shell
  • Soyons le génie de l'ordinateur et du réseau.