1# 使用Image完成图片编码 2 3开发者可以调用本模块的Native API接口,完成图片编码,即将PixelMap压缩成不同格式的存档图片。 4 5当前支持编码为JPEG、WebP、PNG和 HEIF(不同硬件设备支持情况不同)格式。 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 27 28### 在 CMake 脚本中链接动态库 29 30``` cmake 31target_link_libraries(sample PUBLIC libimage_packer_ndk.z.so) 32``` 33 34### 开发步骤 35 361. 引入编码器头文件:image_packer_mdk.h。 37 38 ```cpp 39 // 引入编码器image_packer_mdk.h头文件。 40 #include "multimedia/image_framework/image_packer_mdk.h" 41 ``` 42 432. 创建编码器实例对象。 44 45 应用需要napi_env来创建编码器。 46 47 ```cpp 48 // 使用napi_value 承接创建的编码器对象 49 napi_value packer; 50 // 通过 napi_env 创建编码器,返回result为 IMAGE_RESULT_SUCCESS则创建成功 51 int32_t result = OH_ImagePacker_Create(env, &packer); 52 ``` 53 543. 初始化资源。 55 56 通过OH_ImagePacker_InitNative来初始化编码器原生实例对象。 57 58 ```cpp 59 // 通过 napi_env 及上述创建的编码器对象初始化原生实例对象 60 ImagePacker_Native* nativePacker = OH_ImagePacker_InitNative(env, packer); 61 ``` 62 634. 编码。 64 65 编码接口入参包括: 66 67 - 上述过程中获取的实例对象(ImagePacker_Native)。 68 69 - 需要编码的图像源(napi_value), PixelMap或ImageSource(未调用过CreatePixelMap)的实例对象均可。 70 71 - 编码参数:包括编码格式与编码质量。 72 73 > **说明:** 74 > 根据MIME标准,标准编码格式为image/jpeg。当使用image编码时,编码参数中的编码格式format设置为image/jpeg,image编码后的文件扩展名可设为.jpg或.jpeg,可在支持image/jpeg解码的平台上使用。 75 76 编码接口可按输出方式分为向缓存区(内存)输出和向文件输出两种接口,入参均为上述内容。 77 应用可根据输出的不同需求选择编码接口。 78 79 例如向缓存区(内存)输出: 80 81 ```cpp 82 // 编码参数 83 struct ImagePacker_Opts_ opts; 84 // 配置编码格式(必须) 85 opts.format = "image/jpeg"; 86 // 配置编码质量(必须) 87 opts.quality = 100; 88 // 配置输出的缓存区大小为4k(缓存区大小视应用场景定) 89 size_t bufferSize = 4*1024; 90 // 申请图片编码缓存区 91 uint8_t* outData = (uint8_t *)(malloc(bufferSize)); 92 // 开始对输入source进行编码过程,返回result为 IMAGE_RESULT_SUCCESS则编码成功,同时bufferSize中包含编码实际使用缓存区大小 93 int32_t result = OH_ImagePacker_PackToData(nativePacker, source, &opts, outData, &bufferSize); 94 ``` 95 96 例如向文件输出: 97 98 ```cpp 99 // 编码参数 100 struct ImagePacker_Opts_ opts; 101 // 配置编码格式(必须) 102 opts.format = "image/jpeg"; 103 // 配置编码质量(必须) 104 opts.quality = 100; 105 // 打开需要输出的文件(请确保应用有权限访问这个路径) 106 int fd = open("/data/test.jpg", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); 107 if (fd >= 0) { 108 // 开始对输入source进行编码过程,返回result为 IMAGE_RESULT_SUCCESS则编码成功 109 int32_t result = OH_ImagePacker_PackToFile(nativePacker, source, &opts, fd); 110 // 关闭输出文件 111 close(fd); 112 } 113 ``` 114 1155. 销毁编码器实例,释放资源。 116 117 > **说明**: 118 > 资源不能重复销毁。 119 120 ```c++ 121 // 调用OH_ImagePacker_Release, 销毁编码器 122 int32_t ret = OH_ImagePacker_Release(nativePacker); 123 if (result != IMAGE_RESULT_SUCCESS) { 124 // 异常处理 125 } else { 126 nativePacker = NULL; //不可重复destroy 127 } 128 ``` 129