1# 使用Image_NativeModule完成位图操作 2<!--Kit: Image Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @yaozhupeng--> 5<!--Designer: @yaozhupeng--> 6<!--Tester: @zhaoxiaoguang2--> 7<!--Adviser: @zengyawen--> 8 9创建位图,获取位图的宽、高、pixelFormat、alphaType、rowStride信息、对位图进行操作以及释放位图实例。 10 11## 开发步骤 12 13### 添加链接库 14 15在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加libpixelmap.so以及日志依赖libhilog_ndk.z.so。 16 17```txt 18target_link_libraries(entry PUBLIC libhilog_ndk.z.so libpixelmap.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**位图接口使用示例** 28 29在初始化参数后创建Pixelmap实例,进行图片像素数据的读写,对图片进行缩放、位置变换、反转、旋转、裁剪等操作。 30 31```c++ 32#include <hilog/log.h> 33#include <multimedia/image_framework/image/pixelmap_native.h> 34 35#undef LOG_DOMAIN 36#undef LOG_TAG 37#define LOG_DOMAIN 0x3200 38#define LOG_TAG "MY_TAG" 39 40Image_ErrorCode PixelmapTest() 41{ 42 uint8_t data[96]; 43 size_t dataSize = 96; 44 for (int i = 0; i < dataSize; i++) { 45 data[i] = i + 1; 46 } 47 48 // 创建参数结构体实例,并设置参数。 49 OH_Pixelmap_InitializationOptions *createOpts; 50 OH_PixelmapInitializationOptions_Create(&createOpts); 51 OH_PixelmapInitializationOptions_SetWidth(createOpts, 6); 52 OH_PixelmapInitializationOptions_SetHeight(createOpts, 4); 53 OH_PixelmapInitializationOptions_SetPixelFormat(createOpts, PIXEL_FORMAT_RGBA_8888); 54 OH_PixelmapInitializationOptions_SetAlphaType(createOpts, PIXELMAP_ALPHA_TYPE_UNKNOWN); 55 56 // 创建Pixelmap实例。 57 OH_PixelmapNative *pixelmap = nullptr; 58 Image_ErrorCode errCode = OH_PixelmapNative_CreatePixelmap(data, dataSize, createOpts, &pixelmap); 59 60 // 读取图像像素数据,结果写入数组里。 61 uint8_t destination[96]; 62 size_t destinationSize = 96; 63 errCode = OH_PixelmapNative_ReadPixels(pixelmap, destination, &destinationSize); 64 if (errCode != IMAGE_SUCCESS) { 65 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_ReadPixels failed, errCode: %{public}d.", errCode); 66 return errCode; 67 } 68 69 // 读取缓冲区中的图片数据,结果写入Pixelmap中。 70 uint8_t source[96]; 71 size_t sourceSize = 96; 72 for (int i = 0; i < sourceSize; i++) { 73 source[i] = i + 1; 74 } 75 errCode = OH_PixelmapNative_WritePixels(pixelmap, source, sourceSize); 76 if (errCode != IMAGE_SUCCESS) { 77 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_WritePixels failed, errCode: %{public}d.", errCode); 78 return errCode; 79 } 80 81 // 创建图片信息实例,并获取图像像素信息。 82 OH_Pixelmap_ImageInfo *imageInfo; 83 OH_PixelmapImageInfo_Create(&imageInfo); 84 errCode = OH_PixelmapNative_GetImageInfo(pixelmap, imageInfo); 85 if (errCode != IMAGE_SUCCESS) { 86 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_GetImageInfo failed, errCode: %{public}d.", errCode); 87 return errCode; 88 } 89 90 // 获取图片的宽,高,pixel格式,透明度等信息。 91 uint32_t width, height, rowStride; 92 int32_t pixelFormat, alphaType; 93 OH_PixelmapImageInfo_GetWidth(imageInfo, &width); 94 OH_PixelmapImageInfo_GetHeight(imageInfo, &height); 95 OH_PixelmapImageInfo_GetRowStride(imageInfo, &rowStride); 96 OH_PixelmapImageInfo_GetPixelFormat(imageInfo, &pixelFormat); 97 OH_PixelmapImageInfo_GetAlphaType(imageInfo, &alphaType); 98 OH_PixelmapImageInfo_Release(imageInfo); 99 OH_LOG_INFO(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest GetImageInfo success, width: %{public}d, height: %{public}d, rowStride: %{public}d, pixelFormat: %{public}d, alphaType: %{public}d.", width, height, rowStride, pixelFormat, alphaType); 100 101 // 设置透明比率来让Pixelmap达到对应的透明效果。 102 errCode = OH_PixelmapNative_Opacity(pixelmap, 0.5); 103 if (errCode != IMAGE_SUCCESS) { 104 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_Opacity failed, errCode: %{public}d.", errCode); 105 return errCode; 106 } 107 108 // 对图片进行缩放。 109 errCode = OH_PixelmapNative_Scale(pixelmap, 2.0, 1.0); 110 if (errCode != IMAGE_SUCCESS) { 111 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_Scale failed, errCode: %{public}d.", errCode); 112 return errCode; 113 } 114 115 // 对图片进行位置变换。 116 errCode = OH_PixelmapNative_Translate(pixelmap, 50.0, 10.0); 117 if (errCode != IMAGE_SUCCESS) { 118 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_Translate failed, errCode: %{public}d.", errCode); 119 return errCode; 120 } 121 122 // 对图片进行旋转。 123 errCode = OH_PixelmapNative_Rotate(pixelmap, 90.0); 124 if (errCode != IMAGE_SUCCESS) { 125 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_Rotate failed, errCode: %{public}d.", errCode); 126 return errCode; 127 } 128 129 // 对图片进行翻转。 130 errCode = OH_PixelmapNative_Flip(pixelmap, true, true); 131 if (errCode != IMAGE_SUCCESS) { 132 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_Flip failed, errCode: %{public}d.", errCode); 133 return errCode; 134 } 135 136 // 对图片进行裁剪。 137 Image_Region region; 138 region.x = 100; 139 region.y = 100; 140 region.width = 6; 141 region.height = 4; 142 errCode = OH_PixelmapNative_Crop(pixelmap, ®ion); 143 if (errCode != IMAGE_SUCCESS) { 144 OH_LOG_ERROR(LOG_APP, "ImagePixelmapNativeCTest pixelmapTest OH_PixelmapNative_Crop failed, errCode: %{public}d.", errCode); 145 return errCode; 146 } 147 148 // 释放Pixelmap, InitializationOptions实例。 149 OH_PixelmapNative_Release(pixelmap); 150 OH_PixelmapInitializationOptions_Release(createOpts); 151 return IMAGE_SUCCESS; 152} 153``` 154