A few years ago, a fellow named Brian Dorn got in touch with me. He was working on his doctoral dissertation at Georgia Tech and he needed participants. I met him in Atlanta and found out that his study was about scripting with Photoshop. That was the first I'd ever heard of Adobe Photoshop Scripting.
A few weeks ago when I started working on a new word game This2That for Mobile Magic Developers, I needed to generate 38 tiles with letters, numbers, and punctuation. The task was tedious and the macros just couldn't make it any easier. Then I realized I had the embossing all wrong and I had to start over!
Frustrated, I tried to think of a better way. I remembered Brian Dorn and I started looking into this Adobe Photoshop JavaScript thing. I was very pleased when 15 minutes of script became an easily reusable tile generating utility. Now, I can take any PSD, open it up, select any text layer, and have the script generate a PNG for each letter I need
I thought this little known feature would make for interesting reading for both programmers and designers so here's my script:
// call the method that does all of the work
main();
// wrap the code in a method to make it easier to debug
function main() {
// make sure you're working in a document and have a text layer selected
if (!activeDocument || !activeDocument.activeLayer || activeDocument.activeLayer.kind != LayerKind.TEXT)
{
alert("Please select a document and a target text layer.");
return;
}
// set up some information about the current file
var textLayer = activeDocument.activeLayer;
var path = activeDocument.path;
var fileName = activeDocument.name;
// remove the extension on the file name
var extensionPosition;
if (extensionPosition = fileName.lastIndexOf('.'))
fileName = fileName.substr(0, extensionPosition);
// get a good place to put the file
var outputFolder = Folder.selectDialog("Select a target folder.", path);
// set up the letters we want images for
var characterMap = [
["question", "?"]
];
// and add the lowercase alphabet and numbers
characterMap = characterMap.concat(getAsciiRange(97, 26), getAsciiRange(48, 10));
// for each character, update the selected text layer and save a file
for (var i = 0; i < characterMap.length; i++)
{
var character = characterMap[i][1];
var fileSuffix = characterMap[i][0];
textLayer.textItem.contents = character;
var file = new File(outputFolder + "/" + fileName + "_" + fileSuffix + ".png");
var options = new PNGSaveOptions();
options.interlaced = false;
activeDocument.saveAs(file, options, true, Extension.LOWERCASE);
}
};
// a little helper method to make a range of letters and their
// filename extensions
function getAsciiRange(from, count) {
var result = [];
for (var i = 0; i < count; i++)
{
var character = String.fromCharCode(i + from);
result.push([character, character.toUpperCase()]);
}
return result;
}

