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.
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.
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
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.
Pour convertir des PNG avec un fond transparent, utilisez la commande suivante : mogrify -format jpg -background black -flatten *.png
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
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.
...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.
(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 )
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
Selon la page de manuel de convert : "Le programme convert est un membre de la suite d'outils ImageMagick(1)."
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.
Vous pouvez utiliser l'expansion de bash pour améliorer cette commande comme : for f in *.png; do convert "$f" "${f/%png/jpg}"; done
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
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
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. (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)
)- format
spécifie que vous allez changer le format, et l'argument suivant doit être le type (dans ce cas, jpg).*.png
est le fichier 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 qu'il n'y a pas d'erreur.&&
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.rm
supprime les fichiers.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
Probablement la meilleure réponse à condition de se débarrasser de la while read
la pièce (la remplacer ou l'enlever complètement)...
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).
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.