添加图像效果（C/C++）
=============

#### 场景介绍

在离线处理图像时，可以进行一些图像效果的设置以获取视觉上的不同呈现，比如设置图像模糊程度、调节图像亮度和灰度、设置图像反色等。

主要基于滤镜（Filter）设置不同的图像效果。

#### 接口说明

使用滤镜（Filter）设置图像效果的常用接口如下表所示，详细使用和参数请见[effect\_filter](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-effect-filter-h)。

| 接口 | 描述 |
| :-- | :-- |
| EffectErrorCode OH\_Filter\_CreateEffect(OH\_PixelmapNative\* pixelmap, OH\_Filter\*\* filter) | 用于创建一个基于像素图对象的滤镜对象。 |
| EffectErrorCode OH\_Filter\_Blur(OH\_Filter\* filter, float radius) | 创建一个模糊效果并且添加到滤镜中。 |
| EffectErrorCode OH\_Filter\_Brighten(OH\_Filter\* filter, float brightness) | 创建一个提亮效果并且添加到滤镜中。 |
| EffectErrorCode OH\_Filter\_GrayScale(OH\_Filter\* filter) | 创建一个灰度效果并且添加到滤镜中。 |
| EffectErrorCode OH\_Filter\_Invert(OH\_Filter\* filter) | 创建一个反色效果并且添加到滤镜中。 |
| EffectErrorCode OH\_Filter\_GetEffectPixelMap(OH\_Filter\* filter, OH\_PixelmapNative\*\* pixelmap) | 获取滤镜处理后生成的像素图对象。 |
| EffectErrorCode OH\_Filter\_Release(OH\_Filter\* filter) | 释放滤镜对象。 |

#### 开发步骤

1.  在Native工程的src/main/cpp/CMakeLists.txt中添加如下链接库：
    
    target\_link\_libraries(entry PUBLIC libnative\_drawing.so)
    target\_link\_libraries(entry PUBLIC libhilog\_ndk.z.so)
    target\_link\_libraries(entry PUBLIC libnative\_effect.so)
    target\_link\_libraries(entry PUBLIC libpixelmap.so)
    
2.  导入依赖的相关头文件。
    
    #include "multimedia/image\_framework/image/pixelmap\_native.h"
    #include "native\_effect/effect\_filter.h"
    
3.  创建OH\_PixelmapNative像素图对象。
    
    创建滤镜需要一个图像框架定义的像素图对象（OH\_PixelmapNative）。可以通过OH\_PixelmapNative\_CreatePixelmap()创建一个自定义的像素图，也可以通过OH\_PixelmapNative\_ConvertPixelmapNativeFromNapi()从外部引入像素图。
    
    本文以OH\_PixelmapNative\_CreatePixelmap()为例创建OH\_PixelmapNative。该函数接受4个参数，第一个参数为图像像素数据的缓冲区，用于初始化Pixelmap的像素。第二个参数是缓冲区长度。第三个参数是位图格式（包括长、宽、颜色类型、透明度类型等）。第四个参数即OH\_PixelmapNative对象，作为出参使用。
    
    // 图片宽高分别为 600 \* 400
    uint32\_t width = 600;
    uint32\_t height = 400;
    const uint16\_t RGBA\_MIN = 0x00;
    const uint16\_t RGBA\_MAX = 0xFF;
    const uint16\_t RGBA\_SIZE = 4;
    // 字节长度，RGBA\_8888每个像素占4字节
    size\_t bufferSize = width \* height \* RGBA\_SIZE;
    uint8\_t \*pixels = new uint8\_t\[bufferSize\];
    for (uint32\_t i = 0; i < width \* height; ++i) {
         // 遍历并编辑每个像素，从而形成红绿蓝相间的条纹
         uint32\_t n = i / 20 % 3;
         pixels\[i \* RGBA\_SIZE\] = RGBA\_MIN; // 红色通道
         pixels\[i \* RGBA\_SIZE + 1\] = RGBA\_MIN; // +1表示绿色通道
         pixels\[i \* RGBA\_SIZE + 2\] = RGBA\_MIN; // +2表示蓝色通道
         pixels\[i \* RGBA\_SIZE + 3\] = RGBA\_MAX; // +3表示不透明度通道
         if (n == 0) {
             pixels\[i \* RGBA\_SIZE\] = RGBA\_MAX; // 红色通道赋值，颜色显红色
         } else if (n == 1) {
             pixels\[i \* RGBA\_SIZE + 1\] = RGBA\_MAX; // +1表示绿色通道赋值，其余通道为0，颜色显绿色
         } else {
             pixels\[i \* RGBA\_SIZE + 2\] = RGBA\_MAX; // +2表示蓝色通道赋值，其余通道为0，颜色显蓝色
         }
    }
    // 设置位图格式（长、宽、颜色类型、透明度类型）
    OH\_Pixelmap\_InitializationOptions \*createOps = nullptr;
    OH\_PixelmapInitializationOptions\_Create(&createOps);
    OH\_PixelmapInitializationOptions\_SetWidth(createOps, width);
    OH\_PixelmapInitializationOptions\_SetHeight(createOps, height);
    OH\_PixelmapInitializationOptions\_SetPixelFormat(createOps, PIXEL\_FORMAT\_RGBA\_8888);
    OH\_PixelmapInitializationOptions\_SetAlphaType(createOps, PIXELMAP\_ALPHA\_TYPE\_UNKNOWN);
    // 创建OH\_PixelmapNative对象
    OH\_PixelmapNative \*pixelMapNative = nullptr;
    OH\_PixelmapNative\_CreatePixelmap(pixels, bufferSize, createOps, &pixelMapNative);
    
