基于微信小程序实现透明背景人像分割功能

作者:摔跤猫子 时间:2024-06-05 09:34:50 

一、文章前言

此文主要实现识别人体的轮廓范围,与背景进行分离并保存效果图,适用于拍照背景替换及透明背景的人像图(png格式)转换。

基于微信小程序实现透明背景人像分割功能

基于微信小程序实现透明背景人像分割功能

基于微信小程序实现透明背景人像分割功能

二、具体流程及准备

2.1、注册百度开放平台及微信公众平台账号。
2.2、下载及安装微信Web开发者工具。
2.3、如需通过SDK调用及需准备对应语言的开发工具。

基于微信小程序实现透明背景人像分割功能

三、开发步骤

2.1、打开微信开发者工具,新建项目,选择不使用模板、不使用云服务。

基于微信小程序实现透明背景人像分割功能

2.2、在pages文件夹下面创建一个文件夹并新建对应的page文件。

基于微信小程序实现透明背景人像分割功能

2.3、在js的onLoad事件中请求获取Token的接口,将接口返回access_token存储到该页的变量当中,用于后续请求图像分割的接口凭证。ApiKey和SecretKey建议密文保存。

/**
  * 生命周期函数--监听页面加载
  */
 onLoad(options) {
   let that = this;
   let ApiKey='';
   let SecretKey='';
   wx.request({
     url: 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ApiKey+'&client_secret='+SecretKey,
     method: 'POST',
     success: function (res) {
       that.setData({
         AccessToken:res.data.access_token
       });
     }
   });
 },

2.4、随后在wxml和js中实现对应的选择图片及转换base64的功能效果。

<view class="containerBox">
 <view class="leftBtn" bindtap="loadImage">上传图片</view>
 <view class="rightBtn" bindtap="identify">图像转换</view>
</view>
<view >
 <image src="{{choiceImg}}" class="showImg"></image>
 <image src="data:image/png;base64,{{imgBase64}}" class="showImg"></image>
</view>
let that = this;
   wx.chooseImage({
     success: function (res) {
       that.choiceImg = res.tempFilePaths[0];
       wx.getFileSystemManager().readFile({
         filePath:res.tempFilePaths[0],
         encoding:'base64',
         success(data){
           let baseData = data.data;
           that.setData({
             choiceImg: res.tempFilePaths[0],
             baseData:baseData
           })
         }
       });
     }
   });

2.5、给图像转换按钮对应的响应事件中绑定开放平台接口,将参数进行拼接传递。

基于微信小程序实现透明背景人像分割功能

let that = this;
   wx.request({
     url: 'https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg?access_token=' + that.data.AccessToken,
     method: 'POST',
     header: {
       'content-type': 'application/x-www-form-urlencoded'
     },
     data:{
       image:that.data.baseData
     },
     success: function (identify) {
       that.setData({
         imgBase64: identify.data.foreground
     })
     }
   })

2.6、根据接口返回的数据来看,我们先取foreground也就是分割后的人像前景抠图进行展示。

基于微信小程序实现透明背景人像分割功能

2.7、能够成功将解析后的图片进行展示后,我们将返回的base64格式的图片进行处理然后保存到本地,就可以得到一个透明背景的png,我们可以自己对这个图片进行上色、PS等操作。

//获取文件管理器对象
   const fs = wx.getFileSystemManager()
   //文件保存路径
   const Imgpath = wx.env.USER_DATA_PATH + '/qrcodeImg' + '.png'
   //base64图片文件
   let imageSrc = this.data.imgBase64.replace(/^data:image\/\w+;base64,/, '')
   //写入本地文件
   fs.writeFile({
     filePath: Imgpath,
     data: imageSrc,
     encoding: 'base64',
     success(res) {
       //保存到手机相册
       wx.saveImageToPhotosAlbum({
         filePath: Imgpath,
         success(res) {
           wx.showToast({
             title: '保存成功',
             icon: 'success'
           })
         },
         fail: function(err) {
         }
       })
     }
   })

基于微信小程序实现透明背景人像分割功能

四、完整代码

<!--index.wxml-->
<view class="containerBox">
 <view class="leftBtn" bindtap="loadImage">上传图片</view>
 <view class="rightBtn" bindtap="identify">图像转换</view>
</view>
<view >
 <image src="{{choiceImg}}" class="showImg"></image>
 <image src="data:image/png;base64,{{imgBase64}}" class="showImg"></image>
