如何写入图像元数据 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
这为你显示如何使用 BitmapEncoder 对象读取图像元数据。 你可以使用 Windows 属性或 Windows 图像处理组件 (WIC) 元数据查询语言写入元数据。
有关使用 BitmapDecoder 和 BitmapEncoder 进行元数据访问的详细信息,请参阅如何读取图像元数据。
注意 你可以使用 Windows.Storage.FileProperties API 来获取和设置 Windows.StorageFile 上的基本属性而无需打开数据流。有关详细信息,请参阅如何获取图像属性。
你需要了解的内容
技术
- 构建你的第一个使用 JavaScript 的 Windows 运行时应用
- Windows.Graphics.Imaging
- WIC 元数据查询语言
- WIC 元数据查询语言
- WIC 本机图像格式元数据查询
- 支持的 Windows 属性
先决条件
- 你应当能够创建使用 JavaScript 的基本 Windows 运行时应用。有关详细信息,请参阅构建你的第一个使用 JavaScript 的 Windows 运行时应用。
- 你应了解如何使用 BitmapEncoder 编码图像,有关详细信息,请参阅如何对新图像进行编码。
说明
步骤 1: 获取编码器对象
编写用来接收 BitmapEncoder 对象的函数的开头。
function (encoder) {
使用编码器,可以访问图像元数据。 如果你尚未拥有编码器对象,请参阅如何对新图像进行编码。
步骤 2: 创建要设置的元数据集
使用 BitmapPropertySet 存储要在编码器上设置的元数据项。每个元数据项都是一个键值对。
键就是标识要设置的元数据项的字符串。BitmapEncoder 接受某些 Windows 属性,以及使用 WIC 元数据查询语言构建的查询。有关支持的 Windows 属性的列表,请参阅支持的 Windows 属性。有关支持 WIC 元数据查询的摘要,请参阅 WIC 本机图像格式元数据查询。
该值为 BitmapTypedValue,它允许你将实际元数据值与显式数据类型 (Windows.Foundation.PropertyType) 相关联。
将 System.Photo.Orientation 元数据(指定 EXIF 方向)设置为值 1,这将指定“常规”方向,并为其分配数据类型 uint16。
var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
var orientationValue = new Windows.Graphics.Imaging.BitmapTypedValue(
1, // Defined as EXIF orientation = "normal"
Windows.Foundation.PropertyType.uint16
);
propertySet.insert("System.Photo.Orientation", orientationValue);
步骤 3: 设置编码器上的元数据
在构建完成所有元数据项后,将在编码器上设置这些项并继续编码操作。
encoder.bitmapProperties.setPropertiesAsync(propertySet).done(function () {
// Continue the encoding operation.
}, function (error) {
switch (error.number) {
case -2003292351: // WINCODEC_ERR_PROPERTYNOTSUPPORTED
// The file format does not support this property.
break;
default:
throw error;
}
});
}
注意 每种图像格式支持不同的元数据项集。如果尝试设置图像格式不支持的元数据或属性项,则将发生错误。例如,只有 JPEG、TIFF 和 JPEG-XR 图像支持 System.Photo.Orientation 属性。
备注
设置多个属性与设置单个属性的作用相同,但是你可在列表中指定多个名称-值对。 此处代码同时设置 Orientation 和 CameraModel。
encoder.savePropertiesAsync(["System.Photo.Orientation": 1],
"System.Photo.CameraModel": "Camera Model 1"]);