1# 使用Image_NativeModule完成图片接收器 2 3图像接收类,用于获取组件surface id、接收最新的图片和读取下一张图片、释放ImageReceiver实例。结合camera API实现的相机预览示例代码可参考[C/C++预览流二次处理示例](../camera/native-camera-preview-imageReceiver.md)。 4 5## 开发步骤 6 7### 添加依赖 8 9在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libohimage.so、libimage_receiver.so、libnative_image.so以及日志依赖libhilog_ndk.z.so。 10 11```txt 12target_link_libraries(entry PUBLIC libhilog_ndk.z.so libohimage.so libimage_receiver.so libnative_image.so) 13``` 14 15### Native接口调用 16 17具体接口说明请参考[API文档](../../reference/apis-image-kit/_image___native_module.md)。 18 19在hello.cpp中实现C Native API接口调用逻辑,示例代码如下: 20 21```c++ 22#include <hilog/log.h> 23#include <multimedia/image_framework/image/image_native.h> 24#include <multimedia/image_framework/image/image_receiver_native.h> 25 26#undef LOG_DOMAIN 27#define LOG_DOMAIN 0x3200 28 29#undef LOG_TAG 30#define LOG_TAG "MY_TAG" 31 32#define IMAGE_WIDTH 320 33#define IMAGE_HEIGHT 480 34#define IMAGE_CAPACITY 2 35 36static void OnCallback(OH_ImageReceiverNative *receiver) 37{ 38 // callback回调处理接收到的图像数据 39 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest buffer avaliable."); 40 41 // 读取 OH_ImageReceiverNative 的下一个图片对象 42 OH_ImageNative* image = nullptr; 43 errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image); 44 // 结合实际使用情况,此处也可以调用OH_ImageReceiverNative_ReadLatestImage方法获取图像数据 45 if (errCode != IMAGE_SUCCESS) { 46 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed, errCode: %{public}d.", errCode); 47 OH_ImageReceiverOptions_Release(options); 48 OH_ImageReceiverNative_Release(receiver); 49 return; 50 } 51 52 // 应用自行处理image图像数据 53 // ... 54 55 // 释放 OH_ImageNative 实例 56 errCode = OH_ImageNative_Release(image); 57 if (errCode != IMAGE_SUCCESS) { 58 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode); 59 } 60} 61 62static OH_ImageReceiverNative* receiver = nullptr; 63 64static void ImageReceiverNativeCTest() 65{ 66 // 创建 OH_ImageReceiverOptions 实例 67 OH_ImageReceiverOptions* options = nullptr; 68 Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(&options); 69 if (errCode != IMAGE_SUCCESS) { 70 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver options failed, errCode: %{public}d.", errCode); 71 return; 72 } 73 74 Image_Size imgSize; 75 imgSize.width = IMAGE_WIDTH; 76 imgSize.height = IMAGE_HEIGHT; 77 78 // 设置 OH_ImageReceiverOptions 的 size 属性 79 errCode = OH_ImageReceiverOptions_SetSize(options, imgSize); 80 if (errCode != IMAGE_SUCCESS) { 81 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options size failed, errCode: %{public}d.", errCode); 82 OH_ImageReceiverOptions_Release(options); 83 return; 84 } 85 86 // 设置 OH_ImageReceiverOptions 的 capacity 属性 87 errCode = OH_ImageReceiverOptions_SetCapacity(options, IMAGE_CAPACITY); 88 if (errCode != IMAGE_SUCCESS) { 89 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options capacity failed, errCode: %{public}d.", errCode); 90 OH_ImageReceiverOptions_Release(options); 91 return; 92 } 93 94 // 读取 OH_ImageReceiverOptions 的 size 属性 95 Image_Size imgSizeRead; 96 errCode = OH_ImageReceiverOptions_GetSize(options, &imgSizeRead); 97 if (errCode != IMAGE_SUCCESS) { 98 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options size failed, errCode: %{public}d.", errCode); 99 OH_ImageReceiverOptions_Release(options); 100 return; 101 } 102 103 // 检查读取到的 size 值是否为设定值 104 if (imgSizeRead.width != IMAGE_WIDTH || imgSizeRead.height != IMAGE_HEIGHT) { 105 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options size failed, width: %{public}d, height: %{public}d.", imgSizeRead.width, imgSizeRead.height); 106 OH_ImageReceiverOptions_Release(options); 107 return; 108 } 109 110 // 读取 OH_ImageReceiverOptions 的 capacity 属性 111 int32_t capacity = 0; 112 errCode = OH_ImageReceiverOptions_GetCapacity(options, &capacity); 113 if (errCode != IMAGE_SUCCESS) { 114 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options capacity failed, errCode: %{public}d.", errCode); 115 OH_ImageReceiverOptions_Release(options); 116 return; 117 } 118 119 // 检查读取到的 capacity 值是否为设定值 120 if (capacity != IMAGE_CAPACITY) { 121 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver options capacity failed, capacity: %{public}d.", capacity); 122 OH_ImageReceiverOptions_Release(options); 123 return; 124 } 125 126 // 创建 OH_ImageReceiverNative 实例 127 errCode = OH_ImageReceiverNative_Create(options, &receiver); 128 if (errCode != IMAGE_SUCCESS) { 129 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver failed, errCode: %{public}d.", errCode); 130 OH_ImageReceiverOptions_Release(options); 131 return; 132 } 133 134 // 注册一个回调事件,每当接收到新的图片,该回调事件就会响应。 135 uint64_t surfaceID = 0; 136 errCode = OH_ImageReceiverNative_On(receiver, OnCallback); 137 if (errCode != IMAGE_SUCCESS) { 138 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest image receiver on failed, errCode: %{public}d.", errCode); 139 OH_ImageReceiverOptions_Release(options); 140 OH_ImageReceiverNative_Release(receiver); 141 return; 142 } 143 144 // 读取 OH_ImageReceiverNative 的 surfaceID 属性 145 uint64_t surfaceID = 0; 146 errCode = OH_ImageReceiverNative_GetReceivingSurfaceId(receiver, &surfaceID); 147 if (errCode != IMAGE_SUCCESS) { 148 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver surfaceID failed, errCode: %{public}d.", errCode); 149 OH_ImageReceiverOptions_Release(options); 150 OH_ImageReceiverNative_Release(receiver); 151 return; 152 } 153 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver surfaceID: %{public}llu.", surfaceID); 154 155 // 读取 OH_ImageReceiverNative 的 size 属性 156 errCode = OH_ImageReceiverNative_GetSize(receiver, &imgSizeRead); 157 if (errCode != IMAGE_SUCCESS) { 158 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver size failed, errCode: %{public}d.", errCode); 159 OH_ImageReceiverOptions_Release(options); 160 OH_ImageReceiverNative_Release(receiver); 161 return; 162 } 163 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver size: width = %{public}d, height = %{public}d.", imgSizeRead.width, imgSizeRead.height); 164 165 // 读取 OH_ImageReceiverNative 的 capacity 属性 166 errCode = OH_ImageReceiverNative_GetCapacity(receiver, &capacity); 167 if (errCode != IMAGE_SUCCESS) { 168 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver capacity failed, errCode: %{public}d.", errCode); 169 OH_ImageReceiverOptions_Release(options); 170 OH_ImageReceiverNative_Release(receiver); 171 return; 172 } 173 OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest get image receiver capacity: %{public}d.", capacity); 174 175 // 释放 OH_ImageReceiverOptions 实例 176 errCode = OH_ImageReceiverOptions_Release(options); 177 if (errCode != IMAGE_SUCCESS) { 178 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver options failed, errCode: %{public}d.", errCode); 179 } 180} 181 182// 在合适时机释放ImageReceiverNative相关资源 183static void ImaggReceiverRelease() 184{ 185 // 关闭被 OH_ImageReceiverNative_On 开启的回调事件。 186 errCode = OH_ImageReceiverNative_Off(receiver); 187 if (errCode != IMAGE_SUCCESS) { 188 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest image receiver off failed, errCode: %{public}d.", errCode); 189 } 190 191 // 释放 OH_ImageReceiverOptions 实例 192 errCode = OH_ImageReceiverNative_Release(receiver); 193 if (errCode != IMAGE_SUCCESS) { 194 OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver failed, errCode: %{public}d.", errCode); 195 } 196} 197 198``` 199