• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 图片编码(C/C++)
2
3开发者可以调用本模块的Native API接口,完成图片编码,即将PixelMap压缩成不同格式的存档图片。
4
5当前支持编码为JPEG、WebP 和 PNG 格式。
6
7**适用场景**
8
9- 图片编码转换。
10
11  通过传入图片源ImageSource,封装成想要的格式。
12- 图片编辑
13
14  编辑PixelMap后导出图片文件的场景,需要编码成对应图片格式文件。
15
16## 开发指导
17
18详细的API说明请参考[ImagePacker API参考](../../reference/apis-image-kit/image__packer__mdk_8h.md)。
19
20参考以下示例代码,完成图片编码的全流程,包括:创建编码器,初始化资源,编码过程,销毁资源。
21
22在应用开发过程中,开发者应按一定顺序调用方法,执行对应操作,否则系统可能会抛出异常或生成其他未定义的行为。具体顺序可参考下列开发步骤及对应说明。
23
24如下为图片编码调用关系图:
25
26![Invoking relationship of image native encode](figures/image-encode-native.png)
27
28### 在 CMake 脚本中链接动态库
29
30``` cmake
31target_link_libraries(sample PUBLIC libimage_packer_ndk.z.so)
32```
33
34### 开发步骤
35
361. 引入编码器头文件:image_packer_mdk.h37
38   ```cpp
39   // 引入编码器image_packer_mdk.h头文件。
40   #include "multimedia/image_framework/image_packer_mdk.h"
41   ```
422. 创建编码器实例对象。
43
44   应用需要napi_env来创建编码器。
45
46   ```cpp
47   // 使用napi_value 承接创建的编码器对象
48   napi_value packer;
49   // 通过 napi_env 创建编码器,返回result为 IMAGE_RESULT_SUCCESS则创建成功
50   int32_t result = OH_ImagePacker_Create(env, &packer);
51   ```
523. 初始化资源。
53
54   通过OH_ImagePacker_InitNative来初始化编码器原生实例对象。
55
56   ```cpp
57   // 通过 napi_env 及上述创建的编码器对象初始化原生实例对象
58   ImagePacker_Native* nativePacker = OH_ImagePacker_InitNative(env, packer);
59   ```
604. 编码。
61
62   编码接口入参包括:
63
64   - 上述过程中获取的实例对象(ImagePacker_Native)。
65
66   - 需要编码的图像源(napi_value), PixelMap或ImageSource(未调用过CreatePixelMap)的实例对象均可。
67
68   - 编码参数:包括编码格式与编码质量。
69
70   编码接口可按输出方式分为向缓存区(内存)输出和向文件输出两种接口,入参均为上述内容。
71   应用可根据输出的不同需求选择编码接口。
72
73   例向缓存区(内存)输出:
74   ```cpp
75   // 编码参数
76   struct ImagePacker_Opts_ opts;
77   // 配置编码格式(必须)
78   opts.format = "image/jpeg";
79   // 配置编码质量(必须)
80   opts.quality = 100;
81   // 配置输出的缓存区大小为4k(缓存区大小视应用场景定)
82   size_t bufferSize = 4*1024;
83   // 申请图片编码缓存区
84   uint8_t* outData = (uint8_t *)(malloc(bufferSize));
85   // 开始对输入source进行编码过程,返回result为 IMAGE_RESULT_SUCCESS则编码成功,同时bufferSize中包含编码实际使用缓存区大小
86   int32_t result = OH_ImagePacker_PackToData(nativePacker, source, &opts, outData, &bufferSize);
87   ```
88   例向文件输出:
89   ```cpp
90   // 编码参数
91   struct ImagePacker_Opts_ opts;
92   // 配置编码格式(必须)
93   opts.format = "image/jpeg";
94   // 配置编码质量(必须)
95   opts.quality = 100;
96   // 打开需要输出的文件(请确保应用有权限访问这个路径)
97   int fd = open("/data/test.jpg", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
98   if (fd >= 0) {
99      // 开始对输入source进行编码过程,返回result为 IMAGE_RESULT_SUCCESS则编码成功
100      int32_t result = OH_ImagePacker_PackToFile(nativePacker, source, &opts, fd);
101      // 关闭输出文件
102      close(fd);
103   }
104   ```
1055. 销毁编码器实例,释放资源。
106
107   > **说明**:
108   > 资源不能重复销毁。
109
110   ```c++
111   // 调用OH_ImagePacker_Release, 销毁编码器
112   int32_t ret = OH_ImagePacker_Release(nativePacker);
113   if (result != IMAGE_RESULT_SUCCESS) {
114       // 异常处理
115   } else {
116       nativePacker = NULL; //不可重复destroy
117   }
118   ```
119