如何读取图像元数据 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
我们将向你展示如何从图像文件中检索元数据。 图像格式(例如 JPEG、TIFF 和 PNG)支持描述诸如关键字、GPS 位置和相机信息之类内容的多种嵌入式元数据。你可以访问常用的图像属性,以及对以诸如 EXIF 和 XMP 之类的格式存储的原始元数据的更高级访问。
对图像元数据的访问分为两类,具体选择取决于你的方案:Windows.Storage.FileProperties.ImageProperties 和 Windows.Graphics.Imaging.BitmapPropertiesView。
你可以使用 BitmapPropertiesView 获取 Windows 属性,例如 ImageProperties。但该属性通过使用 WIC 元数据查询语言提供对文件内本机元数据结构的低级别访问。访问本机元数据是更高级的方案,为你提供对比 Windows 属性系统提供的元数据更多的元数据的访问。
你需要了解的内容
技术
- 构建你的第一个使用 JavaScript 的 Windows 运行时应用
- Windows.Storage.FileProperties.ImageProperties
- Windows.Graphics.Imaging
- Windows 图像处理组件 (WIC) 元数据查询语言
先决条件
- 我们假设你能够创建使用 JavaScript 的基本 Windows 运行时应用。有关详细信息,请参阅构建你的第一个使用 JavaScript 的 Windows 运行时应用。
- 你已创建一个 StorageFile 或 BitmapDecoder 对象。 如何解码图像指导你完成获取以上两个对象的过程。
说明
步骤 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”。