如何读取图像元数据 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

我们将向你展示如何从图像文件中检索元数据。 图像格式(例如 JPEG、TIFF 和 PNG)支持描述诸如关键字、GPS 位置和相机信息之类内容的多种嵌入式元数据。你可以访问常用的图像属性,以及对以诸如 EXIF 和 XMP 之类的格式存储的原始元数据的更高级访问。

对图像元数据的访问分为两类,具体选择取决于你的方案:Windows.Storage.FileProperties.ImagePropertiesWindows.Graphics.Imaging.BitmapPropertiesView

你可以使用 BitmapPropertiesView 获取 Windows 属性,例如 ImageProperties。但该属性通过使用 WIC 元数据查询语言提供对文件内本机元数据结构的低级别访问。访问本机元数据是更高级的方案,为你提供对比 Windows 属性系统提供的元数据更多的元数据的访问。

你需要了解的内容

技术

先决条件

说明

步骤 1: 获取解码器对象

编写用于接收 BitmapDecoder 对象的函数的开头,并声明在其中存储所检索属性的变量。

(function (decoder) {
      var orientation;
      var xmpCreator;

使用解码器访问图像元数据。 如果还没有解码器对象,请参阅如何解码图像。 在此处声明变量以将其保留在作用域内。

步骤 2: 检索 Windows 属性

BitmapDecoder 类具有成员 BitmapProperties,其类型为 BitmapPropertiesView。与 ImageProperties 类似,你可以通过将一列属性键名传递给 bitmapProperties.getPropertiesAsync 来异步请求支持的 Windows 属性。

注意  每种格式不一定会支持所有的属性。照片元数据策略列表,其中图像格式支持所有属性。

 

     return 
decoder.bitmapProperties.getPropertiesAsync(["System.Photo.Orientation"])
     .then(function(retrievedProps) {

BitmapPropertiesView 在某些重要方面,ImageProperties 中的行为有所不同:

  • 在检索集合中的属性前必须检查该属性的存在性。如果属性不存在,则该方法返回错误。
  • 每个属性值都具有类型 BitmapTypedValue。此对象具有包含实际数据的 Value 成员,以及指示数据类型的 Type 成员。
  • 如果图像格式不支持请求的属性,则 BitmapPropertiesView 返回一个错误。你需要处理这些错误,或者需要确保仅请求图像格式支持的属性。例如,BMP 文件不包含任何元数据。

下面是查找属性的方法:

if (retrievedProperties.hasKey("System.Photo.Orientation") {
        orientation = retrievedProperties.lookup("System.Photo.Orientation").value;
    }     
}, function (error) {
    switch (error.number) {
        case -2003292287:
            // The image format does not support this property.
            break;
        case -2003292287:
            // The image format does not support metadata.
            break;
        default:
            // Catch any other errors.
            break;
    }
});

步骤 3: 检索本机图像元数据

尽管 ImageProperties 被限制为 Windows 属性,但 BitmapPropertiesView 为你提供了访问存储在图像内的大部分元数据的功能。对于每种位图编解码器支持的元数据格式列表,请参阅本机图像格式元数据查询

使用 WIC 元数据查询语言查找属性类似于使用 System.Photo 属性的方法。将属性名称替换为元数据查询字符串即可。

使用以下代码替换第 2 步中编写的代码:

return decoder.bitmapProperties.getPropertiesAsync(["/xmp/dc:creator"])
.then(function(retrievedProps) {
    if (retrievedProperties.hasKey("/xmp/dc:creator") {
        xmpCreator = retrievedProperties.lookup("/xmp/dc:creator").value;
    }     
}, function (error) {
    switch (error.number) {
        case -2003292287:
            // The image format does not support this property.
            break;
        case -2003292287:
            // The image format does not support metadata.
            break;
        default:
            // Catch any other errors.
            break;
    }
});

此特殊代码段按照 Dublin Core XMP 架构的定义请求创建者元数据。查询“/xmp/dc:creator”仅对 JPEG 图像有效。例如,TIFF 图像也支持 XMP 元数据,但等价的 TIFF 查询却为“/ifd/xmp/dc:creator”。

相关主题

如何解码图像

元数据查询语言概述

System.Photo 属性

如何写入图像元数据

照片元数据策略