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.
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
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
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
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
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
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
. (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)
)- format
indique que vous allez modifier le format et que l'argument suivant doit être le type (dans ce cas, jpg).*.png
correspond aux 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 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. .rm
supprime les fichiers.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
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
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
ma solution rapide for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
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
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.
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