1# 使用Image_NativeModule完成图片编码 2 3图像打包类,用于创建以及释放ImagePacker实例。 4 5## 开发步骤 6 7### 添加链接库 8 9在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libimage_packer.so 以及日志依赖libhilog_ndk.z.so。 10 11```txt 12target_link_libraries(entry PUBLIC libhilog_ndk.z.so libimage_packer.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在创建ImagePacker实例,指定打包参数后将ImageSource或Pixelmap图片源打包至文件或者缓冲区。 24 25> **说明:** 26> 根据MIME标准,标准编码格式为image/jpeg。当使用image编码时,打包参数中的编码格式image_MimeType设置为image/jpeg,image编码后的文件扩展名可设为.jpg或.jpeg,可在支持image/jpeg解码的平台上使用。 27 28 ```c++ 29 30 #include <linux/kd.h> 31 #include <string> 32 33 #include <hilog/log.h> 34 #include <multimedia/image_framework/image/image_packer_native.h> 35 #include <multimedia/image_framework/image/pixelmap_native.h> 36 #include <multimedia/image_framework/image/image_source_native.h> 37 38 #undef LOG_DOMAIN 39 #undef LOG_TAG 40 #define LOG_DOMAIN 0x3200 41 #define LOG_TAG "MY_TAG" 42 43 Image_ErrorCode packToFileFromImageSourceTest(int fd) 44 { 45 //创建ImagePacker实例 46 OH_ImagePackerNative *testPacker = nullptr; 47 Image_ErrorCode errCode = OH_ImagePackerNative_Create(&testPacker); 48 if (errCode != IMAGE_SUCCESS) { 49 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest CreatePacker OH_ImagePackerNative_Create failed, errCode: %{public}d.", errCode); 50 return errCode; 51 } 52 53 //创建ImageSource实例 54 OH_ImageSourceNative* imageSource = nullptr; 55 errCode = OH_ImageSourceNative_CreateFromFd(fd, &imageSource); 56 if (errCode != IMAGE_SUCCESS) { 57 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest OH_ImageSourceNative_CreateFromFd failed, errCode: %{public}d.", errCode); 58 return errCode; 59 } 60 61 //指定打包参数,将ImageSource图片源编码后直接打包进文件 62 OH_PackingOptions *option = nullptr; 63 OH_PackingOptions_Create(&option); 64 char type[] = "image/jpeg"; 65 Image_MimeType image_MimeType = {type, strlen(type)}; 66 OH_PackingOptions_SetMimeType(option, &image_MimeType); 67 // 编码为hdr内容(需要资源本身为hdr,支持jpeg格式) 68 OH_PackingOptions_SetDesiredDynamicRange(option, IMAGE_PACKER_DYNAMIC_RANGE_AUTO); 69 errCode = OH_ImagePackerNative_PackToFileFromImageSource(testPacker, option, imageSource, fd); 70 if (errCode != IMAGE_SUCCESS) { 71 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest OH_ImagePackerNative_PackToFileFromImageSource failed, errCode: %{public}d.", errCode); 72 return errCode; 73 } 74 75 //释放ImagePacker实例 76 errCode = OH_ImagePackerNative_Release(testPacker); 77 if (errCode != IMAGE_SUCCESS) 78 { 79 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest ReleasePacker OH_ImagePackerNative_Release failed, errCode: %{public}d.", errCode); 80 return errCode; 81 } 82 //释放ImageSource实例 83 errCode = OH_ImageSourceNative_Release(imageSource); 84 if (errCode != IMAGE_SUCCESS) 85 { 86 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest ReleasePacker OH_ImageSourceNative_Release failed, errCode: %{public}d.", errCode); 87 return errCode; 88 } 89 90 return IMAGE_SUCCESS; 91 } 92 93 Image_ErrorCode packToFileFromPixelmapTest(uint8_t *buffer, size_t buffSize, int fd) 94 { 95 //创建ImagePacker实例 96 OH_ImagePackerNative *testPacker = nullptr; 97 Image_ErrorCode errCode = OH_ImagePackerNative_Create(&testPacker); 98 if (errCode != IMAGE_SUCCESS) { 99 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest CreatePacker OH_ImagePackerNative_Create failed, errCode: %{public}d.", errCode); 100 return errCode; 101 } 102 103 //创建Pixelmap实例 104 OH_Pixelmap_InitializationOptions *createOpts; 105 OH_PixelmapInitializationOptions_Create(&createOpts); 106 OH_PixelmapInitializationOptions_SetWidth(createOpts, 6); 107 OH_PixelmapInitializationOptions_SetHeight(createOpts, 4); 108 OH_PixelmapInitializationOptions_SetPixelFormat(createOpts, 3); 109 OH_PixelmapInitializationOptions_SetAlphaType(createOpts, 0); 110 OH_PixelmapNative *pixelmap = nullptr; 111 errCode = OH_PixelmapNative_CreatePixelmap(buffer, bufferSize, createOpts, &pixelmap); 112 if (errCode != IMAGE_SUCCESS) { 113 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest OH_PixelmapNative_CreatePixelmap failed, errCode: %{public}d.", errCode); 114 return errCode; 115 } 116 117 //指定打包参数,将PixelMap图片源编码后直接打包进文件 118 OH_PackingOptions *option = nullptr; 119 OH_PackingOptions_Create(&option); 120 char type[] = "image/jpeg"; 121 Image_MimeType image_MimeType = {type, strlen(type)}; 122 OH_PackingOptions_SetMimeType(option, &image_MimeType); 123 errCode = OH_ImagePackerNative_PackToFileFromPixelmap(testPacker, option, pixelmap, fd); 124 if (errCode != IMAGE_SUCCESS) { 125 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest OH_ImagePackerNative_PackToFileFromPixelmap failed, errCode: %{public}d.", errCode); 126 return errCode; 127 } 128 129 //释放ImagePacker实例 130 errCode = OH_ImagePackerNative_Release(testPacker); 131 if (errCode != IMAGE_SUCCESS) 132 { 133 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest ReleasePacker OH_ImagePackerNative_Release failed, errCode: %{public}d.", errCode); 134 return errCode; 135 } 136 137 //释放Pixelmap实例 138 errCode = OH_PixelmapNative_Release(pixelmap); 139 if (errCode != IMAGE_SUCCESS) 140 { 141 OH_LOG_ERROR(LOG_APP, "ImagePackerNativeCTest ReleasePacker OH_PixelmapNative_Release failed, errCode: %{public}d.", errCode); 142 return errCode; 143 } 144 145 return IMAGE_SUCCESS; 146 } 147 ``` 148