微信小程序使用canvas自适应屏幕画海报并保存图片功能


Posted in Javascript onJuly 25, 2019

小程序canvas的API并没有像其他的一样支持小程序独有的 rpx 自适应尺寸单位,在绘制内容时所应用的单位仍然是 px,那么如何实现不同尺寸屏幕的自适应呢?

我们的在开发中常用的参考屏幕尺寸(iPhone6)为:375*667;

那么想要适应其他尺寸的屏幕时只需按照iPhone6的绘制大小按比例进行换算即可:

获取系统屏幕尺寸

先利用wx.getSystemInfo (获取系统信息)的API获取屏幕宽度,然后除iPhone6的屏幕宽度,即可得到相对单位

// 在onLoad中调用
const that = this
wx.getSystemInfo({
 success: function (res) {
  console.log(res)
  that.setData({
   model: res.model,
   screen_width: res.windowWidth/375,
   screen_height: res.windowHeight
  })
 }
})

在绘制方法中将参数乘以相对单位即可实现自适应

这里的rpx是相对不同屏幕宽度的相对单位,测量出得实际宽度,就是实际测出的px像素值*rpx就可以了;之后无论实在iPhone5,iPhone6,iPhone7...都可以进行自适应。

这里的html也要动态的设置宽和高

<canvas canvas-id="PosterCanvas" style="width:{{screen_width*375+'px'}}; height:{{screen_height*1.21+'px'}}"></canvas>
drawPoster(){
  let ctx = wx.createCanvasContext('PosterCanvas'),that=this.data;
  console.log('手机型号' + that.model,'宽'+that.screen_width*375,'高'+ that.screen_height)
  let rpx = that.screen_width
  //这里的rpx是相对不同屏幕宽度的相对单位,实际的宽度测量,就是实际测出的px像素值*rpx就可以了;之后无论实在iPhone5,iPhone6,iPhone7...都可以进行自适应。
  ctx.setFillStyle('#1A1A1A')
  ctx.fillRect(0, 0, rpx * 375, that.screen_height * 1.21)
  ctx.fillStyle = "#E8CDAA";
  ctx.setFontSize(29*rpx)
  ctx.font = 'normal 400 Source Han Sans CN';
  ctx.fillText('Hi 朋友', 133*rpx,66*rpx)
  ctx.fillText('先领礼品再买车', 84*rpx, 119*rpx)
  ctx.drawImage('../../img/sell_index5.png', 26*rpx, 185*rpx, 324*rpx, 314*rpx)
  ctx.drawImage('../../img/post_car2x.png', 66 * rpx, 222 * rpx, 243 * rpx, 145 * rpx)
  ctx.setFontSize(16*rpx)
  ctx.font = 'normal 400 Source Han Sans CN';
  ctx.fillText('长按扫描获取更多优惠', 108*rpx, 545*rpx)
  ctx.drawImage('../../img/code_icon2x.png', 68 * rpx, 575 * rpx, 79 * rpx, 79 * rpx)
  ctx.drawImage('../../img/code2_icon2x.png', 229 * rpx, 575 * rpx, 79 * rpx, 79 * rpx)
  ctx.setStrokeStyle('#666666')
  ctx.setLineWidth(1*rpx)
  ctx.lineTo(187*rpx,602*rpx)
  ctx.lineTo(187*rpx, 630*rpx)
  ctx.stroke()
  ctx.fillStyle = "#fff"
  ctx.setFontSize(13 * rpx)
  ctx.fillText('xxx科技汽车销售公司', 119 * rpx, 663 * rpx)
  ctx.fillStyle = "#666666"
  ctx.fillText('朝阳区·望京xxx科技大厦', 109 * rpx, 689 * rpx)
  ctx.setFillStyle('#fff')
  ctx.draw()
 },

保存到相册

很简单就是在画完图片之后的draw回调函数里调用canvasToTempFilePath()生产一个零时内存里的链接,然后在调用saveImageToPhotosAlbum()就可以了;其中牵扯到授权,如果你第一次拒绝了授权,你第二次进入的时候在iphone手机上是不会再次提醒你授权的,这时就需要你手动调用了;以下附上代码!

ctx.draw(true, ()=>{
    // console.log('画完了')
    wx.canvasToTempFilePath()({
     x: 0,
     y: 0,
     width: rpx * 375,
     height: that.screen_height * 1.21,
     canvasId: 'PosterCanvas',
     success: function (res) {
      // console.log(res.tempFilePath);
      wx.saveImageToPhotosAlbum({
       filePath: res.tempFilePath,
       success: (res) => {
        console.log(res)
       },
       fail: (err) => { }
      })

     }
    }) 
   })

拒绝授权后再次提醒授权的代码

mpvue.saveImageToPhotosAlbum({
    filePath: __path,
    success(res) {
     mpvue.showToast({
     title: '保存成功',
     icon: 'success',
     duration: 800,
     mask:true
     });
     },
    fail(res) {
      if (res.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || res.errMsg === "saveImageToPhotosAlbum:fail auth deny" || res.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {

     mpvue.showModal({
        title: '提示',
        content: '需要您授权保存相册',
        showCancel: false,
        success:modalSuccess=>{
         mpvue.openSetting({
          success(settingdata) {
           // console.log("settingdata", settingdata)
           if (settingdata.authSetting['scope.writePhotosAlbum']) {
            mpvue.showModal({
             title: '提示',
             content: '获取权限成功,再次点击图片即可保存',
             showCancel: false,
            })
           } else {
            mpvue.showModal({
             title: '提示',
             content: '获取权限失败,将无法保存到相册哦~',
             showCancel: false,
            })
           }
          },
          fail(failData) {
           console.log("failData",failData)
          },
          complete(finishData) {
           console.log("finishData", finishData)
          }
         })
        }
       })
     }
     }
   });

总结

以上所述是小编给大家介绍的微信小程序使用canvas自适应屏幕画海报并保存图片功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 点击整页变灰的效果(可做退出效果)。
Jan 09 Javascript
javascript cookie解码函数(兼容ff)
Mar 17 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
Jul 31 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
jquery统计用户选中的复选框的个数
Jun 06 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
五种js判断是否为整数类型方式
Dec 03 Javascript
AngularJS入门教程之ng-class 指令用法
Aug 01 Javascript
bootstrapfileinput实现文件自动上传
Nov 08 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
Dec 19 Javascript
微信小程序 setData 对 data数据影响问题
Apr 18 Javascript
微信小程序实现动态列表项的顺序加载动画
Jul 25 #Javascript
JS查找孩子节点简单示例
Jul 25 #Javascript
微信小程序自定义单项选择器样式
Jul 25 #Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 #Javascript
微信小程序实现原生步骤条
Jul 25 #Javascript
微信小程序与公众号卡券/会员打通的问题
Jul 25 #Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 #Javascript
You might like
php字符串截取问题
2006/11/28 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
php远程下载类分享
2016/04/13 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
Python简明入门教程
2015/08/04 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
人力资源管理专业学生自我评价
2013/11/20 职场文书
日语求职信范文
2013/12/17 职场文书
爱我中华教学反思
2014/04/28 职场文书
爱之链教学反思
2014/04/30 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
学校远程教育工作总结
2015/08/11 职场文书
高中政治教学反思
2016/02/23 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers