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.
linux
shell-script
jpeg
png
nedned
la source
la source
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
avoir 2 fichiers etfile 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.
Pour une raison quelconque, j'ai tendance à éviter les boucles dans bash, voici donc une approche plus unixy xargs, utilisant bash pour nommer.
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).
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.
Et si vous voulez des statistiques (ETA, travaux terminés, temps moyen par travail ...)
Il existe également une syntaxe alternative si vous utilisez GNU Parallel.
Et une syntaxe similaire pour certaines autres versions (y compris debian).
la source
done
à la fin de cette boucle for. Aussi, pour les choses parallèles, vous pourriez éviter d'utiliser çals
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écuterconvert
sur tous les fichiers PNG d'un répertoire et évitez ce problème de double extension:la source
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
tl; dr
Pour ceux qui veulent juste les commandes les plus simples:
Convertir et conserver les fichiers originaux:
Convertir et supprimer les fichiers d'origine:
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
Conversion simple
Conserve tous les fichiers png originaux et crée des fichiers jpg.
Résultat
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).Convertir et supprimer
Convertit tous les fichiers png en jpg, supprime l'original.
Résultat
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.Trucs de fantaisie
Maintenant, voici quelques goodies pour les personnes qui sont à l' aise avec la Cli.
Si vous voulez une sortie pendant la conversion des fichiers:
Convertissez tous les fichiers png de tous les sous-répertoires et donnez le résultat pour chacun d’entre eux:
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 :la source
while read
pièce (la remplacer ou la supprimer enLa "
png2jpg
" commande que vous recherchez est en réalité divisée en deux commandes appeléespngtopnm
andcjpeg
, et elles font partie des packagesnetpbm
etlibjpeg-progs
, respectivement.la source
la source
*.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
la source
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Cela évite tout à fait inutilels
,grep
et lessed
appels (etecho
, 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 nels
sont pas analysables en toute sécurité.De nombreuses années trop tard, il existe un utilitaire png2jpeg spécialement conçu à cet effet, dont je suis l'auteur.
Adapter le code par @Marcin:
la source
Pour le traitement par lots:
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.
la source
C’est ce que j’utilise pour convertir lorsque les fichiers couvrent plusieurs répertoires. Mon original était TGA to PNG
Le concept est que vous avez
find
les fichiers dont vous avez besoin, supprimez l’extension, puis rajoutez-laxargs
. 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.la source