1# 使用Image_NativeModule完成图片解码 2 3创建图片源,获取位图的宽、高信息,以及释放图片源实例。 4 5## 开发步骤 6 7### 添加链接库 8 9在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libimage_source.so 以及日志依赖libhilog_ndk.z.so。 10 11```txt 12target_link_libraries(entry PUBLIC libhilog_ndk.z.so libimage_source.so) 13``` 14 15### Native接口调用 16 17具体接口说明请参考[API文档](../../reference/apis-image-kit/_image___native_module.md)。 18 19在hello.cpp中实现C API接口调用逻辑,示例代码如下: 20 21**解码接口使用示例** 22 23在创建ImageSource实例后,进行指定属性值的获取和修改、通过解码参数创建PixelMap对象、获取图像帧数等操作。 24 25 ```c++ 26 27 #include <linux/kd.h> 28 #include <string> 29 30 #include <hilog/log.h> 31 #include <multimedia/image_framework/image/image_source_native.h> 32 33 #undef LOG_DOMAIN 34 #undef LOG_TAG 35 #define LOG_DOMAIN 0x3200 36 #define LOG_TAG "MY_TAG" 37 38 #define NUM_0 0 39 #define NUM_1 1 40 41 static napi_value sourceTest(napi_env env, napi_callback_info info) 42 { 43 napi_value argValue[NUM_1] = {0}; 44 size_t argCount = NUM_1; 45 if (napi_get_cb_info(env, info, &argCount, argValue, nullptr, nullptr) != napi_ok || argCount < NUM_1 || 46 argValue[NUM_0] == nullptr) { 47 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest napi_get_cb_info failed, argCount: %{public}d.", argCount); 48 return getJsResult(env, IMAGE_BAD_PARAMETER); 49 } 50 char name[1024]; 51 size_t nameSize = 1024; 52 napi_get_value_string_utf8(env, argValue[NUM_0], name, 1024, &nameSize); 53 54 //创建ImageSource实例 55 OH_ImageSourceNative *source = nullptr; 56 Image_ErrorCode errCode = OH_ImageSourceNative_CreateFromUri(name, nameSize, &source); 57 if (errCode != IMAGE_SUCCESS) { 58 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_CreateFromUri failed, errCode: %{public}d.", errCode); 59 return errCode; 60 } 61 62 //创建定义图片信息的结构体对象,并获取图片信息 63 OH_ImageSource_Info *imageInfo; 64 OH_ImageSourceInfo_Create(&imageInfo); 65 errCode = OH_ImageSourceNative_GetImageInfo(source, 0, imageInfo); 66 if (errCode != IMAGE_SUCCESS) { 67 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_GetImageInfo failed, errCode: %{public}d.", errCode); 68 return errCode; 69 } 70 71 //获取指定属性键的值 72 uint32_t width, height; 73 OH_ImageSourceInfo_GetWidth(imageInfo, &width); 74 OH_ImageSourceInfo_GetHeight(imageInfo, &height); 75 OH_ImageSourceInfo_Release(imageInfo); 76 OH_LOG_INFO(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_GetImageInfo success, width: %{public}d, height: %{public}d.", width, height); 77 Image_String getKey; 78 const std::string PIXEL_X_DIMENSION = "PixelXDimension"; 79 getKey.data = (char *)PIXEL_X_DIMENSION.c_str(); 80 getKey.size = PIXEL_X_DIMENSION.length(); 81 Image_String getValue; 82 errCode = OH_ImageSourceNative_GetImageProperty(source, &getKey, &getValue); 83 if (errCode != IMAGE_SUCCESS) { 84 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_GetImageProperty failed, errCode: %{public}d.", errCode); 85 return errCode; 86 } 87 88 //修改指定属性键的值 89 Image_String setKey; 90 const std::string ORIENTATION = "Orientation"; 91 setKey.data = (char *)ORIENTATION.c_str(); 92 setKey.size = ORIENTATION.length(); 93 Image_String setValue; 94 setValue.data = (char *)"4"; 95 setValue.size = 1; 96 errCode = OH_ImageSourceNative_ModifyImageProperty(source, &setKey, &setValue); 97 if (errCode != IMAGE_SUCCESS) { 98 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_ModifyImageProperty failed, errCode: %{public}d.", errCode); 99 return errCode; 100 } 101 102 //通过图片解码参数创建PixelMap对象 103 OH_DecodingOptions *ops = nullptr; 104 OH_DecodingOptions_Create(&ops); 105 //设置为AUTO会根据图片资源格式解码,如果图片资源为HDR资源则会解码为HDR的pixelmap。 106 OH_DecodingOptions_SetDesiredDynamicRange(ops, IMAGE_DYNAMIC_RANGE_AUTO); 107 OH_PixelmapNative *resPixMap = nullptr; 108 109 //ops参数支持传入nullptr, 当不需要设置解码参数时,不用创建 110 errCode = OH_ImageSourceNative_CreatePixelmap(source, ops, &resPixMap); 111 OH_DecodingOptions_Release(ops); 112 if (errCode != IMAGE_SUCCESS) { 113 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_CreatePixelmap failed, errCode: %{public}d.", errCode); 114 return errCode; 115 } 116 117 //判断pixelmap是否为hdr内容 118 OH_Pixelmap_ImageInfo *pixelmapImageInfo = nullptr; 119 OH_PixelmapImageInfo_Create(&pixelmapImageInfo); 120 OH_PixelmapNative_GetImageInfo(resPixMap, pixelmapImageInfo); 121 bool pixelmapIsHdr; 122 OH_PixelmapImageInfo_GetDynamicRange(pixelmapImageInfo, &pixelmapIsHdr); 123 OH_PixelmapImageInfo_Release(pixelmapImageInfo); 124 125 //获取图像帧数 126 uint32_t frameCnt = 0; 127 errCode = OH_ImageSourceNative_GetFrameCount(source, &frameCnt); 128 if (errCode != IMAGE_SUCCESS) { 129 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_GetFrameCount failed, errCode: %{public}d.", errCode); 130 return errCode; 131 } 132 133 //通过图片解码参数创建Pixelmap列表 134 OH_DecodingOptions *opts = nullptr; 135 OH_DecodingOptions_Create(&opts); 136 OH_PixelmapNative **resVecPixMap = new OH_PixelmapNative*[frameCnt]; 137 size_t outSize = frameCnt; 138 errCode = OH_ImageSourceNative_CreatePixelmapList(source, opts, resVecPixMap, outSize); 139 OH_DecodingOptions_Release(opts); 140 delete[] resVecPixMap; 141 if (errCode != IMAGE_SUCCESS) { 142 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_CreatePixelmapList failed, errCode: %{public}d.", errCode); 143 return errCode; 144 } 145 146 //获取图像延迟时间列表 147 int32_t *delayTimeList = new int32_t[frameCnt]; 148 size_t size = frameCnt; 149 errCode = OH_ImageSourceNative_GetDelayTimeList(source, delayTimeList, size); 150 delete[] delayTimeList; 151 if (errCode != IMAGE_SUCCESS) { 152 OH_LOG_ERROR(LOG_APP, "ImageSourceNativeCTest sourceTest OH_ImageSourceNative_GetDelayTimeList failed, errCode: %{public}d.", errCode); 153 return errCode; 154 } 155 156 //释放ImageSource实例 157 OH_ImageSourceNative_Release(source); 158 OH_LOG_INFO(LOG_APP, "ImageSourceNativeCTest sourceTest success."); 159 return IMAGE_SUCCESS; 160 } 161 ``` 162