大多数图片都大小不一,选择框的尺寸也是宽高相等的,就会有图片被压缩

解决方法:

1.可以使用画布对图片先进行截取,保存截取图片(用户自己选取,或者指定图片中心区域截取),但是对于多张图片手动截取,会影响体验

2.保证图片完整性,使用image组件的mode属性,可以设置图片裁剪、缩放的模式,点击图片查看之后才会看到整张图片,默认为scaleToFill,但就像上面说的一样,图片会被压缩,但我们只需要显示图片的中心区域,使用aspectFill,图片就会取到中心位置 

 官方是这样描述的:

 我用的是第二种方法,项目图片中设置这样一个属性就可以了,但是要在画布上显示图片中心位置,就要对图片进行截取了

 查了一下,正好官方也给出了drawImage的介绍,正好有几个图片截取的属性值 

 有三个版本的写法:

  • drawImage(dx, dy)
  • drawImage(dx, dy, dWidth, dHeight)
  • drawImage(sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) 从 1.9.0 起支持 

 sx : 源图像的矩形选择框的左上角 x 坐标

 sy : 源图像的矩形选择框的左上角 y 坐标

sWidth : 源图像的矩形选择框的宽度

sHeight : 源图像的矩形选择框的高度

 第一种情况(画布的宽度大于高度)

  横图(上面是画布截取的,下面是图片属性mode=aspectFill生成的)       竖图   

                             

 第二种情况(画布的宽度小于高度)

  横图                                    竖图

                                      

  

 第三种情况(宽高相等)

  横图                                    竖图

                                

  以上就是对图片属性值aspectFill的实现

  

<view class='center colu'>
<canvas style='width:{{canvas_width}}px;height:{{canvas_height}}px' canvas-id='my_canvas'></canvas>
<image mode='aspectFill' style='width:{{canvas_width}}px;height:{{canvas_height}}px;margin-top:10px' src='{{img}}'></image>
</view>
Page({

  /**
* 页面的初始数据
*/
data: {
canvas_width: 200,
canvas_height: 300,
img: '../../images/zly.JPG'
},
onLoad() {
this.canvas();
},
canvas() {
var ctx = wx.createCanvasContext('my_canvas', this)
var canvas_width = this.data.canvas_width,
canvas_height = this.data.canvas_height;
var img = this.data.img;
wx.getImageInfo({
src: img,
success(res) {
console.log(res.width, res.height); var img_width = res.width,
img_height = res.height; var clip_left, clip_top, //左偏移值,上偏移值,
clip_width, clip_height; //截取宽度,截取高度 clip_height = img_width * (canvas_height / canvas_width);
if (clip_height > img_height) {
clip_height = img_height;
clip_width = clip_height * (canvas_width / canvas_height);
clip_left = (img_width - clip_width) / 2;
clip_top = 0;
} else {
clip_left = 0;
clip_top = (img_height - clip_height) / 2;
clip_width = img_width
} var data = {
clip_left,
clip_top,
clip_width,
clip_height
} ctx.drawImage(img, clip_left, clip_top, clip_width, clip_height, 0, 0, canvas_width, canvas_height);
ctx.draw();
}
})
}
})

           

       

     

                

              

