February 2, 2017

Batch Convert Images from PNG to JPEG

This post briefly shows how to recursively scan a directory tree for PNG images and convert them to JPEG format.  To achieve this, we use the `find` shell command and ImageMagick's `convert` utility.  Optionally, we can add GNU Parallel to speed up processing time.

First, install ImageMagick on Debian/Ubuntu with:

$ sudo apt-get install imagemagick

Once ImageMagick is installed, `cd` to the root of the directory tree containing your images, and run:

$ find . -iname "*.png" | convert -quality 95% {} {.}.jpg

This shell pipeline will:

* recursively search under the current directory
* match files that have the [case-insensitive] `.png` extension
* convert each PNG image to JPEG format at 95% quality
* save the new image with the file extension changed to `.jpg`

In this version, the images were converted sequentially.  If you want to speed up processing, you can use GNU Parallel to execute the image conversions across all CPU cores.

Install GNU Parallel on Debian/Ubuntu with:

$ sudo apt-get install parallel

Once installed, simply add `parallel` to the shell pipeline before the call to `convert`.  This is the parallel processing version:

$ find . -iname "*.png" | parallel convert -quality 95% {} {.}.jpg

Once converted, you can delete the original PNG images with:

$ find . -iname "*.png" | parallel rm {}