【微信小程序5】利用canvas实现纯色背景抠图功能

简介: 【微信小程序5】利用canvas实现纯色背景抠图功能

       最近,在小程序开发过程中,遇到了需要设置背景透明效果功能的需求。如果借助百度开放接口实现抠图功能是非常方便的,但是一个最大的缺点就是需要money支持。不得已,参考网上各家代码,实现了借助canvas来实现纯色背景抠图功能。只是非常简单的一个应用,先看效果:

       好,下面我们来梳理下逻辑,同时完成代码的编写。

一、实现逻辑

       1、准备好一张纯色背景的图片(我设置的剔除白色背景的)。

       2、把该图片绘制到canvas上(保持大小比例不变)。

       3、对canvas上的每个像素进行扫描,把像素是白色背景的透明度设置为透明

       4、把设置完成的图像再重新绘制到canvas上

       5、完成。背景色设置成透明。

二、代码实现

       现在根据实现逻辑,我们来编写代码,具体如下:

        1、在wxml文件中,添加canvas标签。(class样式不展示了,这是自定义的)

<canvas id="myCanvas" type="2d" class="mv-cvs"></canvas>

       2、添加一个按钮事件,来实现剔除图片背景颜色。

<button bindtap="clickBgd">背景透明</button>

       3、在clickBgd中编写抠图代码:

clickBgd() {
    wx.createSelectorQuery()
      .select('#myCanvas') // 在 WXML 中填入的 id
      .fields({ node: true, size: true })
      .exec((res) => {
        // Canvas 对象
        const canvas = res[0].node
        // 渲染上下文
        const ctx = canvas.getContext("2d")
        const image = canvas.createImage()
        // const dpr = wx.getSystemInfoSync().pixelRatio
        let that = this
        // 图片加载完成回调
        image.onload = () => {
          // 将图片绘制到 canvas 上
          let width = 300
          let height = 150
          console.log("width2:", width, ",height2:", height);
          ctx.drawImage(image, 0, 0, width, height)
          const imgDt = ctx.getImageData(0, 0, width, height)
          const data = imgDt.data
          for (let i = 0; i < data.length; i += 4) {
            let r = data[i + 0]
            let g = data[i + 1]
            let b = data[i + 2]
            data[i + 0] = 255
            data[i + 1] = 0
            data[i + 2] = 0
            if ([r, g, b].every(v => v > 80 && v < 256)) {
              data[i + 3] = 0
            }
          }
            //清除画布之前的图片
          ctx.clearRect(0, 0, 360, 360)
            //创建新的图片数据
          let nimgdt = canvas.createImageData(data, width, height)
          ctx.putImageData(nimgdt, 0, 0)
            //转成png格式的图片
          let dtUrl = canvas.toDataURL("image/png")
          console.log("dataurl:", dtUrl);
          that.setData({
            imgsrc: dtUrl,
          })
        }
        // 设置要剔除背景色的图片src
        image.src ="picture.jpg";
      })
  },

三、完整代码

       具体完整代码链接:https://download.csdn.net/download/m0_60318025/87894106

目录
相关文章
|
1月前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
2月前
|
存储 自然语言处理 小程序
微信小程序多语言切换神器:简繁体切换功能完全指南
随着全球化的发展,支持多种语言的应用程序愈发重要。本文介绍了如何在微信小程序中实现简体与繁体字体之间的切换功能,以满足不同地区用户的需求。通过创建utils文件夹并编写相应的转换函数,开发者可以方便地实现语言切换,从而提升用户体验。文章中还附带了示例代码和效果图,帮助读者更好地理解和应用这一功能。
111 0
微信小程序多语言切换神器:简繁体切换功能完全指南
|
2月前
|
前端开发 小程序 JavaScript
小程序 canvas 生成海报 一次搞掂
小程序 canvas 生成海报 一次搞掂
32 1
|
2月前
|
小程序 Linux Python
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
25 1
|
3月前
|
算法 JavaScript 前端开发
切西瓜法实现微信抢红包功能
该文章介绍了使用“切西瓜法”和“栅栏法”两种算法来模拟微信抢红包的随机分配机制,并通过具体的JavaScript代码实现了红包金额的公平随机分配过程。
切西瓜法实现微信抢红包功能
|
2月前
|
前端开发 小程序 JavaScript
微信小程序 canvas 备忘
微信小程序 canvas 备忘
39 0
|
3月前
|
人工智能 前端开发 JavaScript
MacTalk 测评通义灵码,实现“微信表情”小功能
墨问西东创始人池建强分享了团队使用通义灵码的经验。
|
3月前
|
小程序 API 开发工具
使用python 实现微信签到提醒功能
【9月更文挑战第4天】使用python 实现微信签到提醒功能
82 2
|
4月前
|
Web App开发 缓存 小程序
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
【Azure API 管理】从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能
|
4月前
|
小程序 前端开发 开发者