2009-11-16 02:06:38 +0000 2009-11-16 02:06:38 +0000
172
172

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.

Antwoorden (10)

247
247
247
2009-11-16 02:15:29 +0000

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
83
83
83
2013-01-28 02:45:11 +0000

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
26
26
26
2009-11-16 03:28:26 +0000

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
11
11
11
2015-10-17 15:02:05 +0000

tl;dr

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

Batch Converting Explained

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

Simple Convert

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

  • mogrify maakt deel uit van de ImageMagick reeks hulpmiddelen voor beeldverwerking.
  • mogrify verwerkt afbeeldingen op zijn plaats, wat betekent dat het originele bestand wordt overschreven, met uitzondering van de optie -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))
  • De optie - format geeft aan dat u de indeling wijzigt, en het volgende argument moet het type zijn (in dit geval jpg).
  • Ten slotte is *.png de invoerbestanden (alle bestanden die eindigen op .png).

Converteren en verwijderen

Converteert alle png bestanden naar jpg, verwijdert origineel.

mogrify -format jpg *.png && rm *.png

Result

bar.jpg
foo.jpg
foobar.jpg

Explanatie

  • Het eerste deel is precies hetzelfde als hierboven, het maakt nieuwe jpg bestanden aan.
  • De && is een booleaanse operator. In het kort:
  • Wanneer een programma eindigt, geeft het een exit status terug. Een status van 0 betekent geen fouten.
  • Aangezien && 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.
  • Het rm commando verwijdert bestanden.

Fancy Stuff

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
8
8
8
2009-11-16 05:29:10 +0000

Het eigenlijke “png2jpg” commando dat u zoekt is in werkelijkheid opgesplitst in twee commando’s genaamd pngtopnm en cjpeg, en ze maken deel uit van de netpbm en libjpeg-progs pakketten, respectievelijk.

png2pnm foo.png | cjpeg > foo.jpeg
6
6
6
2014-10-13 17:12:00 +0000
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
5
5
5
2012-05-07 12:42:40 +0000

mijn snelle oplossingfor i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

4
4
4
2016-10-22 09:37:31 +0000

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
3
3
3
2009-11-16 02:28:02 +0000

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.

1
1
1
2016-09-17 02:34:45 +0000

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.