FlashExportToJpeg.jsx
Summary
Sample that shows a Flash Palette in Bridge that exports the current items selected in Bridge to JPEG files. It also adds two menu items to the Window Menu; ShowExportToJPEG and HideExportToJPEG
#target bridge
if( app.name == "bridge") {
var ExportToJpeg = {};
ExportToJpeg.getMetadataTemplatesArray = function() {
var templates = new Array();
var pathToTemplates = Folder.userData + "/Adobe/XMP/Metadata Templates";
var templatesFolder = new Folder( pathToTemplates );
if( templatesFolder.exists ) {
var xmpFiles = templatesFolder.getFiles("*.xmp");
for( var x = 0; x < xmpFiles.length; ++x ) {
var fileName = File.decode(xmpFiles[x].name) ;
if( fileName.length > 4 ) {
fileName = fileName.substring( 0, fileName.length - 4 );
}
templates.push(fileName);
}
}
return templates;
}
ExportToJpeg.generateJpegFileWithUniqueName = function( origFileName, namePattern, parentPath ) {
var origName = origFileName;
var origExtension = undefined;
var baseName = origName;
if( ! namePattern || namePattern.length < 1 ) {
namePattern = "%N";
}
var lastDot = origName.lastIndexOf (".");
if( lastDot > 0 ) {
origExtension = origName.substr (lastDot);
baseName = origName.substr (0, lastDot);
}
var newName = namePattern;
while( newName.indexOf ("%N") > -1 ) {
newName = newName.replace ("%N", baseName)
}
if( origExtension ) {
while( newName.indexOf ("%E") > -1 ) {
newName = newName.replace ("%E", baseName)
}
}
var exportedJpeg = undefined;
var matching_files = -1;
do {
++matching_files;
if( matching_files == 0 ) {
exportedJpeg = new File( parentPath + "/" + newName + ".jpg" );
} else {
exportedJpeg = new File( parentPath + "/" + newName + "_" + matching_files + ".jpg" );
}
} while ( exportedJpeg.exists );
return exportedJpeg;
}
var Embed_sRGBProfileAppleScript = new File ( new File( $.fileName).parent.fsName + "/resources/Embed_sRGBProfile.scpt" );
ExportToJpeg.exportToJpeg = function( doc, options, flashPlayer ) {
var parentPath = doc.thumbnail.spec.fsName;
if( doc.thumbnail.path == "bridge:special:desktop") {
parentPath = "~/Desktop";
}
if( ! ExternalObject.AdobeXMPScript ) {
ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
}
app.synchronousMode = true;
var thumbs = doc.selections;
for( var s = 0; s < thumbs.length; ++s ) {
var thumb = thumbs[s];
if( flashPlayer ) {
var pctComplete = flashPlayer.invokePlayerFunction("setExportProgress", s, thumbs.length, thumb.name );
}
if( thumb.container ) {
continue;
}
try {
var bitmap;
if( options.bitmapSource == "thumbnail" ) {
thumb.refresh("thumbnail");
bitmap = thumb.core.thumbnail.thumbnail;
} else if (options.bitmapSource == "preview" ) {
thumb.refresh("preview");
bitmap = thumb.core.preview.preview;
} else {
var bitmap = new BitmapData( thumb.spec );
}
if( bitmap ) {
var resizedBitmap;
var resized = false;
var rotated = false;
if( options.maxBitmapSize > 0 ) {
resizedBitmap = bitmap.resize( options.maxBitmapSize );
}
if( resizedBitmap != undefined ) {
bitmap = resizedBitmap;
resized = true;
}
var md = thumb.synchronousMetadata;
var source = new XMPMeta( md.serialize() );
if( options.rotateBitmap ) {
var orientation = source.getProperty( XMPConst.NS_TIFF, "Orientation");
var rotation = 0;
var orientationVal = parseInt( orientation );
if( orientationVal ) {
if( orientationVal == 8 ) {
bitmap = bitmap.rotate( - 90 );
rotated = true;
} else if( orientationVal == 6 ) {
bitmap = bitmap.rotate(90);
rotated = true;
} else if( orientationVal == 3 ) {
bitmap = bitmap.rotate( 180 );
rotated = true;
}
}
}
var exportedJpeg = ExportToJpeg.generateJpegFileWithUniqueName( thumb.name, options.fileNamePattern, parentPath );
bitmap.exportTo( exportedJpeg );
var dest = new XMPMeta();
if( options.inheritMetadata ) {
copyDerrivedProperties( source, dest );
}
dest.setProperty( XMPConst.NS_TIFF, "ImageWidth", bitmap.width.toString() );
dest.setProperty( XMPConst.NS_TIFF, "ImageHeight", bitmap.height.toString());
dest.setProperty( XMPConst.NS_EXIF, "PixelXDimension", bitmap.width.toString() );
dest.setProperty( XMPConst.NS_EXIF, "PixelYDimension", bitmap.height.toString());
dest.setProperty( XMPConst.NS_PHOTOSHOP, "ColorMode", "3");
if( rotated && options.inheritMetadata) {
dest.setProperty( XMPConst.NS_TIFF, "Orientation", "1");
}
var sourceInstanceId;
if( source.doesPropertyExist("http://ns.adobe.com/xap/1.0/mm/", "InstanceID" ) ){
sourceInstanceId = source.getProperty( "http://ns.adobe.com/xap/1.0/mm/", "InstanceID" );
}
var sourceDocumentId;
if( source.doesPropertyExist("http://ns.adobe.com/xap/1.0/mm/", "DocumentID" ) ){
sourceDocumentId = source.getProperty( "http://ns.adobe.com/xap/1.0/mm/", "DocumentID" );
}
if( sourceInstanceId || sourceDocumentId ) {
if( sourceDocumentId ) {
dest.setStructField( "http://ns.adobe.com/xap/1.0/mm/",
"DerivedFrom",
"http://ns.adobe.com/xap/1.0/sType/ResourceRef#",
"documentID",sourceDocumentId );
}
if( sourceInstanceId ) {
dest.setStructField( "http://ns.adobe.com/xap/1.0/mm/",
"DerivedFrom",
"http://ns.adobe.com/xap/1.0/sType/ResourceRef#",
"instanceID",sourceInstanceId );
}
}
dest.setProperty( XMPConst.NS_XMP, "CreatorTool", "Adobe Bridge CS5 " + app.version );
var xmpnow = new XMPDateTime( new Date() );
dest.setProperty( XMPConst.NS_XMP, "MetadataDate", xmpnow, 0, "XMPDATE");
dest.setProperty( XMPConst.NS_XMP, "ModifyDate", xmpnow, 0, "XMPDATE");
if( ! options.inheritMetadata ) {
dest.setProperty( XMPConst.NS_XMP, "CreateDate", xmpnow, 0, "XMPDATE");
}
dest.setProperty( XMPConst.NS_DC, "format", "image/jpeg" );
if( options.addKeywords ) {
for( var k = 0; k < options.keywords.length; ++k ) {
var keyword = options.keywords[k];
dest.appendArrayItem( "http://purl.org/dc/elements/1.1/", "subject",keyword, 0, XMPConst.PROP_IS_ARRAY);
}
}
var xmpjpeg = new XMPFile( exportedJpeg.fsName, XMPConst.FILE_JPEG, XMPConst.OPEN_FOR_UPDATE );
xmpjpeg.putXMP( dest );
xmpjpeg.closeFile();
if( Folder.fs == "Macintosh" && Embed_sRGBProfileAppleScript.exists ) {
var systemCommand = "osascript \"" + Embed_sRGBProfileAppleScript.fsName + "\" \"" + exportedJpeg.fsName + "\"";
app.system (systemCommand);
}
var exportedThumb = new Thumbnail( exportedJpeg );
var exportedMeta = exportedThumb.synchronousMetadata;
if( options.template ) {
exportedMeta.applyMetadataTemplate( options.template, options.templateOption );
}
}
} catch( err ) {
alert("Error Exporting " + thumb.name + " to JPEG." + err );
}
}
if( ExternalObject.AdobeXMPScript ) {
ExternalObject.AdobeXMPScript.unload();
ExternalObject.AdobeXMPScript = undefined;
}
app.synchronousMode = false;
if( flashPlayer ) {
var pctComplete = flashPlayer.invokePlayerFunction("setExportProgress", 100, 100, "Done" );
}
}
var contains = function( arr, member ) {
var r = false;
for( var i = 0; i < arr.length &! r; ++i ) {
r = arr[i] == member;
}
return r;
}
var copyWholeSchema = function( source, dest, namespace, omitProps ) {
var propIter = source.iterator(XMPConst.ITERATOR_JUST_CHILDREN | XMPConst.ITERATOR_JUST_LEAF_NAME, namespace, "" );
var prop = propIter.next();
var prefix = XMPMeta.getNamespacePrefix( namespace );
while(prop) {
var name = prop.path.substring( prefix.length );
var copy = omitProps == undefined;
if( ! copy ) {
copy = !(contains( omitProps, name));
}
if( copy ) {
XMPUtils.duplicateSubtree( source, dest, namespace, prop.path,namespace, prop.path, 0 );
}
prop = propIter.next();
}
}
var copyPartOfSchema = function( source, dest, namespace, props ) {
var propIter = source.iterator(XMPConst.ITERATOR_JUST_CHILDREN | XMPConst.ITERATOR_JUST_LEAF_NAME, namespace, "" );
var prop = propIter.next();
var prefix = XMPMeta.getNamespacePrefix( namespace );
while(prop) {
var name = prop.path.substring( prefix.length );
var copy = contains( props, name);
if( copy ) {
XMPUtils.duplicateSubtree( source, dest, namespace, prop.path,namespace, prop.path, 0 );
}
prop = propIter.next();
}
}
var copyDerrivedProperties = function( source, dest ) {
var schemaIter = source.iterator(XMPConst.ITERATOR_JUST_CHILDREN, "", "" );
var schema = schemaIter.next();
while(schema ) {
if (schema.namespace == XMPConst.NS_XMP) {
copyWholeSchema( source, dest, schema.namespace, ["MetadataDate","ModifyDate"] );
} else if (schema.namespace == XMPConst.NS_XMP_MM) {
} else if (schema.namespace == XMPConst.NS_CAMERA_RAW) {
} else if (schema.namespace == XMPConst.NS_PHOTOSHOP) {
copyWholeSchema( source, dest, schema.namespace, ["ColorMode","ICCProfile"] );
} else if (schema.namespace == XMPConst.NS_TIFF) {
copyPartOfSchema( source, dest, schema.namespace, ["Orientation","Make","Model"] );
} else if (schema.namespace == XMPConst.NS_EXIF) {
copyWholeSchema( source, dest, schema.namespace, ["PixelXDimension","PixelYDimension"] );
} else {
copyWholeSchema( source, dest, schema.namespace );
}
schema = schemaIter.next();
}
};
var uiMovie= new File(new File($.fileName).parent.fsName +"/resources/BridgeExportToJPEG.swf");
var showExportToJpegTab = function(doc) {
var flashTab = new TabbedPalette( doc, "Export To JPEG", "ExportToJPEGTab", "script" );
var res = "group { \
fp: FlashPlayer { \
preferredSize: [300, 550], \
alignment: ['fill', 'fill'] \
}, \
}";
flashTab.content.add( res );
flashTab.content.alignChildren = ['fill', 'fill' ];
flashTab.content.layout.layout( true );
flashTab.content.children[0].fp.loadMovie (uiMovie);
flashTab.content.children[0].fp.show();
flashTab.content.children[0].fp.playMovie();
flashTab.content.onResizing = function()
{
this.layout.resize();
}
var flashPlayer = flashTab.content.children[0].fp;
flashPlayer.documentId = doc.id;
flashPlayer.jobOptions = {};
flashPlayer.exportToJpeg = function( options ) {
this.jobOptions = options;
var jobTask = "runJpegExportJob(" + this.documentId + ");";
app.scheduleTask (jobTask, 100, false);
};
var templates = ExportToJpeg.getMetadataTemplatesArray();
flashPlayer.invokePlayerFunction("updateTemplatesList", templates );
};
var findTabbedPalette = function( doc, paletteId ) {
var palettes = doc.palettes;
for( var t = 0; t < palettes.length; ++t ) {
var next = palettes[t];
if( next.id == paletteId ) {
return next;
}
}
return undefined;
}
var runJpegExportJob = function( documentId ) {
var doc = undefined;
var allDocs = app.documents;
for( var d = 0; d < allDocs.length; ++d ) {
var nextDoc = allDocs[d];
if( nextDoc.id == documentId ) {
doc = nextDoc;
break;
}
}
if( doc ) {
var flashPlayer = getExportToJpegFlashPlayer( doc );
var options = flashPlayer.jobOptions;
ExportToJpeg.exportToJpeg( doc, options, flashPlayer );
} else {
throw("runJpegExportJob() could not find a Bridge Document with ID " + documentId );
}
}
var getExportToJpegFlashPlayer = function( doc ) {
var tab = findTabbedPalette( doc, "ExportToJPEGTab" );
if( tab ) {
var flashPlayer = tab.content.children[0].fp;
return flashPlayer;
}
return undefined;
}
if( ! MenuElement.find ("ShowExportToJPEG") ) {
var showExportToJpeg = new MenuElement( "command", "Show Export to JPEG", "-at the end of Window", "ShowExportToJPEG" );
showExportToJpeg.onSelect = function() {
var existingTab = findTabbedPalette( app.document, "ExportToJPEGTab");
if( existingTab ) {
existingTab.show();
} else {
showExportToJpegTab(app.document);
}
}
}
if( ! MenuElement.find ("HideExportToJPEG") ) {
var hideExportToJpeg = new MenuElement( "command", "Hide Export to JPEG", "at the end of Window", "HideExportToJPEG" );
hideExportToJpeg.onSelect = function() {
var existingTab = findTabbedPalette( app.document, "ExportToJPEGTab");
if( existingTab ) {
var flashPlayer = existingTab.content.children[0].fp;
existingTab.content.children[0].remove(flashPlayer);
existingTab.content.children[0].fp = null;
existingTab.remove();
}
}
}
}
http://www.adobe.com/devnet/bridge
Documentation generated by
JSDoc on Tue Apr 27 10:21:34 2010