Resizing Images with ImageMagick

Rather than use the bc statements from the original script, let's make ImageMagick do the work by having this workflow:

  1. Convert image to resized image and save as temp file.

  2. Use identify to get new dimensions of temp file.

  3. Create new filename based on geometry.

  4. Rename temp file to new filename with geometry specified.

It turns out it's a lot less work, because mathematics are no longer required, which is a good thing!

The hardest part is to create the new filename, which involves more lines of code than the conversion itself. It involves figuring out the filename suffix, chopping the filename up and building a new one that inserts the new image geometry in the middle.

Here's the result (it's long):


#!/bin/sh
convert=/usr/bin/convert
identify=/usr/bin/identify
resize=$1
source=$2
if [ -z "$resize" -o -z "$source" ] ; then
  echo "Usage: $0 resize sourcefile"; ;exit 1
fi
if [ ! -r $source ] ; then
  echo "Error: can't read source file $source" ; exit 1
fi
# let's grab the filename suffix
filetype=$(echo $source | rev | cut -d. -f1 | rev)
 
tempfile="resize.$filetype" # temp file name

# create the newly sized temp version of the image
$convert $source -resize $resize $tempfile

# figure out geometry, the assemble new filename
geometry=$($identify $tempfile | cut -d\   -f3 )

newfilebase=$(echo $source | sed "s/$filetype//")
newfilename=$newfilebase$geometry.$filetype

# rename temp file and we're done
mv $tempfile $newfilename

echo \*\* resized $source to new size $resize. result = $newfilename

exit 0

That's it. It's not incredibly complicated if you go through it step by step. In fact, go back to the four-step algorithm I presented earlier. That's almost exactly duplicated in the comments within the script.

The only nuance is the sequence for newfilename assembly, which just strings together a series of variables to have their values tucked together.

Let's give it a whirl and see what happens:


sh resize.sh 50% pvp.jpg
** resized pvp.jpg to new size 50%. result = pvp.485x153.jpg

I'm skeptical, so let's test the new image file by using identify to get its dimensions:


$ identify pvp.485x153.jpg
pvp.485x153.jpg JPEG 485x153 485x153+0+0 8-bit DirectClass 44.7kb

Perfect. More important, look at how the image size has shrunk as a result of it being scaled down 50%:


$ ls -l pvp.jpg pvp.485x153.jpg
-rw-rw-r-- 1 taylor taylor  45751 Oct  9 04:14 pvp.485x153.jpg
-rw-r--r-- 1 taylor taylor 130347 Sep  5 08:20 pvp.jpg

A definite win and a pretty handy script to keep around.

Of course, better positional parameter checking and a quick check to ensure that the resize parameter isn't something crazy would be good coding, but it's not a bad script that serves a very useful purpose.

So that's it. In my next article, I plan to take a look at adding embossing—text that's superimposed over a graphic—as an easy way to watermark sets of photos from the command line. Until then, cheerio!

______________________

Dave Taylor has been hacking shell scripts for over thirty years. Really. He's the author of the popular "Wicked Cool Shell Scripts" and can be found on Twitter as @DaveTaylor and more generally at www.DaveTaylorOnline.com.

White Paper
Linux Management with Red Hat Satellite: Measuring Business Impact and ROI

Linux has become a key foundation for supporting today's rapidly growing IT environments. Linux is being used to deploy business applications and databases, trading on its reputation as a low-cost operating environment. For many IT organizations, Linux is a mainstay for deploying Web servers and has evolved from handling basic file, print, and utility workloads to running mission-critical applications and databases, physically, virtually, and in the cloud. As Linux grows in importance in terms of value to the business, managing Linux environments to high standards of service quality — availability, security, and performance — becomes an essential requirement for business success.

Learn More

Sponsored by Red Hat

White Paper
Private PaaS for the Agile Enterprise

If you already use virtualized infrastructure, you are well on your way to leveraging the power of the cloud. Virtualization offers the promise of limitless resources, but how do you manage that scalability when your DevOps team doesn’t scale? In today’s hypercompetitive markets, fast results can make a difference between leading the pack vs. obsolescence. Organizations need more benefits from cloud computing than just raw resources. They need agility, flexibility, convenience, ROI, and control.

Stackato private Platform-as-a-Service technology from ActiveState extends your private cloud infrastructure by creating a private PaaS to provide on-demand availability, flexibility, control, and ultimately, faster time-to-market for your enterprise.

Learn More

Sponsored by ActiveState