从API version 23开始,ImageSource陆续支持获取GIF、HEIFS、DNG、WebP、PNG、JFIF、TIFF、AVIS多种图像格式的专有元数据。
各格式支持的起始API版本如下表所示:
| 元数据类别 | MetadataType | 返回字段 | 起始API版本 | 典型信息 |
|---|---|---|---|---|
| GIF | GIF_METADATA | GifMetadata | 26.0.0 | 帧延迟时长、循环次数、画布尺寸等。 |
| HEIFS | HEIFS_METADATA | HeifsMetadata | 23 | 画布高度、画布宽度、未钳制延迟时长等。 |
| DNG | DNG_METADATA | DngMetadata | 24 | DNG版本号、相机型号、CFA参数、黑白电平、色彩校正矩阵等。 |
| WebP | WEBP_METADATA | WebPMetadata | 24 | 画布尺寸、帧延迟时长、循环次数等。 |
| PNG | PNG_METADATA | PngMetadata | 26.0.0 | 像素密度、描述、版权等。 |
| JFIF | JFIF_METADATA | JfifMetadata | 26.0.0 | 像素密度、渐进编码等。 |
| TIFF | TIFF_METADATA | TiffMetadata | 26.0.0 | 分辨率、色度坐标、压缩方式等。 |
| AVIS | AVIS_METADATA | AvisMetadata | 26.0.0 | 帧延迟时长等。 |
HeifsMetadata自API version 23起可用,其中heifsCanvasWidth、heifsCanvasHeight、heifsUnclampedDelayTime三个属性为API版本26.0.0新增。
| 接口 | 说明 |
|---|---|
| readImageMetadata | 读取图像源的元数据,使用propertyKeys指定元数据字段。 从API version 23开始支持。 |
| readImageMetadataByType | 读取图像源的元数据,使用metadataTypes指定元数据类型。 从API version 24开始支持。 |
获取图片专有元数据相关API的详细介绍请参见ImageSource和Metadata。
全局导入Image模块,根据实际需求导入对应的Kit模块。
// 导入相关模块。
import { image } from '@kit.ImageKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
import { fileIo } from '@kit.CoreFileKit';
import { resourceManager } from '@kit.LocalizationKit'; 参考使用ImageSource完成图片解码创建ImageSource实例。
读取专有元数据。
使用readImageMetadata接口,通过指定属性键(propertyKeys)读取对应格式的专有元数据。以读取GIF元数据中的帧延迟时长为例:
async readImageMetadata(imageSource: image.ImageSource | undefined) : Promise<image.ImageMetadata | undefined> {
if (imageSource == undefined) {
console.error('imageSource is undefined.');
return undefined;
}
try {
let properties: string[] = [image.GifPropertyKey.GIF_DELAY_TIME];
let index: number = 0;
let imageMetadata: image.ImageMetadata = await imageSource.readImageMetadata(properties, index);
if (imageMetadata.gifMetadata != undefined) {
console.info(`GIF_DELAY_TIME: ${JSON.stringify(imageMetadata.gifMetadata?.delayTime)}`);
}
return imageMetadata
} catch (error) {
console.error(`ReadImageMetadata failed, error.code: ${error.code},
error.message: ${error.message}`)
return undefined;
}
} 使用readImageMetadataByType接口,通过指定MetadataType枚举值读取对应格式的专有元数据。以读取GIF元数据为例:
async readImageMetadataByType(imageSource: image.ImageSource | undefined) : Promise<image.ImageMetadata | undefined> {
if (imageSource == undefined) {
console.error('imageSource is undefined.');
return undefined;
}
try {
let types: image.MetadataType[] = [image.MetadataType.GIF_METADATA];
let index: number = 0;
let imageMetadata: image.ImageMetadata = await imageSource.readImageMetadataByType(types, index);
if (imageMetadata.gifMetadata != undefined) {
console.info(`GIF_DELAY_TIME: ${JSON.stringify(imageMetadata.gifMetadata?.delayTime)}`);
}
return imageMetadata;
} catch (error) {
console.error(`ReadImageMetadataByType failed, error.code: ${error.code},
error.message: ${error.message}`)
return undefined;
}
} 释放imageSource。
确认imageSource的异步方法已经执行完成,不再使用该变量后,可按需手动调用下面方法释放。
async release() {
try {
await this.pixelMap?.release();
} catch (error) {
console.error(`Failed to release PixelMap: ${error}.`);
} finally {
this.pixelMap = undefined;
}
try {
await this.imageSource?.release();
} catch (error) {
console.error(`Failed to release ImageSource: ${error}.`);
} finally {
this.imageSource = undefined;
}
}