There are three steps: Also, here are some useful Photoshop scripts Get the photos
Pick a targetPick a target as the focal point. For the Thumb photos, I picked the top of the Thumb; for the Coyote Gulch photos, I picked the top of the foremost 'toe' of the knob. It is important that each shot be centered on the same target. I used the cross-hairs of my viewfinder. Shoot levelProcessing later will be easier if each shot is level (or at least consistent). It's helpful if there is something in the photo that can be used later as a reference (eg., the horizon); you'll be able to use that later to align the rotation of the images. Number of shots(angle between shots) A small angle between shots will make the display smoother (more like a video), but each shot adds to the burden of taking shots, processing them, and download time for viewers. I aimed for about a dozen shots. For The Thumb and Coyote Gulch, which were objects about 300m to 500m distant, I tried to space shots by walking twenty paces along the arc between shots. Image size(pixels of resolution) The final display medium will be a computer screen, which doesn't require a lot of pixels. Today's displays are generally at least 1024 pixels wides, so 2048 pixels ought to provide a few years of 'future-proofing'. All the images should be the same size (if not, there will be more processing work later). Moderate JPG compression is probably adequate for displays on a computer screen -- though if camera memory is available, might as well use it; resolution can always be decreased later, but not increased. Time of dayLow light (morning or evening) is generally best for light on the subject and makes dramatic shadows, but can create problems of high dynamic range if part of the arc ends up shooting into the sun. ExposureI shot each photo of The Thumb and Coyote with automatic exposure, with the idea that the camera would compensate for lighting variations. Alternatively, locking exposure over the series of shots might ensure that the light changes gradually and naturally as you traverse the arc. The Canon Powershot A75 seems to tolerate underexposures better than overexposures (overexposed shots lose information due to clipping, whereas underexposed shots can more often be saved by shifting information from the dark area), so it's best with the A75 to set the camera for the brightest shot and then let the subsequent shots go dark. If the camera will be powered off between shots, a way of locking the exposure would be to use Manual mode, if your camera supports that. Spare batteriesShooting an arc of shots is power-consuming because each shot has to be aligned carefully (target and level), and the time between shots (eg., twenty paces) means either leaving the camera on or turning it off and then on soon after. All this is power-consuming (I learned this the hard way). Process the photosTo get the best display effect, each image must be aligned (position and rotation) and there shouldn't be large differences in exposure between images. Here's the procedure I used with Photoshop CS (available for 30 days free trial from Adobe):
Display the photos (in a browser)[2019 update: Much has changed since this page was written in 2004. Now, an easy way to display a sequence of images is to use an animated GIF. But the javascript method below will still work too.] Here's what I did:
To put your stuff on the web, just upload the directory created in step 1, including the subdirectory with your images. You're done! If you've got a good result, I'd like to see it. Jim Elder, Oct 2004 Photoshop ScriptsPhotoshop CS 'Actions' (recorded Photoshop commands) differ from Photoshop 'Scripts' in that scripts are programming languages such javaScript, visual basic, and appleScript that permit conditional execution ('if' statements) and access to internal Photoshop objects. The two scripts below, available from photoshopScripts_multiAngle.zip, are useful for preparing images for multi-angle display but are not necessary. manyFilesIntoOne.jsx (equivalent to the 'File->Scripts->Load files into stack' command in more recent PhotoShop versions) applyActionToVisibleLayers.jsx (see comments below about customizing this script to your system) Use File->Scripts->Browse within Photoshop to execute a script. Note that the applyActionToVisibleLayers script needs to be edited to work on your system. Use any text editor to open the file and make the simple changes indicated by comments within the file. Here are copies of the two scripts (but download from the links above in case these copies are out of date):
// Photoshop CS script: manyFilesIntoOne
//
// Given a subdirectory containing many JPG files, this script creates a new
// Photoshop document with many layers, each of which is from one of the
// subdirectory JPG files. The size of the new doc is set to the size of the
// first image file read.
//
// To use this script, store it anywhere on your disk, then start Photoshop and
// use File->Scripts->Browse... to select and execute this script. If you'd
// like this script to appear in the list of scripts at File->Scripts, just
// store this script in \Program Files\Adobe\Photoshop CS\Presets\Scripts
//
// References:
// \Program Files\Adobe\Photoshop CS\Scripting Guide\Photoshop Scripting Guide.pdf
// \Program Files\Adobe\Photoshop CS\Scripting Guide\JavaScript Reference Guide.pdf
//
// (based on examples from the JavaScript Reference Guide; developed on Windows XP,
// not tested on other platforms)
//
// Jim Elder, Ottawa, Oct 2004
// Save the current preferences
var startRulerUnits = app.preferences.rulerUnits;
var startTypeUnits = app.preferences.typeUnits;
var startDisplayDialogs = app.displayDialogs;
// Set Photoshop to use pixels and display no dialogs
app.preferences.rulerUnits = Units.PIXELS;
app.preferences.typeUnits = TypeUnits.PIXELS;
app.displayDialogs = DialogModes.NO;
// ask the user to identify the input subdirectory (folder)
var inputFilesFolder = Folder.selectDialog(
"Select a folder that contains JPG images to be read into one " +
"new Photoshop doc as layers", Folder("~"));
// the setting of default dir doesn't seem to work for other than ~
// Start the script debugger
// uncomment the line below to cause Photoshop to start its debugger at this point
// $.level = 1; debugger;
// see if the user gave us a folder
if (inputFilesFolder != null) {
// close all the open documents
while (app.documents.length)
app.activeDocument.close();
// get all the jpg files in the specified folder
var fileList = inputFilesFolder.getFiles("*.jpg");
// open one of them to get its size
for (var i = 0; i < fileList.length; i++) {
if (fileList[i] instanceof File) {
var firstDoc = open(fileList[i]);
break;
}
}
// if there was a first doc...
if (typeof(firstDoc) != 'undefined') {
// create a new document to contain the merged images
var mergedDoc = app.documents.add(firstDoc.width, firstDoc.height,
firstDoc.resolution, "Merged", NewDocumentMode.RGB,
DocumentFill.TRANSPARENT, 1);
// close that first doc
firstDoc.close(SaveOptions.DONOTSAVECHANGES);
// open each file and add it as a layer to the 'merged' doc
for (var i = 0; i < fileList.length; i++) {
// open only files
if (fileList[i] instanceof File) {
open (fileList[i]);
// save the document name for the layer name in the merged document
var docName = app.activeDocument.name;
// flatten the document so we get everything and then copy
app.activeDocument.flatten();
app.activeDocument.selection.selectAll();
app.activeDocument.selection.copy();
// close file; don't save anything we did
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
// merge this image into the mergedDoc as a new layer
mergedDoc.paste();
mergedDoc.activeLayer.name = docName;
}
}
// sort the layers by name
for (var x = 0; x < app.activeDocument.layers.length; x++) {
for (var y = 0; y < app.activeDocument.layers.length - 1 - x; y++) {
var doc1 = app.activeDocument.layers[y].name;
var doc2 = app.activeDocument.layers[y + 1].name;
// compare layer names in a non-case sensitive way
if (doc1.toUpperCase() > doc2.toUpperCase()) {
app.activeDocument.layers[y].move(app.activeDocument.layers[y+1],
ElementPlacement.PLACEAFTER);
}
}
}
}
}
// Reset the application preferences
app.preferences.rulerUnits = startRulerUnits;
app.preferences.typeUnits = startTypeUnits;
app.displayDialogs = startDisplayDialogs;
// Photoshop CS script: applyActionToVisibleLayers
//
// The action hard-coded in this script is performed upon all visible layers.
//
// It'd be more convenient if the script would display a list of the existing actions and
// let the user choose, but I didn't see an easy way of doing that. So for now, just
// edit this script.
//
// References:
// \Program Files\Adobe\Photoshop CS\Scripting Guide\Photoshop Scripting Guide.pdf
// \Program Files\Adobe\Photoshop CS\Scripting Guide\JavaScript Reference Guide.pdf
//
// Jim Elder, Ottawa, Oct 2004
// Start the script debugger
// uncomment the line below to cause Photoshop to start its debugger at this point
// $.level = 1; debugger;
for (var i = 0; i < app.activeDocument.layers.length; i++)
if (app.activeDocument.layers[i].visible)
app.doAction("applyToVisibleLayers", "myActions.atn");
// *******************************************************************************
// * To customize this script to your needs, edit the line above to suit your
// * system. The first parameter ('applyToVisibleLayers') is the name of the
// * Action that will be executed (change it to one or your actions, or create
// * an action with that name). The second parameter ('myActions.atn') is
// * the name given by Photoshop to your custom actions (change it to whatever
// * yours is called).
// *******************************************************************************
Documentation for Photoshop scripts is located in the install area for Photoshop (Windows: \Program Files\Adobe\Photoshop CS\Scripting Guide\). The PDF documents there have enough examples that I was able to glue together the scripts above. To try a script, create it in a text file and then tell Photoshop to execute it using File->Scripts->Browse. Put this: $.level = 1; debugger; at the start of a script to tell Photoshop to open its script debugger, then single step through the script for feedback on problems. |