访问XMP脚本API
访问XMP脚本API
Section titled “访问XMP脚本API”要使用XMP对象,您必须将XMP库作为ExtendScript的ExternalObject加载。为了避免加载多个库实例,请使用如下代码:
// 加载库if ( ExternalObject.AdobeXMPScript == undefined ) { ExternalObject.AdobeXMPScript = new ExternalObject( "lib:AdobeXMPScript");}
加载库后,以下主要的XMP类将在全局JavaScript命名空间中可用:
对象 | 描述 |
---|---|
XMPMeta对象 | 提供XMP Toolkit的核心服务。允许您创建和删除元数据属性,并检索和修改属性值。 |
XMPFile对象 | 提供对文件的主文档级别XMP的便捷I/O访问。允许您从文件中检索现有元数据,更新文件元数据,并向文件添加新元数据。 |
其他顶级对象包括数组处理工具、日期时间对象以及包含命名空间常量的常量定义。顶级对象提供了对封装单个元数据属性、文件信息和XMP数据包信息的附加支持类的访问,以及允许遍历属性的工具。
有关类、它们的属性和方法的详细信息,请参阅XMPScript对象参考。
使用XMP脚本API
Section titled “使用XMP脚本API”XMPMeta对象是访问XMP元数据包的命名空间和属性的主要方式。通过此对象,您可以创建和删除命名空间和属性,并检查和修改属性值。
您可以通过以下几种方式获取或创建XMPMeta对象:
- 您可以使用XMPFile对象直接从文件中检索现有元数据。
XMPFile.
getXMP()方法会创建一个XMPMeta对象,您可以使用它来检查或修改属性及其值。然后,您可以使用XMPFile.
putXMP()将修改后的元数据写回文件。 - 您可以使用构造函数创建一个XMPMeta对象,并使用在其他地方创建或获取的XMP数据包初始化它。
- 您可以使用构造函数创建一个新的空XMPMeta对象,并使用其方法创建全新的命名空间和属性。然后,您可以使用
XMPFile.
putXMP()将新元数据注入文件。
在Adobe Bridge中,您可以使用序列化的XMP在内置的Metadata
对象和XMPScript的XMPMeta对象之间传递XMP元数据。
- 您可以使用XMPScript通过从
Thumbnail
对象存储的元数据创建XMPMeta对象来检查缩略图元数据,使用对象构造函数。为了确保元数据是最新的,请使用同步模式(默认情况下关闭):
var thumb = new Thumbnail( new File( "/C/myImage.jpg") );app.synchronousMode = true;
var xmp = new XMPMeta( thumb.metadata.serialize() );
或:
var xmp = new XMPMeta( thumb.synchronousMetadata.serialize() );
- 您可以通过使用序列化的XMP创建一个新的
Metadata
对象来修改Adobe Bridge缩略图中的元数据。继续前面的示例:
// 创建一个紧凑的XMP数据包 var newPacket = xmp.serialize( XMPConst.SERIALIZE_OMIT_PACKET_WRAPPER | XMPConst.SERIALIZE_USE_COMPACT_FORMAT ) );thumb.metadata = new Metadata( newPacket );
- 要将元数据写回缩略图的文件,您可以访问缩略图的文件并创建一个XMPFile对象对象以直接访问嵌入的元数据:
var xmp = new XMPFile( thumb.spec.fsName, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_UPDATE );
:::注意
XMPFile
对象不支持Adobe Bridge支持的所有文件格式。
:::
创建新元数据
Section titled “创建新元数据”此代码创建一个空的XMPMeta对象,使用它设置元数据属性,并将其序列化为字符串,您可以将其传递给创作工具,或存储在文件中。
var xmp = new XMPMeta();xmp.setProperty( XMPConst.NS_XMP, "CreatorTool", "My Script" );var xmpStr = xmp.serialize(); // 将XMP数据包序列化为XML
// 检索属性var prop = xmp.getProperty(XMPConst.NS_XMP, "CreatorTool");$.writeln( "命名空间: " + prop.namespace + "\n" + "属性路径 + 名称: " + prop.path + "\n" + "值: " + prop ); // 与prop.value相同
修改现有元数据
Section titled “修改现有元数据”此代码访问现有的XMP数据包,假设位置已分配给字符串变量。它将修改日期属性设置为当前日期和时间,并将更新后的XMP数据包存储回字符串,使其尽可能小。
var xmp = new XMPMeta( xmpStr ); // 使用XMP数据包字符串初始化对象var dateTime = new XMPDateTime( new Date() ); // 现在var oldModificationDate = mp.getProperty( XMPConst.NS_XMP, "ModifyDate", "xmpdate" );
$.writeln( "旧的修改日期: " + oldModificationDate );xmp.setProperty( XMPConst.NS_XMP, "ModifyDate", dateTime, "xmpdate" );
// 序列化为XML,使用紧凑样式var xmpStr = xmp.serialize( XMPConst.SERIALIZE_USE_COMPACT_FORMAT );
使用XMPFile进行批处理
Section titled “使用XMPFile进行批处理”此示例遍历文件夹中的图像文件并处理元数据。脚本按以下方式处理每张图片:
- 读取并解析元数据。如果图像文件不包含XMP元数据,则自动将旧元数据转换为XMP。
- 删除现有的创建者列表,并添加一个新的创建者值。
- 将修改后的元数据写回文件。
$.writeln( "XMPFiles批处理示例" );
// 定义包含图像的文件夹(确保使用副本)var picFolder = "/c/temp/photos";
// 加载XMPScript库if ( ExternalObject.AdobeXMPScript == undefined ) { ExternalObject.AdobeXMPScript = new ExternalObject( "lib:AdobeXMPScript" );}
// 遍历文件夹中的照片var pics = Folder(picFolder).getFiles();for ( var i = 0; i < pics.length; i++ ) { var file = pics[i]; $.writeln( "处理文件: " + file.fsName );
// 仅适用于文件,不适用于文件夹 if ( file instanceof File ) { var xmpFile = new XMPFile( file.fsName, XMPConst.UNKNOWN, XMPConst.OPEN_FOR_UPDATE ); var xmp = xmpFile.getXMP();
// 删除现有作者并添加一个新作者 // 现有元数据保持不变 xmp.deleteProperty( XMPConst.NS_DC, "creator" ); xmp.appendArrayItem( XMPConst.NS_DC, "creator", "Judy", 0, XMPConst.ARRAY_IS_ORDERED );
// 将更新后的元数据写入文件 if ( xmpFile.canPutXMP( xmp ) ) { xmpFile.putXMP( xmp ); } xmpFile.closeFile( XMPConst.CLOSE_UPDATE_SAFELY ); }}
将XMPScript与Adobe Bridge集成
Section titled “将XMPScript与Adobe Bridge集成”此脚本为缩略图的上下文菜单添加了一个命令,显示一些XMP属性。
它演示了如何检索与Thumbnail
对象一起存储的XMP元数据,并使用它创建一个XMPMeta对象,然后使用该对象检索不同类型的属性值。
要使用此脚本,请将其放置在Adobe Bridge的“启动脚本”文件夹中(请参阅启动脚本)。当您启动Adobe Bridge时,选择一个包含XMP元数据的文档的缩略图,右键单击,然后从菜单中选择显示XMP属性。
$.writeln("XMPFiles批处理示例");
// 定义包含图像的文件夹(确保使用副本)var picFolder = "/c/temp/photos";
// 加载XMPScript库$.writeln("XMPScript Adobe Bridge集成示例");
// 加载XMPScript库if ( ExternalObject.AdobeXMPScript == undefined ) { ExternalObject.AdobeXMPScript = new ExternalObject( "lib:AdobeXMPScript" );}// 为缩略图添加上下文菜单项var xmpCommand = new MenuElement( "command", "显示XMP属性", "在缩略图末尾", "showProperties" );
// 定义命令行为xmpCommand.onSelect = function(m) {
// 获取第一个选中的缩略图var thumb = app.document.selections[0];
// 如果存在且包含元数据if ( thumb && thumb.metadata ) {
// 从缩略图检索元数据到XMPMeta对象中` // (如果app.synchronousMode已设置,则使用thumb.metadata)
var xmp = new XMPMeta( thumb.synchronousMetadata.serialize() );
// 检索一些XMP属性值 // 一个带有本地化字符串值的简单属性 var msg = "标题: " + xmp.getLocalizedText( XMPConst.NS_DC, "title", null, "en" ) + "\n";
// 一个数组属性 msg += "文档的作者:\n"; var num = xmp.countArrayItems( XMPConst.NS_DC, "creator" );
for ( var i = 1; i <= num; i++ ) {} msg += "* " + xmp.getArrayItem( XMPConst.NS_DC, "creator", i ) + "\n"; }
// 一个带有日期值的简单属性 msg += "创建日期: " + xmp.getProperty( XMPConst.NS_XMP, "CreateDate" )
// 显示值 Window.alert( msg );} else { Window.alert( "未选择缩略图或不包含XMP" );}