文档管理中心
开发与测试开放能力API媒体Image Kit(图片处理服务)图片开发指导(ArkTS)图片元数据处理使用ImageSource获取专有元数据

使用ImageSource获取专有元数据

从API version 23开始,支持使用ImageSource获取GIF、HEIFS、DNG、WebP、PNG、JFIF、TIFF、AVIS多种图像格式的专有元数据。

支持的元数据类别

展开
元数据类别 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的详细介绍请参见ImageSourceMetadata

  1. 全局导入Image模块,根据实际需求导入对应的Kit模块。

    收起
    自动换行
    深色代码主题
    复制
    1. // 导入相关模块。
    2. import { image } from '@kit.ImageKit';
    3. import { BusinessError } from '@kit.BasicServicesKit';
    4. import { common } from '@kit.AbilityKit';
    5. import { fileIo } from '@kit.CoreFileKit';
    6. import { resourceManager } from '@kit.LocalizationKit';
  2. 参考使用ImageSource完成图片解码创建ImageSource实例。

  3. 读取专有元数据。

    使用readImageMetadata接口,通过指定属性键(propertyKeys)读取对应格式的专有元数据。以读取GIF元数据中的帧延迟时长为例:

    收起
    自动换行
    深色代码主题
    复制
    1. async readImageMetadata(imageSource: image.ImageSource | undefined) : Promise<image.ImageMetadata | undefined> {
    2. if (imageSource == undefined) {
    3. console.error('imageSource is undefined.');
    4. return undefined;
    5. }
    6. try {
    7. let properties: string[] = [image.GifPropertyKey.GIF_DELAY_TIME];
    8. let index: number = 0;
    9. let imageMetadata: image.ImageMetadata = await imageSource.readImageMetadata(properties, index);
    10. if (imageMetadata.gifMetadata != undefined) {
    11. console.info(`GIF_DELAY_TIME: ${JSON.stringify(imageMetadata.gifMetadata?.delayTime)}`);
    12. }
    13. return imageMetadata
    14. } catch (error) {
    15. console.error(`ReadImageMetadata failed, error.code: ${error.code},
    16. error.message: ${error.message}`)
    17. return undefined;
    18. }
    19. }

    使用readImageMetadataByType接口,通过指定MetadataType枚举值读取对应格式的专有元数据。以读取GIF元数据为例:

    收起
    自动换行
    深色代码主题
    复制
    1. async readImageMetadataByType(imageSource: image.ImageSource | undefined) : Promise<image.ImageMetadata | undefined> {
    2. if (imageSource == undefined) {
    3. console.error('imageSource is undefined.');
    4. return undefined;
    5. }
    6. try {
    7. let types: image.MetadataType[] = [image.MetadataType.GIF_METADATA];
    8. let index: number = 0;
    9. let imageMetadata: image.ImageMetadata = await imageSource.readImageMetadataByType(types, index);
    10. if (imageMetadata.gifMetadata != undefined) {
    11. console.info(`GIF_DELAY_TIME: ${JSON.stringify(imageMetadata.gifMetadata?.delayTime)}`);
    12. }
    13. return imageMetadata;
    14. } catch (error) {
    15. console.error(`ReadImageMetadataByType failed, error.code: ${error.code},
    16. error.message: ${error.message}`)
    17. return undefined;
    18. }
    19. }
  4. 释放imageSource。

    确认imageSource的异步方法已经执行完成,不再使用该变量后,可按需手动调用下面方法释放。

    收起
    自动换行
    深色代码主题
    复制
    1. async release() {
    2. try {
    3. await this.pixelMap?.release();
    4. } catch (error) {
    5. console.error(`Failed to release PixelMap: ${error}.`);
    6. } finally {
    7. this.pixelMap = undefined;
    8. }
    9. try {
    10. await this.imageSource?.release();
    11. } catch (error) {
    12. console.error(`Failed to release ImageSource: ${error}.`);
    13. } finally {
    14. this.imageSource = undefined;
    15. }
    16. }

注意事项

  • 如果图片中不包含目标元数据,返回字段为undefined,使用前请进行空值判断。
  • 读取图片文件需要读取权限,请确保应用已声明并获取相应权限。
  • 多帧图片(如GIF)读取时,index不能小于0或超过帧数范围,否则会导致读取失败。
在 开发与测试 开放能力API 中进行搜索
请输入您想要搜索的关键词