• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.so16
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.cppnapi_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, &region);
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