图片动态元数据生成
=========

调用者可以调用本模块提供的[C API接口](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-imageprocessing)，实现HDR图片动态元数据生成。

该能力常用于图片编辑中，如下图所示：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3d/v3/to0nYy3FSe29fjHBC6bLJg/zh-cn_image_0000002594828776.png?HW-CC-KV=V1&HW-CC-Date=20260612T073520Z&HW-CC-Expire=86400&HW-CC-Sign=2948B00B65B23748DB2A9887E7D2CC9D417187D8761625AE1AF570110E86B2A8)

#### 规格说明

**支持的数据输入格式：**

| 输入[ColorSpaceName](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-color-space-manager-h#colorspacename) | 输入[HdrMetadataType](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-pixelmap-native-h#oh_pixelmap_hdrmetadatatype) | 输入[PIXEL\_FORMAT](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-pixelmap-native-h#pixel_format) |
| :-- | :-- | :-- |
| BT2020\_PQ\_LIMIT / BT2020\_PQ | HDR\_METADATA\_TYPE\_ALTERNATE | PIXEL\_FORMAT\_YCBCR\_P010 / PIXEL\_FORMAT\_YCRCB\_P010 / PIXEL\_FORMAT\_RGBA\_1010102 |
| BT2020\_HLG\_LIMIT / BT2020\_HLG | HDR\_METADATA\_TYPE\_ALTERNATE | PIXEL\_FORMAT\_YCBCR\_P010 / PIXEL\_FORMAT\_YCRCB\_P010 / PIXEL\_FORMAT\_RGBA\_1010102 |
| BT2020\_PQ\_LIMIT / BT2020\_PQ | HDR\_METADATA\_TYPE\_BASE | PIXEL\_FORMAT\_YCBCR\_P010 / PIXEL\_FORMAT\_YCRCB\_P010 / PIXEL\_FORMAT\_RGBA\_1010102 |
| BT2020\_HLG\_LIMIT / BT2020\_HLG | HDR\_METADATA\_TYPE\_BASE | PIXEL\_FORMAT\_YCBCR\_P010 / PIXEL\_FORMAT\_YCRCB\_P010 / PIXEL\_FORMAT\_RGBA\_1010102 |
| BT2020\_PQ\_LIMIT / BT2020\_PQ | HDR\_METADATA\_TYPE\_NONE | PIXEL\_FORMAT\_YCBCR\_P010 / PIXEL\_FORMAT\_YCRCB\_P010 / PIXEL\_FORMAT\_RGBA\_1010102 |
| BT2020\_HLG\_LIMIT / BT2020\_HLG | HDR\_METADATA\_TYPE\_NONE | PIXEL\_FORMAT\_YCBCR\_P010 / PIXEL\_FORMAT\_YCRCB\_P010 / PIXEL\_FORMAT\_RGBA\_1010102 |

**分辨率规格：**

| 最小分辨率（单位：像素） | 最大分辨率（单位：像素） |
| :-- | :-- |
| 32\*32 | 8880\*8880 |

**内存规格：**

处理的PixelMap对象需为[DMA内存](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/image-allocator-type-c#内存类型介绍)。

#### 开发指导

具体实现可参考[示例工程](https://gitcode.com/HarmonyOS_Samples/DocsSample_MultiMedia/tree/master/UsingImageProcessingToProcessImages)。

#### \[h2\]在 CMake 脚本中链接动态库

add\_library(entry SHARED napi\_init.cpp ImageProcessing/ImageProcessing.cpp)
target\_link\_libraries(entry PUBLIC ${BASE\_LIBRARY})

#### \[h2\]ArkTS侧调用的开发步骤

1.  通过解码器获取10 bit的PixelMap。
    
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE\_TYPE;
    photoSelectOptions.maxSelectNumber = 1;
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
    photoViewPicker.select(photoSelectOptions)
      .then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
        let fd = fileIo.openSync(photoSelectResult.photoUris\[0\], fileIo.OpenMode.READ\_ONLY);
        const imageSource = image.createImageSource(fd.fd);
        let option: image.DecodingOptions = {};
        option.index = 0;
        option.desiredDynamicRange = image.DecodingDynamicRange.AUTO;
        this.pixelMapSrc = imageSource.createPixelMapSync(option);
        this.getColorSpace();
        this.hasPhoto = true;
      })
    
2.  配置色彩框架和元数据信息。
    
    let colorSpaceBT2020\_HLG : colorSpaceManager.ColorSpaceManager = colorSpaceManager.create(colorSpaceManager.ColorSpace.BT2020\_HLG);
    hdrpixelMap.setColorSpace(colorSpaceBT2020\_HLG);
    hdrpixelMap.setMetadata(image.HdrMetadataKey.HDR\_METADATA\_TYPE, image.HdrMetadataType.ALTERNATE);
    

#### \[h2\]Native侧调用的开发步骤

1.  添加头文件。
    
    #include <multimedia/image\_framework/image\_mdk\_common.h>
    #include <multimedia/image\_framework/image\_pixel\_map\_mdk.h>
    #include <multimedia/image\_framework/image/pixelmap\_native.h>
    #include <multimedia/video\_processing\_engine/image\_processing.h>
    #include <multimedia/video\_processing\_engine/image\_processing\_types.h>
    #include <native\_color\_space\_manager/native\_color\_space\_manager.h>
    
2.  （可选）初始化环境。
    
    一般在进程内第一次使用时调用，可提前完成部分耗时操作。
    
    ImageProcessing\_ErrorCode ret =  OH\_ImageProcessing\_InitializeEnvironment();
    
3.  （可选）查询能力支持。建议在使用对应能力前调用。
    
    //输入格式
    ImageProcessing\_ColorSpaceInfo SRC\_INFO;
    SRC\_INFO.colorSpace = BT2020\_HLG;
    SRC\_INFO.metadataType = HDR\_METADATA\_TYPE\_ALTERNATE;
    SRC\_INFO.pixelFormat = PIXEL\_FORMAT\_RGBA\_1010102;
    //能力查询
    bool flag = OH\_ImageProcessing\_IsMetadataGenerationSupported(&SRC\_INFO);
    
4.  将ArkTS中的PixelMap转换为C++的PixelMap。
    
    OH\_PixelmapNative\* hdr = nullptr;
    OH\_PixelmapNative\_ConvertPixelmapNativeFromNapi(env, argValue\[0\], &hdr);
    
5.  创建图片元数据生成模块。
    
6.  应用可以通过图片处理引擎模块类型来创建图片元数据生成模块。示例中的变量说明如下：
    
    instance：图片处理模块实例。
    
    IMAGE\_PROCESSING\_TYPE\_METADATA\_GENERATION：图片元数据生成类型。
    
    预期返回值：IMAGE\_PROCESSING\_SUCCESS
    
    OH\_ImageProcessing\* instance = nullptr;
    ret = OH\_ImageProcessing\_Create(&instance, IMAGE\_PROCESSING\_TYPE\_METADATA\_GENERATION);
    
7.  执行算法。
    
    ret = OH\_ImageProcessing\_GenerateMetadata(instance, hdr);
    
8.  释放实例资源。
    
    ret = OH\_ImageProcessing\_Destroy(instance);
    instance = nullptr;
    
9.  释放初始化环境资源。
    
    ret = OH\_ImageProcessing\_DeinitializeEnvironment();
    

#### 完整示例代码

ArkTS示例代码：

*   [MetadataGen.ets示例代码](https://gitcode.com/HarmonyOS_Samples/DocsSample_MultiMedia/blob/master/UsingImageProcessingToProcessImages/entry/src/main/ets/view/MetadataGenerationComponent.ets)

C++相关示例代码：

*   [CMakeLists.txt示例代码](https://gitcode.com/HarmonyOS_Samples/DocsSample_MultiMedia/blob/master/UsingImageProcessingToProcessImages/entry/src/main/cpp/CMakeLists.txt)
    
*   [ImageProcessing.h示例代码](https://gitcode.com/HarmonyOS_Samples/DocsSample_MultiMedia/blob/master/UsingImageProcessingToProcessImages/entry/src/main/cpp/ImageProcessing/ImageProcessing.h)
    
*   [ImageProcessing.cpp示例代码](https://gitcode.com/HarmonyOS_Samples/DocsSample_MultiMedia/blob/master/UsingImageProcessingToProcessImages/entry/src/main/cpp/ImageProcessing/ImageProcessing.cpp)