使用JavaScript读取JPEG图片的XMP元数据

5
有没有办法使用JavaScript读取jpg元数据? 我主要关心xmp评级值(在Windows Explorer中显示5星的评级)。 还有图片拍摄时间也很重要。
我知道可以使用服务器端代码获取此数据,但我想避免额外的往返以获取此信息。
我的用例是一个简单的画廊网站,我想显示Windows Explorer中给出的评级,以及可能的图片拍摄时间等。

你应该在发布页面时提供那些信息。虽然你可以从二进制文件中获取这些信息,但这样做相对昂贵、易碎且速度较慢,并不是每个访问者都需要在每次访问时强制执行的事情。 - dandavis
内容是动态的(我希望新照片可以自动添加),因此在“发布”之前提供此信息对我来说不是一个选项。我原本希望元数据已经发送到客户端(认为整个图像文件已经通过网络发送),但是经过调查,我开始觉得这不是事实。 - hazard
好的,你可以在任何使图像“自动添加”的地方加入元更新器,因为那肯定是某种服务器端的过程... - dandavis
好的,我已经确定我所希望的可能并不是很容易实现,因此我将在服务器端完成这项工作。感谢您的评论。 - hazard
我正在尝试寻找相同的信息。flickr撰写了一篇博客文章,介绍了他们的做法。http://code.flickr.net/2012/06/01/parsing-exif-client-side-using-javascript-2/ 然而,这似乎主要是针对相机特定的内容,而不是用户描述性的内容,例如评级和标签等。 - bodine
2个回答

2
在JPEG中的XMP元数据实际上只是嵌入到JPEG中的纯文本。如果你将JPEG文件作为文本文件打开并搜索“xmp”,你将被带到XMP元数据。它将以XML格式显示。在JavaScript中,您可以使用文件读取器API读取文本,然后解析XMP字符串以检索所需信息。

0
从元数据中读取人员信息的函数: ```javascript function readPersonsFromMetadata() { var persons = 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;

};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接