image-transformation-native.md 4.3 KB
Newer Older
R
renhongwei 已提交
1 2
# 图像变换(Native)

R
renhongwei 已提交
3
开发者可以通过本指导了解如何使用Native Image的接口。
R
renhongwei 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

## 开发步骤


**添加依赖**

在进行应用开发之前,开发者需要打开native工程的src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加image的libpixelmap_ndk.z.so以及日志依赖libhilog_ndk.z.so。

    ```txt
    target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so libpixelmap_ndk.z.so)
    ```

**添加接口映射**

打开src/main/cpp/hello.cpp文件,在Init函数中添加接口映射如下:

    ```c++
    EXTERN_C_START
    static napi_value Init(napi_env env, napi_value exports)
    {
        napi_property_descriptor desc[] = {
R
renhongwei 已提交
25 26 27
            { "testGetImageInfo", nullptr, TestGetImageInfo, nullptr, nullptr, nullptr, napi_default, nullptr },
            { "testAccessPixels", nullptr, TestAccessPixels, nullptr, nullptr, nullptr, napi_default, nullptr },
            { "testUnAccessPixels", nullptr, TestUnAccessPixels, nullptr, nullptr, nullptr, napi_default, nullptr },
R
renhongwei 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
        };

        napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
        return exports;
    }
    EXTERN_C_END
    ```


**Native接口调用**

具体接口说明请参考[API文档](../reference/native-apis/image.md)

在hello.cpp文件中获取JS的资源对象,并转为Native的资源对象,即可调用Native接口,调用方式示例代码如下:
    
R
renhongwei 已提交
43 44 45
1. 获取**PixelMap**的信息,并记录信息到**OhosPixelMapInfo**结构中。
   ```c++
   static napi_value TestGetImageInfo(napi_env env, napi_callback_info info)
R
renhongwei 已提交
46
    {
R
renhongwei 已提交
47 48
        napi_value result = nullptr;
        napi_get_undefined(env, &result);
R
renhongwei 已提交
49

R
renhongwei 已提交
50 51 52
        napi_value thisVar = nullptr;
        napi_value argValue[1] = {0};
        size_t argCount = 1;
R
renhongwei 已提交
53 54

        napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr);
R
renhongwei 已提交
55 56 57 58
        
        OHOS::Media::OhosPixelMapInfo pixelMapInfo;
        OHOS::Media::OH_GetImageInfo(env, argValue[0], &pixelMapInfo);
        return result;
R
renhongwei 已提交
59
    }
R
renhongwei 已提交
60 61 62 63
    ```
2. 获取**PixelMap**对象数据的内存地址,并锁定该内存。
    ```c++
    static napi_value TestAccessPixels(napi_env env, napi_callback_info info)
R
renhongwei 已提交
64
    {
R
renhongwei 已提交
65 66 67
        napi_value result = nullptr;
        napi_get_undefined(env, &result);

R
renhongwei 已提交
68 69 70 71
        napi_value thisVar = nullptr;
        napi_value argValue[1] = {0};
        size_t argCount = 1;

R
renhongwei 已提交
72
        napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr);
R
renhongwei 已提交
73

R
renhongwei 已提交
74 75 76
        void* addrPtr = nullptr;
        OHOS::Media::OH_AccessPixels(env, argValue[0], &addrPtr);
        return result;
R
renhongwei 已提交
77 78
    }
    ```
R
renhongwei 已提交
79
3. 释放**PixelMap**对象数据的内存锁。
R
renhongwei 已提交
80
    ```c++
R
renhongwei 已提交
81
    static napi_value TestUnAccessPixels(napi_env env, napi_callback_info info)
R
renhongwei 已提交
82 83 84 85
    {
        napi_value result = nullptr;
        napi_get_undefined(env, &result);

R
renhongwei 已提交
86 87 88
        napi_value thisVar = nullptr;
        napi_value argValue[1] = {0};
        size_t argCount = 1;
R
renhongwei 已提交
89

R
renhongwei 已提交
90
        napi_get_cb_info(env, info, &argCount, argValue, &thisVar, nullptr);
R
renhongwei 已提交
91

R
renhongwei 已提交
92
        OHOS::Media::OH_UnAccessPixels(env, argValue[0]);
R
renhongwei 已提交
93 94 95 96 97 98 99 100 101 102
        return result;
    }
    ```

**JS侧调用**

1. 打开src\main\ets\pages\index.ets, 导入"libentry.so";
    
2. 调用Native接口,传入JS的资源对象。示例如下:

103
    ```ts
R
renhongwei 已提交
104
    import testNapi from 'libentry.so'
R
renhongwei 已提交
105
    import image from '@ohos.multimedia.image';
R
renhongwei 已提交
106 107 108 109

    @Entry
    @Component
    struct Index {
R
renhongwei 已提交
110 111 112 113 114 115 116 117 118
    @State message: string = 'IMAGE'

    build() {
        Row() {
        Column() {
            Button(this.message)
            .fontSize(50)
            .fontWeight(FontWeight.Bold)
            .onClick(() => {
119 120
                const color : ArrayBuffer = new ArrayBuffer(96);
                let opts: image.InitializationOptions = { alphaType: 0, editable: true, pixelFormat: 4, scaleMode: 1, size: { height: 4, width: 6 } }
R
renhongwei 已提交
121
                image.createPixelMap(color, opts)
122 123 124 125 126 127 128 129 130
                .then( (pixelmap : image.PixelMap) => {
                    testNapi.testGetImageInfo(pixelmap);
                    console.info("Test GetImageInfo success");
    
                    testNapi.testAccessPixels(pixelmap);
                    console.info("Test AccessPixels success");
    
                    testNapi.testUnAccessPixels(pixelmap);
                    console.info("Test UnAccessPixels success");
R
renhongwei 已提交
131
                })
R
renhongwei 已提交
132
            })
R
renhongwei 已提交
133
        }
R
renhongwei 已提交
134 135 136 137
        .width('100%')
        }
        .height('100%')
    }
R
renhongwei 已提交
138 139
    }
    ```