4.  基于上文生成的OH\_PixelmapNative像素图对象，使用OH\_Filter\_CreateEffect()接口初始化OH\_Filter对象。
    
    OH\_Filter \*filter = nullptr;
    EffectErrorCode errCodeCreate = OH\_Filter\_CreateEffect(pixelMapNative, &filter);
    
5.  按需给滤镜添加不同的图像效果。
    
    *   可使用OH\_Filter\_Blur()接口在滤镜中添加模糊效果。
        
        float radius = 20.0; // 模糊半径
        EffectErrorCode errCodeEffect = OH\_Filter\_Blur(filter, radius);
        
    *   可使用OH\_Filter\_Brighten()接口在滤镜中添加提亮效果。
        
        float brightness = 0.5; // 提亮程度(0~1)
        EffectErrorCode errCodeEffect = OH\_Filter\_Brighten(filter, brightness);
        
    *   可使用OH\_Filter\_GrayScale()接口在滤镜中添加灰度效果。
        
        EffectErrorCode errCodeEffect = OH\_Filter\_GrayScale(filter);
        
    *   可使用OH\_Filter\_Invert()接口在滤镜中添加反色效果。
        
        EffectErrorCode errCodeEffect = OH\_Filter\_Invert(filter);
        
6.  获取经过滤镜处理后的OH\_PixelmapNative像素图对象。
    
    OH\_PixelmapNative\* filterResult = nullptr;
    EffectErrorCode errCodeResult = OH\_Filter\_GetEffectPixelMap(filter, &filterResult);
    
7.  当不再需要滤镜生成图像效果后，请及时使用OH\_Filter\_Release()销毁OH\_Filter对象。
    
    EffectErrorCode errCodeRelease = OH\_Filter\_Release(filter);
    
    绘制效果如下：
    
    | 图像处理 | 绘制效果 |
    | :-- | :-- |
    | 原始图像 | ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/3f/v3/ZbeYnnCRRLOeP6GxL_EoAQ/zh-cn_image_0000002594668984.png?HW-CC-KV=V1&HW-CC-Date=20260612T073538Z&HW-CC-Expire=86400&HW-CC-Sign=27FABDD3361DEAA0E1CA6A200DC1A2464B96EFC102E3FF6E4ADF6A2F173154CE) |
    | 添加模糊效果 | ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/37/v3/O7_WNJQURG6KYfJv79h4ag/zh-cn_image_0000002594828912.png?HW-CC-KV=V1&HW-CC-Date=20260612T073538Z&HW-CC-Expire=86400&HW-CC-Sign=86DDC59354F763B9AECA0EAAB577141D4BF271C33CAFE1702858E6269BF4C94B) |
    | 添加提亮效果 | ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/25/v3/oLGTgrEIRh2mkTaZdFjyYA/zh-cn_image_0000002625188359.png?HW-CC-KV=V1&HW-CC-Date=20260612T073538Z&HW-CC-Expire=86400&HW-CC-Sign=E97175C98E8ACF771A217C76C79F654E869464EE91FD504C81D6FA839CAB62EC) |
    | 添加灰度效果 | ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/aa/v3/cF-VbTHUQve-9HOCjQoLvA/zh-cn_image_0000002625108503.png?HW-CC-KV=V1&HW-CC-Date=20260612T073538Z&HW-CC-Expire=86400&HW-CC-Sign=6367675E0389BE2BDC96C2722627E4B9E32E53A98718D5116C77C7481A616DC0) |
    | 添加反色效果 | ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/f4/v3/YXjUE40NRCWMkU9HdIgaYw/zh-cn_image_0000002594668986.png?HW-CC-KV=V1&HW-CC-Date=20260612T073538Z&HW-CC-Expire=86400&HW-CC-Sign=3429CBD02B7E640505592A7DD6CDF968893D67A6AA0F9399927F12A840F17740) |