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.so,libimage_receiver.so,libnative_image.so 以及日志依赖libhilog_ndk.z.so。 16 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.cpp或napi_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, ×tamp); 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