微信小程序 画布drawImage实现图片截取的更多相关文章

  1. 微信小程序:本地资源图片无法通过 WXSS 获取,可以使用网络图片或者 base64或者使用image标签

    微信小程序:本地资源图片无法通过 WXSS 获取,可以使用网络图片或者 base64或者使用image标签 一.问题 报错信息: VM696:2 pages/user/user.wxss 中的本地资源 ...

  2. 微信小程序-显示外链图片 bug

    微信小程序-显示外链图片 bug 显示外链图片 bug 403 bug 禁止外链,未授权 https://httpstatuses.com/403 image component 图片.支持 JPG. ...

  3. (干货)微信小程序之上传图片和图片预览

    这几天一直负责做微信小程序这一块,也可以说是边做边学习吧,把自己做的微信小程序的一些功能分享出来,与大家探讨一下,相互学习相互进步. 先看下效果图 只写了一下效果样式的话希望大家不要太在意,下面马路杀 ...

  4. 微信小程序开发之多图片上传+服务端接收

    前言: 业务需求,这次需要做一个小程序同时选中三张图片一起上传到服务端,后端使用的.NET WEBAPI接收数据保存. 使用技术: 在这章中将会使用到微信小程序wx.uploadFile(Object ...

  5. 微信小程序--地图上添加图片

    如何在微信小程序地图添加上,添加图片? 在微信小程序中,地图的层级最高,所以我们没有办法,通过定位,在地图上添加图片等信息; 处理办法: 添加控件:controls; 其中有个属性position,进 ...

  6. 转:【微信小程序】 微信小程序-拍照或选择图片并上传文件

    调用拍照API:https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-picture.html?t=20161222#wxchooseimageobj ...

  7. 微信小程序使用canvas绘制图片的注意事项

    1.单位换算问题,canvas的尺寸单位是px,所以单位需要做个换算,可以通过wx.getSystemInfo获取屏幕宽高(单位是px),微信小程序无论什么机型,屏幕宽度都是750rpx,因此可以做个 ...

  8. 微信小程序 客服自动回复图片

    产品需求是,在客服对话框里,发送特定的文字,回复我们的二维码: 小城程开发完成后,这个自动回复图片的功能就摆在了眼前.刚开始我们想到的是:在线客服功能的设置里设置好自动回复的图片,但是目前设置不支持自 ...

  9. 微信小程序之上传图片和图片预览

    这几天一直负责做微信小程序这一块,也可以说是边做边学习吧,把自己做的微信小程序的一些功能分享出来,与大家探讨一下,相互学习相互进步. 先看下效果图 只写了一下效果样式的话希望大家不要太在意,下面马路杀 ...

随机推荐

  1. 通过 ssh 建立本地与 github 的连接

    查看 ssh key cd ~/.ssh cat 名字.pub 如果本地没有 ssh key,则新建 ssh-keygen -t rsa -C "mobro_chu@163.com" ...

  2. C语言多种方法求解字符串编辑距离问题的代码

    把做工程过程经常用的内容记录起来,如下内容段是关于C语言多种方法求解字符串编辑距离问题的内容. { if(xbeg > xend) { if(ybeg > yend) return 0; ...

  3. MySQL 列出存储过程

    MySQL  列出存储过程 接下来介绍如何列出MySQL数据库中的所有存储过程,并显示存储过程源代码的一些非常有用的语句. MySQL为提供了一些有用的语句,可以更有效地管理存储过程.这些语句包括列出 ...

  4. Spring Boot 返回 JSON 数据,一分钟搞定!

    如何返回 JSON 数据? 在 Spring Boot 中返回 JSON 数据很简单,如下几步. 加入依赖 12345678910 <parent> <groupId>org. ...

  5. vue日历控件,自定义选择年月 选择年月日 选择年月日时 选择年月日时分,自定义日期范围

    下载地址:https://pan.baidu.com/s/1iEZl4kDkEg4ybwqc7aI7vQ 注:功能更加全面的日历控件请访问:https://www.cnblogs.com/mrzhu/ ...

  6. jieba库初级应用

    1.jieba库基本介绍 (1).jieba库概述 jieba是优秀的中文分词第三方库 - 中文文本需要通过分词获得单个的词语         - jieba是优秀的中文分词第三方库,需要额外安装 - ...

  7. 基于iview 封装一个vue 表格分页组件

    iview 是一个支持中大型项目的后台管理系统ui组件库,相对于一个后台管理系统的表格来说分页十分常见的 iview是一个基于vue的ui组件库,其中的iview-admin是一个已经为我们搭好的后天 ...

  8. antd按需加载,配置babel-plugin-import插件,编译后报错.bezierEasingMixin()解决方案

    报错如下: ./node_modules/antd/lib/button/style/index.less (./node_modules/css-loader??ref--6-oneOf-7-1!. ...

  9. python之asyncio三种应用方法

    1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...

  10. C# 异步(上)

    新进阶的程序员可能对async.await用得比较多,却对之前的异步了解甚少.本人就是此类,因此打算回顾学习下异步的进化史. 本文主要是回顾async异步模式之前的异步,下篇文章再来重点分析async ...