Pad images to fit 4 by 6 photo paper bash script using imagemagick
Alec Jacobson
August 16, 2009
I was a little dismayed that I couldn't use my previously mentioned applescript to pad images with colors other than black. A shrewd observer will also notice that the Image Events suite resamples when it pads resulting in some annoying re-anti-aliasing.
I wrote the following bash script to the same task as the applescript from the command line:
#!/bin/bash
USAGE="Usage: $0 [--replace] [--padcolor=color] ratio imagefile(s)
ratio is a float equal to long dimension / short dimension to pad
to fit a 4\"x6\" card, divide 6 by 4 giving ratio = 1.5
--replace or -f option to overwrite original images with padded versions,
default is to preppend 'pad-[ratio]-' to each naee
--padcolor= or -c= option to change pad color from default black. Takes a
color can be any Imagemagick color or hex color:
(See http://www.imagemagick.org/script/color.php)
"
if [ "$#" == "0" ]; then
echo "$USAGE"
exit 1
fi
replace=false
if [ "$1" == "--replace" -o "$1" == "-f" ]
then
echo "Overwriting existing image files..."
replace=true
shift
fi
padcolor="black"
if [ `echo "$1" | grep "^\(--padcolor\)\|\(-c\)="` ]
then
padcolor=`echo "$1" | sed "s/^.*=//"`
shift
echo "Using $padcolor as pad color..."
fi
ratio=`echo "$1" | grep "^[0-9]*\.\?[0-9]\+$\|^[0-9]\+\.$"`
if [ "$ratio" == "" ]
then
echo "$USAGE"
exit 2
fi
shift
while (( "$#" )); do
image="$1"
dir=`dirname "$image"`
base=`basename "$image"`
if ! $replace
then
base="pad-$ratio-$base"
fi
if wh=`identify -format "%w %h" "$image" 2>/dev/null`
then
width=${wh%% *}
height=${wh#* }
if [ $height -gt $width ]
then
# vertical
long=`echo "$height/$width > $ratio" | bc -l`
if [ $long -eq "1" ]
then
# taller than ratio
newwidth=`echo "$height/$ratio" | bc -l`
newwidth=`echo "($newwidth+0.5)/1" | bc`
newheight="$height"
else
# shorter than ratio
newwidth="$width"
newheight=`echo "$width*$ratio" | bc -l`
newheight=`echo "($newheight+0.5)/1" | bc`
fi
else
# horizontal
long=`echo "$width/$height > $ratio" | bc -l`
if [ $long -eq "1" ]
then
# wider than ratio
newwidth="$width"
newheight=`echo "$width/$ratio" | bc -l`
newheight=`echo "($newheight+0.5)/1" | bc`
else
# skinnier than ratio
newwidth=`echo "$height*$ratio" | bc -l`
newwidth=`echo "($newwidth+0.5)/1" | bc`
newheight="$height"
fi
fi
printf "Padding into $base..."
convert -size "$newwidth"x"$newheight" xc:"$padcolor" .padcanvas.miff
composite -gravity center "$image" .padcanvas.miff "$dir"/"$base"
rm .padcanvas.miff
echo "DONE"
else
echo "$image is not a proper image...skipping."
fi
shift
done
I have not completely bullet proofed the above but it should get the job done.
Here’s the same before and after shots to show what this script does:
Original | Padded with black | Padded with transparent pixels |
|
|
|
|
|
|
|
|
|
|
| |
Look closely at the last column, the images are padded with transparent pixels! Could be useful for web posting.