1# Using Image_NativeModule to Process Image Information
2
3You can use the **ImageInfo** class to set and read the rectangle size, component information, and pixel information of an image.
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 ImageNativeCTest()
37{
38    // Create an OH_ImageReceiverOptions instance.
39    OH_ImageReceiverOptions* options = nullptr;
40    Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(&options);
41    if (errCode != IMAGE_SUCCESS) {
42        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver options failed, errCode: %{public}d.", errCode);
43        return;
44    }
45
46    Image_Size imgSize;
47    imgSize.width = IMAGE_WIDTH;
48    imgSize.height = IMAGE_HEIGHT;
49
50    // Set the size attribute of OH_ImageReceiverOptions.
51    errCode = OH_ImageReceiverOptions_SetSize(options, imgSize);
52    if (errCode != IMAGE_SUCCESS) {
53        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options size failed, errCode: %{public}d.", errCode);
54        OH_ImageReceiverOptions_Release(options);
55        return;
56    }
57
58    // Set the capacity attribute of OH_ImageReceiverOptions.
59    errCode = OH_ImageReceiverOptions_SetCapacity(options, IMAGE_CAPACITY);
60    if (errCode != IMAGE_SUCCESS) {
61        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options capacity failed, errCode: %{public}d.", errCode);
62        OH_ImageReceiverOptions_Release(options);
63        return;
64    }
65
66    // Create an OH_ImageReceiverNative instance.
67    OH_ImageReceiverNative* receiver = nullptr;
68    errCode = OH_ImageReceiverNative_Create(options, &receiver);
69    if (errCode != IMAGE_SUCCESS) {
70        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver failed, errCode: %{public}d.", errCode);
71        OH_ImageReceiverOptions_Release(options);
72        return;
73    }
74
75    // Read the next image object of OH_ImageReceiverNative.
76    OH_ImageNative* image = nullptr;
77    errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image);
78    if (errCode != IMAGE_SUCCESS) {
79        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed, errCode: %{public}d.", errCode);
80        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
81        return;
82    }
83
84    // Read the size attribute of OH_ImageNative.
85    errCode = OH_ImageNative_GetImageSize(image, &imgSizeRead);
86    if (errCode != IMAGE_SUCCESS) {
87        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image size failed, errCode: %{public}d.", errCode);
88        OH_ImageNative_Release(image);
89        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
90        return;
91    }
92
93    // Read the number of elements in the component list of OH_ImageNative.
94    size_t componentTypeSize = 0;
95    errCode = OH_ImageNative_GetComponentTypes(image, nullptr, &componentTypeSize);
96    if (errCode != IMAGE_SUCCESS) {
97        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image component types failed, errCode: %{public}d.", errCode);
98        OH_ImageNative_Release(image);
99        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
100        return;
101    }
102
103    // Read the component list of OH_ImageNative.
104    uint32_t* components = new uint32_t[componentTypeSize];
105    errCode = OH_ImageNative_GetComponentTypes(image, &components, &componentTypeSize);
106    if (errCode != IMAGE_SUCCESS) {
107        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image component types failed, errCode: %{public}d.", errCode);
108        delete [] components;
109        OH_ImageNative_Release(image);
110        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
111        return;
112    }
113
114    delete [] components;
115
116    // Read the buffer object corresponding to the first component of OH_ImageNative.
117    OH_NativeBuffer* nativeBuffer = nullptr;
118    errCode = OH_ImageNative_GetByteBuffer(image, components[0], &nativeBuffer);
119    if (errCode != IMAGE_SUCCESS) {
120        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image byte buffer failed, errCode: %{public}d.", errCode);
121        OH_ImageNative_Release(image);
122        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
123        return;
124    }
125
126    // Read the size of the buffer corresponding to the first component of OH_ImageNative.
127    size_t nativeBufferSize = 0;
128    errCode = OH_ImageNative_GetBufferSize(image, components[0], &nativeBufferSize);
129    if (errCode != IMAGE_SUCCESS) {
130        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image buffer size failed, errCode: %{public}d.", errCode);
131        OH_ImageNative_Release(image);
132        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
133        return;
134    }
135
136    // Read the row stride corresponding to the first component of OH_ImageNative.
137    int32_t rowStride = 0;
138    errCode = OH_ImageNative_GetRowStride(image, components[0], &rowStride);
139    if (errCode != IMAGE_SUCCESS) {
140        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image row stride failed, errCode: %{public}d.", errCode);
141        OH_ImageNative_Release(image);
142        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
143        return;
144    }
145
146    // Read the pixel stride corresponding to the first component of OH_ImageNative.
147    int32_t pixelStride = 0;
148    errCode = OH_ImageNative_GetPixelStride(image, components[0], &pixelStride);
149    if (errCode != IMAGE_SUCCESS) {
150        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image pixel stride failed, errCode: %{public}d.", errCode);
151        OH_ImageNative_Release(image);
152        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
153        return;
154    }
155
156    // Read the timestamp of the OH_ImageNative instance.
157    int64_t timestamp = 0;
158    errCode = OH_ImageNative_GetTimestamp(image, &timestamp);
159    if (errCode != IMAGE_SUCCESS) {
160        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get timestamp failed, errCode: %{public}d.", errCode);
161        OH_ImageNative_Release(image);
162        OH_ImageReceiverOptions_Release(options);
163        OH_ImageReceiverNative_Release(receiver);
164        return;
165    }
166
167    // Release the OH_ImageNative instance.
168    errCode = OH_ImageNative_Release(image);
169    if (errCode != IMAGE_SUCCESS) {
170        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode);
171    }
172
173    // Release the OH_ImageReceiverOptions instance.
174    errCode = OH_ImageReceiverOptions_Release(options);
175    if (errCode != IMAGE_SUCCESS) {
176        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver options failed, errCode: %{public}d.", errCode);
177    }
178
179    // Release the OH_ImageReceiverOptions instance.
180    errCode = OH_ImageReceiverNative_Release(receiver);
181    if (errCode != IMAGE_SUCCESS) {
182        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver failed, errCode: %{public}d.", errCode);
183    }
184}
185```
186