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, ×tamp); 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