有没有办法用javascript读取jpg元数据?我主要感兴趣的是 xmp 评级值(Windows 资源管理器中显示 5 颗星的评级)。拍摄照片的时间也很有趣。
我知道我可以使用服务器端代码获取此数据,但我想避免额外的往返来获取此信息。
我的用例是一个简单的画廊网站,我想在其中显示 Windows 资源管理器中给出的评级,可能还包括照片拍摄时间等信息。
JPEG 中的 XMP 元数据实际上只是嵌入到 JPEG 中的纯文本。
如果您将 JPEG 作为文本文件打开,然后按 ctr-f“xmp”,您将看到 XMP 元数据。它将采用 xml 格式。
在 javascript 中,您可以使用文件读取器 api 来读取文本,然后解析 xmp 字符串以检索您要查找的信息。
函数 readPersonsFromMetadata() { var people = new Array();
if (ExternalObject.AdobeXMPScript == undefined) ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');
var xmp = new XMPMeta(activeDocument.xmpMetadata.rawData);
var ns = "http://www.metadataworkinggroup.com/schemas/regions/";
// The face rectangles are stored in the jpeg metadata by Lightroom Classic
for (var i = 1; i < 1000; i++) {
var personName = xmp.getProperty(ns, "mwg-rs:Regions/mwg-rs:RegionList[" + i + "]/mwg-rs:Name");
if (personName == undefined) break; // exit if we got to the end of the rectangles
if (personName.Length == 0) continue; // Skip over blank names
// x, y, w, and h are in the range 0 to 1.0 and represent a fraction of the document width and height
var x = parseFloat(xmp.getProperty(ns, "mwg-rs:Regions/mwg-rs:RegionList[" + i + "]/mwg-rs:Area/stArea:x"));
var y = parseFloat(xmp.getProperty(ns, "mwg-rs:Regions/mwg-rs:RegionList[" + i + "]/mwg-rs:Area/stArea:y"));
var w = parseFloat(xmp.getProperty(ns, "mwg-rs:Regions/mwg-rs:RegionList[" + i + "]/mwg-rs:Area/stArea:w"));
var h = parseFloat(xmp.getProperty(ns, "mwg-rs:Regions/mwg-rs:RegionList[" + i + "]/mwg-rs:Area/stArea:h"));
persons.push(new Array(personName, x, y, w, h));
}
try { ExternalObject.AdobeXMPScript.unload(); ExternalObject.AdobeXMPScript = undefined; }
catch (e) { alert('Unable to unload the AdobeXMPScript library!'); }
return persons;
};