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.so10
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
19hello.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