微信小程序canvas.drawImage完全显示图片问题的解决


Posted in Javascript onNovember 30, 2018

问题描述

问题产生

对于微信小程序,canvas处理过程中,dramImage默认图片引用是有残缺的

导入初始项目

打开链接(原官网例子),浏览器唤醒微信开发这工具,打开连接之前需要下载好微信开发者工具,如已安装则直接唤起,没有则会提示下载

目的

通过对canvas绘图过程的修改,或者其样式的修改,达到完全显示,并自适应不同机型的目的

解决方案

准备工作

Page({
 data:{
  imgSrc: '', // 需要处理图片地址
  imgW: '', // canvas 宽度
  imgH: '', // canvas 高度
  byclear: 1 // 比例,这里将iphon6- 375像素设置为1标准,以便在自适应上的转换
 },
 onReady() {
 var that = this
 // 根据屏幕的宽度计算标准比例值。这里讲375作为标准值
 wx.getSystemInfo({
  success: function(res) {
  let byclear = res.screenWidth / 375
  that.setData({
   byclear
  })
  },
 })
 },
 openAndDraw() { // 选择图片
 var that = this
 wx.chooseImage({
  success: (res) => {
  that.setData({
   imgSrc: res.tempFilePaths[0],
   res
  })
  }
 })
 },
 checkwh(e) {
 // 处理逻辑
 }
 })

获取选择目标图片的宽高度~

默认canvas 是无法获取图片的高度的,再者小程序里面没有 new Image()这个方法,只能通过标签组件image间接获取,所以我们需要在wxml中插入一个隐藏的标签image,隐藏方法我们设置display:none 或者hidden就可以了,注意不要wx:if, wx:if 不会触发bindload事件。

<image src="{{imgSrc}}" bindload='checkwh' mode='widthFix' hidden/>
<canvas canvas-id="canvasIn" class="canvas"></canvas>

在方法checkwh里面即可获取到图片宽高

checkwh(e){
  // 实际宽度 e.detail.width 高度 e.detail.height
  let whsrc = e.detail.height / e.detail.width
  // 计算高宽,需要处理图片宽度小于屏幕宽度的时候 对应的canvas比例
  
 }

canvas.scale 方案

dramImage 绘图方法,我们可以通过对画布的放大缩小scale来完整绘制,继续在checkwh中进行处理.scale缩放比例很简单,我们只要计算出屏幕与图片的实际比例,对应缩小就可。即:375 * byclear / e.detail.width 这里要带上自适应比例,当然对于图片宽度小于屏幕的我们不做缩放处理

checkwh(e){
  // 实际宽度 e.detail.width 高度 e.detail.height
 let whsrc = e.detail.height / e.detail.width
  // 计算高宽,需要处理图片宽度大于屏幕宽度的时候 对应的canvas比例
 let res = this.data.res 
 let byclear = this.data.byclear
 const ctx = wx.createCanvasContext('canvasIn', this);
 // 对画布进行缩放,注意scale两个参数保持一致,即缩放比例都是一样的。保证宽高比一致
 if (e.detail.width > 375 * byclear) ctx.scale(375 * byclear / e.detail.width, 375 * byclear / e.detail.width);
 ctx.drawImage(res.tempFilePaths[0], 0, 0, e.detail.width, e.detail.height)
 ctx.draw()
 // 后续操作
 }

上面我们已经完整的将图片绘制到canvas中了,还不够,下面我们将设置设置canvas宽高大小,已达到完全展示

<canvas canvas-id="canvasIn" class="canvas" style="width:{{imgW}}rpx;height:{{imgH}}rpx;margin:0 auto;"></canvas>

微信自适应单位是rpx,对于iphone 6 ,375px = 750rpx => 1px = 2rpx; 其他型号计算是带上比例byclear即可,然后图片小于屏幕宽度,不做处理,checkwh后续代码

因此:

checkwh(e){
 // 前面代码...
  this.setData({
  imgW: e.detail.width > 375 ? 750 : e.detail.width * 2 / byclear,
  imgH: e.detail.width > 375 ? 750 * whsrc : e.detail.height * 2 / byclear
  })
 }

canvas 缩放 zoom 方案

zoom方案对比scale方案,比较好的地方在于,不用计算canvas的大小,也不用缩放比例,直接将原图的宽高设置成canvas的宽高,然后,通过zoom对canvas进行缩放,直接放代码额,这里的缩放比例,即为 图片宽度 / 750,注意这里不需要比例计算,css样式会自动进行样式比率计算

关键wxml代码

<canvas canvas-id="canvasIn" class="canvas" style="width:{{imgW}}rpx;height:{{imgH}}rpx;margin:0 auto;zoom:{{imgW > 750 ? 750 / imgW : 1}}"></canvas>

关键js代码

checkwh(e){
 var vhsrc = e.detail.height / e.detail.width
 let res = this.data.res
 let byclear = this.data.byclear
 const ctx = wx.createCanvasContext('canvasIn', this);
 ctx.drawImage(res.tempFilePaths[0], 0, 0, e.detail.width, e.detail.height)
 ctx.draw()
 this.setData({
  imgW: e.detail.width * 2 / byclear,
  imgH: e.detail.height * 2 / byclear
 })
 },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Dom操作之兼容技巧分享
Sep 20 Javascript
JQuery入门——事件切换之hover()方法应用介绍
Feb 05 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
node.js中的fs.lchown方法使用说明
Dec 16 Javascript
js为什么不能正确处理小数运算?
Dec 29 Javascript
JavaScript表单验证实例之验证表单项是否为空
Jan 10 Javascript
微信小程序 支付功能实现PHP实例详解
May 12 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
Aug 02 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
Sep 13 Javascript
详解小程序设置缓存并且不覆盖原有数据
Apr 15 Javascript
微信小程序中使用vant框架的具体步骤
Feb 18 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
Nov 30 #Javascript
微信小程序实现保存图片到相册功能
Nov 30 #Javascript
js canvas实现写字动画效果
Nov 30 #Javascript
webpack打包多页面的方法
Nov 30 #Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
Nov 30 #Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
Nov 30 #Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 #Javascript
You might like
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
理解JavaScript原型链
2016/10/25 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
Python中的匿名函数使用简介
2015/04/27 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
代码分析Python地图坐标转换
2018/02/08 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
docker-py 用Python调用Docker接口的方法
2019/08/30 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
如何在Python对Excel进行读取
2020/06/04 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
新浪网技术部笔试题
2016/08/26 面试题
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
升学宴学生答谢词
2015/01/05 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书