Batch converting PNG to JPG in linux
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Lost Jungle Looping
--
Chapters
00:00 Batch Converting Png To Jpg In Linux
00:16 Accepted Answer Score 366
00:48 Answer 2 Score 30
01:09 Answer 3 Score 9
01:26 Answer 4 Score 126
02:29 Thank you
--
Full question
https://superuser.com/questions/71028/ba...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#linux #shellscript #jpeg #png
#avk47
ACCEPTED ANSWER
Score 366
Your best bet would be to use ImageMagick.
I am not an expert in the actual usage, but I know you can pretty much do anything image-related with this!
An example is:
convert image.png image.jpg
which will keep the original as well as creating the converted image.
As for batch conversion, I think you need to use the Mogrify tool which is part of ImageMagick.
Keep in mind that this overwrites the old images.
The command is:
mogrify -format jpg *.png
ANSWER 2
Score 126
I have a couple more solutions.
The simplest solution is like most already posted. A simple bash for loop.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
For some reason I tend to avoid loops in bash so here is a more unixy xargs approach, using bash for the name-mangling.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
The one I use. It uses GNU Parallel to run multiple jobs at once, giving you a performance boost. It is installed by default on many systems and is almost definitely in your repo (it is a good program to have around).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
The number of jobs defaults to the number of CPU cores you have. I found better CPU usage using 3 jobs on my dual-core system.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
And if you want some stats (an ETA, jobs completed, average time per job...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
There is also an alternative syntax if you are using GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
And a similar syntax for some other versions (including debian).
parallel convert '{}' '{.}.jpg' -- *.png
ANSWER 3
Score 30
The convert
command found on many Linux distributions is installed as part of the ImageMagick suite. Here's the bash code to run convert
on all PNG files in a directory and avoid that double extension problem:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
ANSWER 4
Score 9
The actual "png2jpg
" command you are looking for is in reality split into two commands called pngtopnm
and cjpeg
, and they are part of the netpbm
and libjpeg-progs
packages, respectively.
png2pnm foo.png | cjpeg > foo.jpeg