当前位置: 首页 > article >正文

鸿蒙开发——根据背景图片来构建特定颜色的蒙版

效果图如下(文字部分马赛克处理):

最近突然发现网易云和QQ音乐这些图片上方的蒙版颜色不是固定的,而是跟着图片内容走的,想看看能不能在鸿蒙实现,最后凭借俺寻思之力寻思出了一套流程(有bug,有时候蒙版直接透明了,蒙版颜色数据是在的,就是不显示,希望是虚拟机的bug)

第一步、设置背景图/通过Image添加图片

如果要实现上图这样的效果,究竟是要在容器里放一个Image组件还是直接设置容器的背景图呢?我也考虑过这个问题,并且两种方式都试了试,在不考虑性能消耗的情况下实际流程差不多,开发中视情况灵活使用两种方式,这里我接下来就主要介绍设置背景图的方式

第二步、将图片转制为pixelMap对象

为了使用官方开放的各种图片处理API,我们最好先将图片转换为pixelMap对象,该格式的图片几乎能满足所有接口的要求

下面是我写的一个工具类

export default function getPixelMap(context: Context, imageName: string): image.PixelMap {
  const resourceMgr: resourceManager.ResourceManager = context.resourceManager
  const fileData: Uint8Array = resourceMgr.getRawFileContentSync(imageName)
  const buffer = fileData.buffer.slice(0)
  const imageSource: image.ImageSource = image.createImageSource(buffer)
  return imageSource.createPixelMapSync()

}

第三步、获取pixelMap对象的rgb信息

使用华为开放的图像处理API能获取很多的图像信息,跟rgb相关的也有很多,可操作扩展性也很高,在这里不一一展开,官方API文档都能查到。这里我是获取了该pixelMap对象的平均rgb值,并且生成了一个rgb信息字符串和rgba信息字符串,以满足多种需求

export default function getAverageColor(context: Context, imgName: string): string[] {
  // 获取pixelMap对象
  let PixelMap = getPixelMap(context, imgName)
  let colorList: string[] = ['', '']
  effectKit.createColorPicker(PixelMap).then(cp => {
    let color = cp.getAverageColor()
    colorList[0] = 'rgb(' + color.red + ',' + color.green + ',' + color.blue + ')'
    colorList[1] = 'rgba(' + color.red + ',' + color.green + ',' + color.blue + ',0)'
  })
  PixelMap.release().then(() => {
  }).catch((error: BusinessError) => {
  })
  PixelMap.release()
  return colorList
}

第四步、使用图片平均RGB信息制作蒙版

最后就到蒙版的制作了,代码很简单,看看官方API文档就会了,这里只展示上半部分渐变蒙版的代码

            .linearGradient({
              colors: [[obj.overlayColor[0], 0.15],
                [obj.overlayColor[1], 1.0]]
            })


http://www.kler.cn/a/408690.html

相关文章:

  • 三十一、构建完善微服务——API 网关
  • 【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞
  • 数据集-目标检测系列- 牵牛花 检测数据集 morning_glory >> DataBall
  • Fakelocation Server服务器/专业版 Windows11
  • Ansys Zemax Optical Studio 中的近视眼及矫正
  • 【滑动窗口】变种题目:leetcode76:最小覆盖子串
  • mac安装appuim
  • PD虚拟机启动后 Mac主机无法上网解决教程
  • 树莓派——Opencv_python基本操作
  • 【接口封装】——5、绘制头像
  • c++的类和对象(1)
  • PDF内容提取,MinerU使用
  • vscode + ROS 配置快捷编译
  • 【C++】从C语言到C++学习指南
  • GESP语法知识(快速排序)
  • VRRP虚拟路由实现主备设备负载分担
  • 在Spring Boot项目中集成RabbitMQ消息中间件
  • JSON 性能测试 - WastJson 性能也很快
  • 基于LiteFlow的风控系统指标版本控制
  • ApiChain 从迭代测试用例到项目回归测试 核心使用教程
  • 知乎日报——第二周
  • 乐鑫ESP32物联网方案,设备人机交互技术应用,启明云端乐鑫代理商
  • Java连接MySQL数据库进行增删改查操作
  • Flink-Source的使用
  • (二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】
  • -Dspring.profiles.active=dev与--spring.profiles.active=dev的区别