微信小程序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 终止函数执行操作
Feb 14 Javascript
AngularJS中使用HTML5手机摄像头拍照
Feb 22 Javascript
深入理解JavaScript 函数
Jun 06 Javascript
jQuery EasyUI开发技巧总结
Sep 26 jQuery
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
利用pm2部署多个node.js项目的配置教程
Oct 22 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 Javascript
使用validate.js实现表单数据提交前的验证方法
Sep 04 Javascript
javascript对HTML字符转义与反转义
Dec 13 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
Feb 27 Javascript
JavaScript实现队列结构过程
Dec 06 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
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
php上传文件的增强函数
2010/07/21 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
JS如何实现在弹出窗口中加载页面
2020/12/03 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
Python通过解析网页实现看报程序的方法
2014/08/04 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
生物技术专业求职信
2014/06/10 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
python读取mnist数据集方法案例详解
2021/09/04 Python
centos7安装mysql5.7经验记录
2022/05/02 Servers
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL
vscode内网访问服务器的方法
2022/06/28 Servers