Réponses:
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). Gardez à l'esprit que cela écrase les anciennes images.
La commande est:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
avoir 2 fichiers et file img.*
rapporte un png, l’original intact, et un nouveau jpeg. Donc, mogrify
ne pas écraser les fichiers originaux dans ce cas.
mogrify
documentation: " Cet outil est similaire à l' convert
exception du fait que le fichier image d'origine est écrasé (à moins que vous ne changiez le suffixe du fichier avec l' option -format ) avec les modifications que vous demandez. "
J'ai deux autres 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 nommer.
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 pour les performances. 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
done
à la fin de cette boucle for. Aussi, pour les choses parallèles, vous pourriez éviter d'utiliser ça ls
et pipe avec une construction comme: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(voir ici )
ls
méthode la plus «appropriée», mais je vais probablement m'en tenir à la méthode car elle me semble plus logique.
--
plutôt que :::
) - et même dans ce cas, certaines des fonctionnalités de GNU parallel manquent de manière frustrante.
La convert
commande trouvée 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 évitez ce problème de double extension:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Pour ceux qui veulent juste les commandes les plus simples:
Convertir et conserver les fichiers originaux:
mogrify -format jpg *.png
Convertir et supprimer les fichiers d'origine:
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
option. ( A partir 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)
)- format
option spécifie que vous allez changer le format, et le prochain argument doit être le type (dans ce cas, jpg).*.png
sont les 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 une évaluation de court-circuit , la partie droite ne sera exécutée que s’il n’ya pas eu d’erreurs . Cela est utile car vous ne souhaitez peut-être pas supprimer tous les fichiers d'origine en cas d'erreur de conversion.rm
commande supprime les fichiers.Maintenant, voici quelques goodies 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, mettez tous les fichiers jpgs résultants dans le all
répertoire, numérotez-les, supprimez les fichiers png d'origine et affichez la sortie de chaque fichier au fur et à mesure de son déroulement :
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
while read
pièce (la remplacer ou la supprimer en
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
fichiers résultants à côté des *.png
fichiers originaux , montre comment réduire la taille / qualité du fichier et ne craquera pas à cause de caractères bizarres dans le répertoire ou le nom de fichier.
ma solution rapide
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Cela évite tout à fait inutile ls
, grep
et les sed
appels (et echo
, mais l'IIRC est une bash construit et n'aura donc pas / très peu d'impact sur les performances), et supprime deux canaux et deux sous-coques, et implique moins de dactylographie. Il est même légèrement plus portable, car toutes les versions de ne ls
sont pas analysables en toute sécurité.
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 avez find
les fichiers dont vous avez besoin, supprimez l’extension, puis rajoutez-la xargs
. Donc, pour les fichiers 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