1# 使用Image_NativeModule处理图像信息 2 3图像信息类,用于设置和读取图像的矩形大小、组件信息和像素信息。 4 5## 开发步骤 6 7### 添加依赖 8 9在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libohimage.so,libimage_receiver.so,libnative_image.so 以及日志依赖libhilog_ndk.z.so。 10 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 19在hello.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, ×tamp); 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