Batch-conversie van PNG naar JPG in linux
Weet iemand een goede manier om een aantal PNG’s in batch om te zetten in JPG’s in linux? (Ik gebruik Ubuntu).
Een png2jpg binary die ik gewoon in een shell-script kan laten vallen zou ideaal zijn.
Weet iemand een goede manier om een aantal PNG’s in batch om te zetten in JPG’s in linux? (Ik gebruik Ubuntu).
Een png2jpg binary die ik gewoon in een shell-script kan laten vallen zou ideaal zijn.
Het beste zou zijn om Imagemagick
te gebruiken Ik ben geen expert in het daadwerkelijke gebruik, maar ik weet dat u vrijwel alles kunt doen wat met dit beeld te maken heeft!
Een voorbeeld is:
convert image.png image.jpg
en het behoudt het origineel en maakt de geconverteerde afbeelding. Wat betreft de batch. Ik denk dat je de Mogrify tool moet gebruiken (vanaf dezelfde opdrachtregel als in imagemagick). Houd er rekening mee dat dit de oude afbeeldingen overschrijft.
Het commando is:
mogrify -format jpg *.png
Ik heb nog een paar oplossingen.
De eenvoudigste oplossing is zoals de meeste al gepost. Een eenvoudige bash voor lus.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Om een of andere reden heb ik de neiging om lussen in bash te vermijden, dus hier is een meer unixy xargs aanpak, waarbij bash gebruikt wordt voor de naamgeving.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Degene die ik gebruik. Het gebruikt GNU Parallel om meerdere taken tegelijk uit te voeren, wat je een prestatieboost geeft. Het is standaard geïnstalleerd op veel systemen en staat bijna zeker in je repo (het is een goed programma om te hebben).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Het aantal banen is standaard ingesteld op het aantal processen dat je hebt. Ik heb een beter CPU gebruik gevonden met behulp van 3 banen op mijn dual-core systeem.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
En als je wat statistieken wilt (een ETA, voltooide banen, gemiddelde tijd per baan…)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Er is ook een alternatieve syntax als je GNU Parallel gebruikt.
parallel convert '{}' '{.}.jpg' ::: *.png
En een soortgelijke syntax voor sommige andere versies (inclusief debian).
parallel convert '{}' '{.}.jpg' -- *.png
Het convert
commando dat op veel Linux distributies te vinden is, is geïnstalleerd als onderdeel van de ImageMagick suite. Hier is de bash code om convert
op alle PNG bestanden in een directory uit te voeren en dat dubbele extensie probleem te vermijden:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
Voor wie gewoon de eenvoudigste opdrachten wil:
Convert en bewaar originele bestanden:
mogrify -format jpg *.png
Convert en verwijder originele bestanden:
mogrify -format jpg *.png && rm *.png
Een beetje laat voor het feest, maar om alle verwarring weg te nemen voor iemand die misschien niet zo comfortabel is met cli, hier is een super dumbed-down referentie en uitleg.
Example Directory
bar.png
foo.png
foobar.jpg
Bewaart alle originele png-bestanden en maakt ook jpg-bestanden aan.
mogrify -format jpg *.png
Resultaat
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Verklarende woordenlijst
-format
. (Vanaf de 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
geeft aan dat u de indeling wijzigt, en het volgende argument moet het type zijn (in dit geval jpg). *.png
de invoerbestanden (alle bestanden die eindigen op .png). Converteert alle png bestanden naar jpg, verwijdert origineel.
mogrify -format jpg *.png && rm *.png
Result
bar.jpg
foo.jpg
foobar.jpg
Explanatie
&&
is een booleaanse operator. In het kort: 0
betekent geen fouten. &&
kortsluiting evaluatie uitvoert, wordt het juiste deel alleen uitgevoerd als er geen fouten. Dit is handig omdat je misschien niet alle originele bestanden wilt verwijderen als er een fout was bij het converteren ervan. rm
commando verwijdert bestanden. Nu is hier wat lekkers voor de mensen die zijn comfortabel met de cli.
Als je wat uitvoer wilt terwijl het bestanden converteert:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Converteer alle png bestanden in alle subdirectories en geef uitvoer voor elk bestand:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Converteer alle png bestanden in alle subdirectories, zet alle resulterende jpgs in de all
directory, nummert ze, verwijdert originele png bestanden, en geeft uitvoer weer voor elk bestand terwijl het plaatsvindt:
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
Vele jaren te laat, is er een png2jpeg hulpprogramma speciaal voor dit doel, dat ik heb geschreven.
Aanpassen van de code door @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Voor batchverwerking:
for img in *.png; do
convert "$img" "$img.jpg"
done
Je zult eindigen met bestandsnamen zoals image1.png.jpg.
Dit zal werken in bash, en misschien bourne. Ik weet het niet van andere shells, maar het enige verschil zou waarschijnlijk de loop syntax zijn.
Dit is wat ik gebruik om te converteren als de bestanden meer dan één map beslaan. Mijn originele was TGA naar PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Het concept is dat je find
de bestanden die je nodig hebt, van de extensie stript en deze vervolgens weer toevoegt met xargs
. Dus voor PNG naar JPG zou je de extensies veranderen en een extra ding doen om met alpha kanalen om te gaan, namelijk het instellen van de achtergrond (in dit voorbeeld wit, maar je kunt het veranderen) en dan de afbeelding
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg
``` platdrukken.