Performing Basic Image Manipulation...
Volume Number: 21 (2005)
Issue Number: 3
Column Tag: Programming
AppleScript Essentials
by Benjamin S. Waldie
Performing Basic Image Manipulation...
Using Your Existing Software!
This month, we're going to talk about performing some basic image manipulations with AppleScript. With the
onset of the digital camera revolution comes a new set of problems for the computer user. The first thing
many people realize after purchasing a digital camera is that film is essentially free, as is developing. You
can take as many pictures as you like, just as long as you have ample hard drive space to store them.
While this concept seems amazing at first, you quickly realize that you now have thousands and thousands of
image files to deal with. Those image files need to be downloaded, imported, renamed, filed, rotated,
cropped, converted to other formats, and more! Sure, there are some tools that Apple gives us to help with
these tasks, such as Image Capture and iPhoto. There are also a slew of other applications that you can
download or purchase to aid with processing. However, wouldn't it be great if you could slap a few lines of
code together to write your own application in order to help with your unique process? Well, using
AppleScript, you can.
AppleScript is the perfect tool for automating many image-related tasks. As we have discussed in previous
articles, AppleScript can be used to batch-rename files and folders. So, you could create a script that
downloads your digital images into a custom folder structure and renames the images with the current date.
You could create a script that opens up a folder of images in something like Photoshop and adds copyright
information into the images' metadata. The possibilities are virtually limitless.
For this particular article, we're going to focus on performing some basic image manipulations, such as
cropping, rotating, and resizing. We'll also look at ways you can convert your images to other formats, such
as from JPEG to TIFF, and vice versa. Since AppleScript alone cannot manipulate images, you may be asking how
will we do this? Using a background application named Image Events, which comes installed with Mac OS X,
version 10.3 and higher, we can perform these tasks.
Image Events
Mac OS X, version 10.3 and higher comes with a background application called Image Events, which can be
found in the System > Library > CoreServices folder on your hard drive.
For those using Mac OS X, version 10.2, an application named Image Capture Scripting will allow you to
perform a few of the same tasks that will be discussed in this article. Image Capture Scripting can be found
in the System > Library > ScriptingAdditions folder on your hard drive.
The Image Events application can be used in conjunction with AppleScript to interact with a service in Mac
OS X called SIPS, or Scriptable Image Processing Server. This service allows basic image manipulations, such
as cropping and resizing to take place.
Accessing the Image Events Dictionary
In order to begin automating Image Events with AppleScript, the first thing you will want to do is open the
Image Events AppleScript dictionary. This can be done by launching the Script Editor, and then selecting
Image Events and clicking the Dictionary icon in the Library palette. If the Library palette is not visible,
you can display it by selecting the Window > Library menu. You may also open the Image Events dictionary
by selecting File > Open Dictionary... in the Script Editor.
Figure 1. The Image Events AppleScript Dictionary
Once the Image Events dictionary has been opened, you will notice several suites of classes and commands in
the left-hand pane. Some of these can be ignored. For example, you won't need to use the Text Suite and you
may not need to use the Disk-Folder-File Suite. You will need to access a few commands in the Standard Suite,
such as open and quit. You will also want to access most of the classes and commands in the Image Suite,
which contains all of the commands for actually performing image manipulations. The Image Events Suite
contains some Image Events application properties, which you may want to modify, but I will not be covering
them in this article.
Opening an Image
First, when working with Image Events, you need to make sure that the application is running. This is done
with the launch command. For example:
tell application "Image Events"
launch
end tell
Obviously, the next step in creating a script that will manipulate an image is to open an image. This is
done by passing the image path to the open command. For example, the following sample code opens a JPEG
image.
set theImage to choose file of type "JPEG"
tell application "Image Events"
launch
open theImage
end tell
--> image "imageName.jpg" of application "Image Events"
As you can see in the above example, the open command returns a reference to the opened image.
Accessing Properties of an Image
Once an image has been opened in Image Events, you may access certain properties of that image, such as the
resolution, or the dimensions of the image. For example, the following sample code gets the resolution of a
JPEG image.
set theImage to choose file of type "JPEG"
tell application "Image Events"
launch
set theImageReference to open theImage
tell theImageReference
resolution
end tell
end tell
--> {180.0, 180.0}
This is just one example of an image property that can be retrieved with AppleScript. I encourage you to
explore the other AppleScript-accessible image properties, which can be found under the image class in the
Image Suite of the Image Events dictionary. One thing to note, though, is that all of these accessible
properties are currently read/only properties. They cannot be changed with AppleScript.
Performing Image Manipulations
Image Events gives you the ability to perform a variety of basic image manipulations, including cropping,
flipping, padding (i.e. adding a border around), rotating, and scaling. The commands for performing these,
and other, image manipulations can be found under Image Suite in the Image Events dictionary. Let's take a
look at one of these commands.
The example code below shows how to scale a JPEG image to a maximum height or width, based on the image's
longest side. Please take note that in order to actually see the scaled image, you must save the image after
it has been manipulated. This is done by using the save command. You may also want to close the image using
the close command.
set theImage to choose file of type "JPEG"
tell application "Image Events"
launch
set theImageReference to open theImage
tell theImageReference
scale to size 100
save
close
end tell
end tell
One thing to note is, by using the save command in the manner above, the image you opened will be
overwritten with the newly scaled image. If you want to save the newly scaled image in another location, you
may optionally specify a save path.
set theImage to choose file of type "JPEG"
set theOutputFolder to choose folder
tell application "Image Events"
launch
set theImageReference to open theImage
tell theImageReference
scale to size 100
save in (theOutputFolder as string) & "Scaled Image.jpg"
close
end tell
end tell
Let's take a look at one more type of image manipulation. The following example code will flip an image
horizontally, and save it into a separate folder.
set theImage to choose file of type "JPEG"
set theOutputFolder to choose folder
tell application "Image Events"
launch
set theImageReference to open theImage
tell theImageReference
flip with horizontal
save in (theOutputFolder as string) & "Flipped Image.jpg"
close
end tell
end tell
Performing Image Conversions
When working with images, it frequently becomes necessary to convert images from one format to another.
Sure, you could open a JPEG image in Preview, and manually export it to TIFF format. But, what if you needed
to do this to 100 images, or 1000? This type of process can actually be done with AppleScript and Image
Events.
Earlier, we discussed using the save command to save images once they have been manipulated. Well, the
save command also some optional parameters, one of which allows you to specify a file type in which to save
the image. The following example code demonstrates how to convert a file from JPEG to TIFF format.
set theImage to choose file of type "JPEG"
set theOutputFolder to choose folder
tell application "Image Events"
launch
set theImageReference to open theImage
tell theImageReference
save in (theOutputFolder as string) & "Converted Image.tiff" as TIFF
close
end tell
end tell
Image Events supports saving images in the following formats - BMP, JPEG, JPEG2, PICT, PNG, PSD, QuickTime
Image. And TIFF. While Image Events can open GIF, MacPaint, PDF, SGI, and TGA images, it cannot save in these
formats.
Pulling it Together
Now, let's pull together a few of the tasks we have discussed. The following example code uses a repeat
loop to process a folder of JPEG images. Using Image Events, each image is opened, resized, and saved in TIFF
format to an output folder.
set theImageFolder to choose folder with prompt "Select a folder of JPEG images:"
set theOutputFolder to choose folder with prompt "Select an output folder:"
tell application "Finder"
set theImages to every file of theImageFolder whose file type = "JPEG"
end tell
tell application "Image Events"
launch
repeat with a from 1 to length of theImages
set theImage to file ((item a of theImages) as string)
set theImageReference to open theImage
tell theImageReference
set theImageName to name
save in ((theOutputFolder as string) & theImageName & ".tiff") as TIFF
end tell
end repeat
end tell
Other Image Manipulation Tools
As you may already know, there are some other image manipulation tools available. Both Graphic Converter
<http://www.lemkesoft.com/> and Adobe Photoshop <http://www.adobe.com/products/photoshop/> offer
extensive AppleScript support. By using AppleScript to automate applications such as these, you can create
simple to complex automated workflows in order to perform virtually any type of image manipulation or
conversion process imaginable.
In Closing
Throughout this article, we have discussed some basic ways to go about manipulating images in Mac OS X
using Image Events. While we looked at a few examples, as I mentioned earlier, there are many other image
manipulation commands and image properties that are available within the Image Events dictionary, that we did
not have a chance to cover. The examples in this article only scratch the surface, and are meant to show you
some basic ideas of what is possible. I would encourage you to begin exploring the Image Events dictionary in
greater detail, so that you can begin using this application to its full potential, making your own workflow
more efficient.
For some additional information about Image Events, please visit Apple's AppleScript web site
http://www.apple.com/applescript/imageevents/
Until next time, keep scripting!
Benjamin Waldie is president of Automated Workflows, LLC, a firm specializing in AppleScript
and workflow automation consulting. In addition to his role as a consultant, Benjamin is an evangelist of
AppleScript, and can frequently be seen presenting at Macintosh User Groups, Seybold Seminars, and MacWorld.
For additional information about Benjamin, please visit http://www.automatedworkflows.com, or email Benjamin
at applescriptguru@mac.com.