微信小程序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 相关文章推荐
javascript 常用方法总结
Jun 03 Javascript
JS this作用域以及GET传输值过长的问题解决方法
Aug 06 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
使用jQuery仿苹果官网焦点图特效
Dec 23 Javascript
JQuery记住用户名密码实现下次自动登录功能
Apr 27 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
使用JavaScript获取Request中参数的值方法
Sep 27 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
Mar 24 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
Sep 02 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 Javascript
JS前端监控采集用户行为的N种姿势
Jul 23 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
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
js 事件小结 表格区别
2007/08/13 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
小程序的上传文件接口的注意要点解析
2019/09/17 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
浅析Python 序列化与反序列化
2020/08/05 Python
Python内置函数property()如何使用
2020/09/01 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
Solaris操作系统的线程机制
2012/12/23 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
英文留学推荐信范文
2014/01/25 职场文书
数学教研活动总结
2014/07/02 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
早读课迟到检讨书
2014/09/25 职场文书
优秀校长事迹材料
2014/12/24 职场文书
联村联户简报
2015/07/21 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js