linux - how to convert PDF to PNG without converting white background intro transparency
2013-08
I am converting a PDF (which I made with R) to a PNG with a command like this:
convert -density 200 foo.pdf bar.png
This generates a PNG allright, but the white background is transparent in the resulting PNG. This is not what I want, I want the background to be white in the PNG as well. How can I achieve this?
Notes:
- I am using Xubuntu.
- What is weird, I did the same sequence on a different linux and computer: first generate picture with R in PDF format, then convert from PDF to PNG, and on that installation it does not convert the white background into transparency, just as I want it. But, I do not know where the difference is caused (R, convert or what).
Does anyone know a good way to batch-convert a bunch of PNGs into JPGs in linux? (I'm using Ubuntu).
A png2jpg binary that I could just drop into a shell script would be ideal.
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
and it will keep the original as well as creating the converted image. As for batch. I think you need to use the Mogrify tool (from the same command line when in imagemagick). Keep in mind that this overwrites the old images.
The command is:
mogrify -format jpg *.png
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
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
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 'echo "$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).
parallel convert '{}' '{.}.jpg' ::: *.png
The number of jobs defaults to the number of processes you have. I found better CPU usage using 3 jobs on my dual-core system.
parallel -j 3 convert '{}' '{.}.jpg' ::: *.png
And if you want some stats (an ETA, jobs completed, average time per job...)
parallel --eta convert '{}' '{.}.jpg' ::: *.png
The final command that I use looks like this for refrence. I use ls
rather than parallel's syntax for who-knows-what reason.
ls -1 *.png | parallel -j 3 --eta convert '{}' '{.}.jpg'
For batch processing:
for img in *.png; do
convert "$img" "$img.jpg"
done
You will end up with file names like image1.png.jpg though.
This will work in bash, and maybe bourne. I don't know about other shells, but the only difference would likely be the loop syntax.
my quick solution
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done