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.solibimage_receiver.solibnative_image.so以及日志依赖libhilog_ndk.z.so10
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
19hello.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