• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用Image_NativeModule处理图像信息
2<!--Kit: Image Kit-->
3<!--Subsystem: Multimedia-->
4<!--Owner: @aulight02-->
5<!--Designer: @liyang_bryan-->
6<!--Tester: @xchaosioda-->
7<!--Adviser: @zengyawen-->
8
9图像信息类,用于设置和读取图像的矩形大小、组件信息和像素信息。
10
11## 开发步骤
12
13### 添加依赖
14
15在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libohimage.solibimage_receiver.solibnative_image.so 以及日志依赖libhilog_ndk.z.so16
17```txt
18target_link_libraries(entry PUBLIC libhilog_ndk.z.so libohimage.so libimage_receiver.so libnative_image.so)
19```
20
21### Native接口调用
22
23具体接口说明请参考[API文档](../../reference/apis-image-kit/capi-image-nativemodule.md)。
24
25在Deveco Studio新建Native C++应用,默认生成的项目中包含index.ets文件,在entry\src\main\cpp目录下会自动生成一个cpp文件(hello.cppnapi_init.cpp,本示例以hello.cpp文件名为例)。在hello.cpp中实现C API接口调用逻辑,示例代码如下:
26
27```c++
28#include <hilog/log.h>
29#include <multimedia/image_framework/image/image_native.h>
30#include <multimedia/image_framework/image/image_receiver_native.h>
31
32#undef LOG_DOMAIN
33#define LOG_DOMAIN 0x3200
34
35#undef LOG_TAG
36#define LOG_TAG "MY_TAG"
37
38#define IMAGE_WIDTH 320
39#define IMAGE_HEIGHT 480
40#define IMAGE_CAPACITY 2
41
42static void ImageNativeCTest()
43{
44    // 创建 OH_ImageReceiverOptions 实例。
45    OH_ImageReceiverOptions* options = nullptr;
46    Image_ErrorCode errCode = OH_ImageReceiverOptions_Create(&options);
47    if (errCode != IMAGE_SUCCESS) {
48        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver options failed, errCode: %{public}d.", errCode);
49        return;
50    }
51
52    Image_Size imgSize;
53    imgSize.width = IMAGE_WIDTH;
54    imgSize.height = IMAGE_HEIGHT;
55
56    // 设置 OH_ImageReceiverOptions 的 size 属性。该属性仅为必要入参,实际上不会生效,图片属性由生产者决定,如相机。
57    errCode = OH_ImageReceiverOptions_SetSize(options, imgSize);
58    if (errCode != IMAGE_SUCCESS) {
59        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options size failed, errCode: %{public}d.", errCode);
60        OH_ImageReceiverOptions_Release(options);
61        return;
62    }
63
64    // 设置 OH_ImageReceiverOptions 的 capacity 属性。
65    errCode = OH_ImageReceiverOptions_SetCapacity(options, IMAGE_CAPACITY);
66    if (errCode != IMAGE_SUCCESS) {
67        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest set image receiver options capacity failed, errCode: %{public}d.", errCode);
68        OH_ImageReceiverOptions_Release(options);
69        return;
70    }
71
72    // 创建 OH_ImageReceiverNative 实例。
73    OH_ImageReceiverNative* receiver = nullptr;
74    errCode = OH_ImageReceiverNative_Create(options, &receiver);
75    if (errCode != IMAGE_SUCCESS) {
76        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest create image receiver failed, errCode: %{public}d.", errCode);
77        OH_ImageReceiverOptions_Release(options);
78        return;
79    }
80
81    // 读取 OH_ImageReceiverNative 的下一个图片对象。
82    OH_ImageNative* image = nullptr;
83    errCode = OH_ImageReceiverNative_ReadNextImage(receiver, &image);
84    if (errCode != IMAGE_SUCCESS) {
85        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image receiver next image failed, errCode: %{public}d.", errCode);
86        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
87        return;
88    }
89
90    // 读取 OH_ImageNative 的 size 属性。该属性实际上不会生效,图片属性由生产者决定,如相机。
91    Image_Size imgSizeRead;
92    errCode = OH_ImageNative_GetImageSize(image, &imgSizeRead);
93    if (errCode != IMAGE_SUCCESS) {
94        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image size failed, errCode: %{public}d.", errCode);
95        OH_ImageNative_Release(image);
96        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
97        return;
98    }
99
100    // 读取 OH_ImageNative 的组件列表的元素个数。
101    size_t componentTypeSize = 0;
102    errCode = OH_ImageNative_GetComponentTypes(image, nullptr, &componentTypeSize);
103    if (errCode != IMAGE_SUCCESS) {
104        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image component types failed, errCode: %{public}d.", errCode);
105        OH_ImageNative_Release(image);
106        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
107        return;
108    }
109
110    // 读取 OH_ImageNative 的组件列表。
111    uint32_t* components = new uint32_t[componentTypeSize];
112    errCode = OH_ImageNative_GetComponentTypes(image, &components, &componentTypeSize);
113    if (errCode != IMAGE_SUCCESS) {
114        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image component types failed, errCode: %{public}d.", errCode);
115        delete [] components;
116        OH_ImageNative_Release(image);
117        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
118        return;
119    }
120
121    delete [] components;
122
123    // 读取 OH_ImageNative 的第一个组件所对应的缓冲区对象。
124    OH_NativeBuffer* nativeBuffer = nullptr;
125    errCode = OH_ImageNative_GetByteBuffer(image, components[0], &nativeBuffer);
126    if (errCode != IMAGE_SUCCESS) {
127        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image byte buffer failed, errCode: %{public}d.", errCode);
128        OH_ImageNative_Release(image);
129        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
130        return;
131    }
132
133    // 读取 OH_ImageNative 的第一个组件所对应的缓冲区大小。
134    size_t nativeBufferSize = 0;
135    errCode = OH_ImageNative_GetBufferSize(image, components[0], &nativeBufferSize);
136    if (errCode != IMAGE_SUCCESS) {
137        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image buffer size failed, errCode: %{public}d.", errCode);
138        OH_ImageNative_Release(image);
139        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
140        return;
141    }
142
143    // 读取 OH_ImageNative 的第一个组件所对应的像素行宽。
144    int32_t rowStride = 0;
145    errCode = OH_ImageNative_GetRowStride(image, components[0], &rowStride);
146    if (errCode != IMAGE_SUCCESS) {
147        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image row stride failed, errCode: %{public}d.", errCode);
148        OH_ImageNative_Release(image);
149        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
150        return;
151    }
152
153    // 读取 OH_ImageNative 的第一个组件所对应的像素大小。
154    int32_t pixelStride = 0;
155    errCode = OH_ImageNative_GetPixelStride(image, components[0], &pixelStride);
156    if (errCode != IMAGE_SUCCESS) {
157        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get image pixel stride failed, errCode: %{public}d.", errCode);
158        OH_ImageNative_Release(image);
159        OH_ImageReceiverOptions_Release(options);OH_ImageReceiverNative_Release(receiver);
160        return;
161    }
162
163    // 读取 OH_ImageNative 对象所对应的时间戳信息。
164    int64_t timestamp = 0;
165    errCode = OH_ImageNative_GetTimestamp(image, &timestamp);
166    if (errCode != IMAGE_SUCCESS) {
167        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest get timestamp failed, errCode: %{public}d.", errCode);
168        OH_ImageNative_Release(image);
169        OH_ImageReceiverOptions_Release(options);
170        OH_ImageReceiverNative_Release(receiver);
171        return;
172    }
173
174    // 释放 OH_ImageNative 实例。
175    errCode = OH_ImageNative_Release(image);
176    if (errCode != IMAGE_SUCCESS) {
177        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image native failed, errCode: %{public}d.", errCode);
178    }
179
180    // 释放 OH_ImageReceiverOptions 实例。
181    errCode = OH_ImageReceiverOptions_Release(options);
182    if (errCode != IMAGE_SUCCESS) {
183        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver options failed, errCode: %{public}d.", errCode);
184    }
185
186    // 释放 OH_ImageReceiverOptions 实例。
187    errCode = OH_ImageReceiverNative_Release(receiver);
188    if (errCode != IMAGE_SUCCESS) {
189        OH_LOG_ERROR(LOG_APP, "ImageReceiverNativeCTest release image receiver failed, errCode: %{public}d.", errCode);
190    }
191}
192```
193