微信小程序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 相关文章推荐
greybox——不开新窗口看新的网页
Feb 20 Javascript
javascript 程序库的比较(一)之DOM功能
Apr 07 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
Jan 17 Javascript
js鼠标及对象坐标控制属性详细解析
Dec 14 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
Dec 09 Javascript
学JavaScript七大注意事项【必看】
May 04 Javascript
Vue实现百度下拉提示搜索功能
Jun 21 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
vue父组件中获取子组件中的数据(实例讲解)
Sep 27 Javascript
vue-cli如何引入bootstrap工具的方法
Oct 19 Javascript
vue中的适配px2rem示例代码
Nov 19 Javascript
vue中多路由表头吸顶实现的几种布局方式
Apr 12 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
中国收音机工业发展史
2021/03/02 无线电
PHP数组及条件,循环语句学习
2012/11/11 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php获取文件大小的方法
2014/02/26 PHP
php实现paypal 授权登录
2015/05/28 PHP
详谈PHP编码转换问题
2015/07/28 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
使用Python脚本操作MongoDB的教程
2015/04/16 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
python友情链接检查方法
2015/07/08 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
Python 防止死锁的方法
2020/07/29 Python
Django静态文件加载失败解决方案
2020/08/26 Python
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
职业生涯规划书前言
2014/04/15 职场文书
干部个人对照检查材料
2014/08/25 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
教师岗位职责
2015/02/03 职场文书
红色影片观后感
2015/06/18 职场文书