微信小程序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 相关文章推荐
js 金额文本框实现代码
Feb 14 Javascript
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
node.js下LDAP查询实例分享
Sep 30 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
May 25 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
JavaScript中绑定事件的三种方式及去除绑定
Nov 05 Javascript
如何使用vuejs实现更好的Form validation?
Apr 07 Javascript
JS实现的全排列组合算法示例
Oct 09 Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 Javascript
jQuery实现动态生成年月日级联下拉列表示例
May 11 jQuery
swiper实现异形轮播效果
Nov 28 Javascript
angularjs模态框的使用代码实例
Dec 20 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巧获服务器端信息
2006/12/06 PHP
yii操作cookie实例简介
2014/07/09 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
Open and Print a Word Document
2007/06/15 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
JS利用prototype给类添加方法操作详解
2019/06/21 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
python第三方库学习笔记
2020/02/07 Python
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
直接有效的自我评价
2014/01/11 职场文书
文明寄语大全
2014/04/11 职场文书
市场营销工作计划书
2014/05/06 职场文书
婚纱店策划方案
2014/05/22 职场文书
企业总经理任命书
2014/06/05 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
迎新生晚会主持词
2015/06/30 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript
Python 匹配文本并在其上一行追加文本
2022/05/11 Python