1# 使用Image_NativeModule处理图像信息
2
3图像信息类,用于设置和读取图像的矩形大小、组件信息和像素信息。
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 ImageNativeCTest()
37{
38    // 创建 OH_ImageReceiverOptions 实例
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    // 设置 OH_ImageReceiverOptions 的 size 属性
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    // 设置 OH_ImageReceiverOptions 的 capacity 属性
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    // 创建 OH_ImageReceiverNative 实例
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    // 读取 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    // 读取 OH_ImageNative 的 size 属性
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    // 读取 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    // 读取 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    // 读取 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    // 读取 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    // 读取 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    // 读取 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    // 读取 OH_ImageNative 对象所对应的时间戳信息
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    // 释放 OH_ImageNative 实例
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    // 释放 OH_ImageReceiverOptions 实例
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    // 释放 OH_ImageReceiverOptions 实例
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