1# Using Image_NativeModule to Receive Images
2
3You can use the **ImageReceiver** class to obtain the surface ID of a component, read the latest image or the next image, and release **ImageReceiver** instances. For details about the sample code of camera preview implemented with the use of the camera API, see [Secondary Processing of Preview Streams (C/C++)](../camera/native-camera-preview-imageReceiver.md).
4
5## How to Develop
6
7### Adding Dependencies
8
9Open the **src/main/cpp/CMakeLists.txt** file of the native project, add **libohimage.so**, **libimage_receiver.so**, **libnative_image.so**, and **libhilog_ndk.z.so** (on which the log APIs depend) to the **target_link_libraries** dependency.
10
11```txt
12target_link_libraries(entry PUBLIC libhilog_ndk.z.so libohimage.so libimage_receiver.so libnative_image.so)
13```
14
15### Calling the Native APIs
16
17For details about the APIs, see [Image_NativeModule](../../reference/apis-image-kit/_image___native_module.md).
18
19Implement the C native APIs in **hello.cpp**. Refer to the sample code below.
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 for processing the received image data.
39    OH_LOG_INFO(LOG_APP, "ImageReceiverNativeCTest buffer avaliable.");
40
41    // Read the next image object of OH_ImageReceiverNative.
42    OH_ImageNative* image = nullptr;
43    errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image);
44    // You can also call OH_ImageReceiverNative_ReadLatestImage to obtain image data.
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    // The application processes the image data.
53    // ...
54
55    // Release the OH_ImageNative instance.
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    // Create an OH_ImageReceiverOptions instance.
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    // Set the size attribute of OH_ImageReceiverOptions.
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    // Set the capacity attribute of OH_ImageReceiverOptions.
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    // Read the size attribute of OH_ImageReceiverOptions.
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    // Check whether the size read is the same as the size set.
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    // Read the capacity attribute of OH_ImageReceiverOptions.
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    // Check whether the capacity read is the same as the capacity set.
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    // Create an OH_ImageReceiverNative instance.
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    // Register a callback event. Each time a new image is received, the callback event is triggered.
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    // Read the surface ID attribute of OH_ImageReceiverNative.
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    // Read the size attribute of OH_ImageReceiverNative.
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    // Read the capacity attribute of OH_ImageReceiverNative.
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    // Release the OH_ImageReceiverOptions instance.
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// Release ImageReceiverNative resources at a proper time.
183static void ImaggReceiverRelease()
184{
185    // Unregister the callback event registered by calling 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    // Release the OH_ImageReceiverOptions instance.
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