微信小程序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 相关文章推荐
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
js动态设置鼠标事件示例代码
Oct 30 Javascript
利用JS进行图片的切换即特效展示图片
Dec 03 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
Feb 12 Javascript
JS实现根据用户输入分钟进行倒计时功能
Nov 14 Javascript
纯JS实现弹性导航条效果
Mar 06 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
May 03 Javascript
JavaScript事件对象event用法分析
Jul 27 Javascript
vue项目前端错误收集之sentry教程详解
May 27 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
React自定义hook的方法
Jun 25 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 无线电
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
php中使用url传递数组的方法
2015/02/11 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
vue中监听返回键问题
2019/08/28 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python的即时标记项目练习笔记
2014/09/18 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
Python实现注册、登录小程序功能
2018/09/21 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
对tensorflow中cifar-10文档的Read操作详解
2020/02/10 Python
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
大学毕业生自荐书怎么写?
2014/01/06 职场文书
白酒营销策划方案
2014/08/17 职场文书
银行实习推荐信
2015/03/27 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
Pandas 数据编码的十种方法
2022/04/20 Python