• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Using Image_NativeModule to Process Image Information
2<!--Kit: Image Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @aulight02-->
5<!--SE: @liyang_bryan-->
6<!--TSE: @xchaosioda-->
7
8You can use the **ImageInfo** class to set and read the rectangle size, component information, and pixel information of an image.
9
10## How to Develop
11
12### Adding Dependencies
13
14Open 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.
15
16```txt
17target_link_libraries(entry PUBLIC libhilog_ndk.z.so libohimage.so libimage_receiver.so libnative_image.so)
18```
19
20### Calling the Native APIs
21
22For details about the APIs, see [Image_NativeModule](../../reference/apis-image-kit/capi-image-nativemodule.md).
23
24Create a native C++ application in DevEco Studio. The project created by default contains the **index.ets** file, and a **hello.cpp** or **napi_init.cpp** file is generated in the **entry\src\main\cpp** directory. In this example, the generated file is **hello.cpp**. Implement the C APIs in **hello.cpp**. Refer to the sample code below.
25
26```c++
27#include <hilog/log.h>
28#include <multimedia/image_framework/image/image_native.h>
29#include <multimedia/image_framework/image/image_receiver_native.h>
30
31#undef LOG_DOMAIN
32#define LOG_DOMAIN 0x3200
33
34#undef LOG_TAG
35#define LOG_TAG "MY_TAG"
36
37#define IMAGE_WIDTH 320
38#define IMAGE_HEIGHT 480
39#define IMAGE_CAPACITY 2
40
41static void ImageNativeCTest()
42{
43    // Create an OH_ImageReceiverOptions instance.
44    OH_ImageReceiverOptions* options = nullptr;
45    Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(&options);
46    if (errCode != IMAGE_SUCCESS) {
47        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver options failed, errCode: %{public}d.", errCode);
48        return;
49    }
50
51    Image_Size imgSize;
52    imgSize.width = IMAGE_WIDTH;
53    imgSize.height = IMAGE_HEIGHT;
54
55    // Set the size property in OH_ImageReceiverOptions. This property is a mandatory input parameter and does not actually take effect. Image properties are determined by the producer, for example, the camera.
56    errCode = OH_ImageReceiverOptions_SetSize(options, imgSize);
57    if (errCode != IMAGE_SUCCESS) {
58        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options size failed, errCode: %{public}d.", errCode);
59        OH_ImageReceiverOptions_Release(options);
60        return;
61    }
62
63    // Set the capacity property of OH_ImageReceiverOptions.
64    errCode = OH_ImageReceiverOptions_SetCapacity(options, IMAGE_CAPACITY);
65    if (errCode != IMAGE_SUCCESS) {
66        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options capacity failed, errCode: %{public}d.", errCode);
67        OH_ImageReceiverOptions_Release(options);
68        return;
69    }
70
71    // Create an OH_ImageReceiverNative instance.
72    OH_ImageReceiverNative* receiver = nullptr;
73    errCode = OH_ImageReceiverNative_Create(options, &receiver);
74    if (errCode != IMAGE_SUCCESS) {
75        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver failed, errCode: %{public}d.", errCode);
76        OH_ImageReceiverOptions_Release(options);
77        return;
78    }
79
80    // Read the next image object of OH_ImageReceiverNative.
81    OH_ImageNative* image = nullptr;
82    errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image);
83    if (errCode != IMAGE_SUCCESS) {
84        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed, errCode: %{public}d.", errCode);
85        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
86        return;
87    }
88
89    // Read the size property in OH_ImageNative. This property does not actually take effect. Image properties are determined by the producer, for example, the camera.
90    Image_Size imgSizeRead;
91    errCode = OH_ImageNative_GetImageSize(image, &imgSizeRead);
92    if (errCode != IMAGE_SUCCESS) {
93        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image size failed, errCode: %{public}d.", errCode);
94        OH_ImageNative_Release(image);
95        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
96        return;
97    }
98
99    // Read the number of elements in the component list of OH_ImageNative.
100    size_t componentTypeSize = 0;
101    errCode = OH_ImageNative_GetComponentTypes(image, nullptr, &componentTypeSize);
102    if (errCode != IMAGE_SUCCESS) {
103        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image component types failed, errCode: %{public}d.", errCode);
104        OH_ImageNative_Release(image);
105        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
106        return;
107    }
108
109    // Read the component list of OH_ImageNative.
110    uint32_t* components = new uint32_t[componentTypeSize];
111    errCode = OH_ImageNative_GetComponentTypes(image, &components, &componentTypeSize);
112    if (errCode != IMAGE_SUCCESS) {
113        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image component types failed, errCode: %{public}d.", errCode);
114        delete [] components;
115        OH_ImageNative_Release(image);
116        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
117        return;
118    }
119
120    delete [] components;
121
122    // Read the buffer object corresponding to the first component of OH_ImageNative.
123    OH_NativeBuffer* nativeBuffer = nullptr;
124    errCode = OH_ImageNative_GetByteBuffer(image, components[0], &nativeBuffer);
125    if (errCode != IMAGE_SUCCESS) {
126        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image byte buffer failed, errCode: %{public}d.", errCode);
127        OH_ImageNative_Release(image);
128        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
129        return;
130    }
131
132    // Read the size of the buffer corresponding to the first component of OH_ImageNative.
133    size_t nativeBufferSize = 0;
134    errCode = OH_ImageNative_GetBufferSize(image, components[0], &nativeBufferSize);
135    if (errCode != IMAGE_SUCCESS) {
136        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image buffer size failed, errCode: %{public}d.", errCode);
137        OH_ImageNative_Release(image);
138        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
139        return;
140    }
141
142    // Read the row stride corresponding to the first component of OH_ImageNative.
143    int32_t rowStride = 0;
144    errCode = OH_ImageNative_GetRowStride(image, components[0], &rowStride);
145    if (errCode != IMAGE_SUCCESS) {
146        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image row stride failed, errCode: %{public}d.", errCode);
147        OH_ImageNative_Release(image);
148        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
149        return;
150    }
151
152    // Read the pixel stride corresponding to the first component of OH_ImageNative.
153    int32_t pixelStride = 0;
154    errCode = OH_ImageNative_GetPixelStride(image, components[0], &pixelStride);
155    if (errCode != IMAGE_SUCCESS) {
156        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image pixel stride failed, errCode: %{public}d.", errCode);
157        OH_ImageNative_Release(image);
158        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
159        return;
160    }
161
162    // Read the timestamp of the OH_ImageNative instance.
163    int64_t timestamp = 0;
164    errCode = OH_ImageNative_GetTimestamp(image, &timestamp);
165    if (errCode != IMAGE_SUCCESS) {
166        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get timestamp failed, errCode: %{public}d.", errCode);
167        OH_ImageNative_Release(image);
168        OH_ImageReceiverOptions_Release(options);
169        OH_ImageReceiverNative_Release(receiver);
170        return;
171    }
172
173    // Release the OH_ImageNative instance.
174    errCode = OH_ImageNative_Release(image);
175    if (errCode != IMAGE_SUCCESS) {
176        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode);
177    }
178
179    // Release the OH_ImageReceiverOptions instance.
180    errCode = OH_ImageReceiverOptions_Release(options);
181    if (errCode != IMAGE_SUCCESS) {
182        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver options failed, errCode: %{public}d.", errCode);
183    }
184
185    // Release the OH_ImageReceiverOptions instance.
186    errCode = OH_ImageReceiverNative_Release(receiver);
187    if (errCode != IMAGE_SUCCESS) {
188        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver failed, errCode: %{public}d.", errCode);
189    }
190}
191```
192