</view>
<view class="saveBtn" bindtap="saveBtn">保存图片</view>
<!--index.wxss-->
.containerBox{
 width:750rpx;
 display:flex;
 height:62rpx;
 margin-top:20rpx;
}
.leftBtn{
 width:181rpx;
 height:62rpx;
 color:#4FAFF2;
 border:1rpx solid #4FAFF2;
 border-radius:10rpx;
 text-align: center;
 line-height:62rpx;
 font-size:28rpx;
 margin-left: 158rpx;
}
.rightBtn{
 width:181rpx;
 height:62rpx;
 color:white;
 border:1rpx solid #4FAFF2;
 border-radius:10rpx;
 text-align: center;
 line-height:62rpx;
 font-size:28rpx;
 margin-left: 73rpx;
 background:#4FAFF2;
}
.showImg{
 width:415rpx;
 height:415rpx;
 margin-left:167rpx;
 margin-top:25rpx;
 border-radius:20rpx;
}
.result{
 margin-top:20rpx;
}
.resultTitle{
 margin-left:75rpx;
}
.productTableTr{
 height: 80rpx;line-height: 80rpx;border-bottom: 1rpx solid #F8F8F8;display:flex;
}
.leftTr{
 width: 283rpx;height: 80rpx;line-height: 80rpx;
}
.rightTr{
 width: 419rpx;height: 80rpx;line-height: 80rpx;color: #FF2525;font-size: 26rpx;
}
.leftTrText{
 color: #2B79F5;font-size: 28rpx;margin-left: 15rpx;width: 283rpx;
}
.productDetailTable{
 width: 702rpx;margin-left: 24rpx;border:1rpx solid #F8F8F8;border-radius: 6rpx;
}
.saveBtn{
 width:181rpx;
 height:62rpx;
 color:white;
 border:1rpx solid #4FAFF2;
 border-radius:10rpx;
 text-align: center;
 line-height:62rpx;
 font-size:28rpx;
 margin-left: 284rpx;
 background:#4FAFF2;
 margin-top:20rpx;
}
identify(){
   let that = this;
   wx.request({
     url: 'https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg?access_token=' + that.data.AccessToken,
     method: 'POST',
     header: {
       'content-type': 'application/x-www-form-urlencoded'
     },
     data:{
       image:that.data.baseData
     },
     success: function (identify) {
       that.setData({
         imgBase64: identify.data.foreground
     })
     }
   })
 },
 saveBtn(){
   //获取文件管理器对象
   const fs = wx.getFileSystemManager()
   //文件保存路径
   const Imgpath = wx.env.USER_DATA_PATH + '/qrcodeImg' + '.png'
   //base64图片文件
   let imageSrc = this.data.imgBase64.replace(/^data:image\/\w+;base64,/, '')

//写入本地文件
   fs.writeFile({
     filePath: Imgpath,
     data: imageSrc,
     encoding: 'base64',
     success(res) {
       //保存到手机相册
       wx.saveImageToPhotosAlbum({
         filePath: Imgpath,
         success(res) {
           wx.showToast({
             title: '保存成功',
             icon: 'success'
           })
         },
         fail: function(err) {
         }
       })
     }
   })

},

来源:https://blog.csdn.net/weixin_42794881/article/details/127198801

标签:小程序,人像,分割
0
投稿

猜你喜欢

  • Django使用httpresponse返回用户头像实例代码

    2021-08-28 04:47:03
  • python处理xml文件操作详解

    2021-11-10 10:31:24
  • 在SQL触发器或存储过程中获取在程序登录的用户

    2024-01-29 09:30:40
  • TensorFlow实现保存训练模型为pd文件并恢复

    2021-03-01 05:45:27
  • 启动iis出现发生意外0x8ffe2740的解决方法

    2011-03-31 11:19:00
  • Python版中国省市经纬度

    2021-05-10 20:25:12
  • Python的装饰器使用详解

    2023-07-26 02:21:17
  • python爬虫筛选工作实例讲解

    2023-12-01 19:59:26
  • 纯ASP结合VML生成完美图-折线图

    2010-05-11 16:50:00
  • 解决Git推送错误non-fast-forward的方法

    2022-09-28 11:07:49
  • 解决TensorFlow训练模型及保存数量限制的问题

    2022-08-06 08:22:27
  • Python语言实现机器学习的K-近邻算法

    2023-04-25 02:09:58
  • 浅析Python数字类型和字符串类型的内置方法

    2022-06-16 12:57:24
  • 通过自学python能找到工作吗

    2021-07-24 04:26:33
  • 使用keras和tensorflow保存为可部署的pb格式

    2022-11-11 16:42:03
  • 发一个数字拼图网页游戏

    2008-10-12 10:02:00
  • tkinter禁用(只读)下拉列表Combobox问题

    2021-01-02 13:05:34
  • Mysql数据库事务的脏读幻读及不可重复读详解

    2024-01-16 04:27:20
  • 轻松读懂Golang中的数组和切片

    2024-02-07 16:25:48
  • 用python打印菱形的实操方法和代码

    2023-03-18 19:17:18
  • asp之家 网络编程 m.aspxhome.com