小程序图片剪裁加旋转的示例代码


Posted in Javascript onJuly 10, 2018

一个微信小程序图片剪裁组件,可以通过手势控制旋转缩放移动,也可以点击旋转进行90度旋转,先看下效果(视屏不知道为啥用不了,上个压缩过度的GIF先):

小程序图片剪裁加旋转的示例代码

图片剪裁毫无疑问用的是canvas,但是开发过小程序的同学应该了解小程序canvas的一些坑。比如小程序canvas的设定了画布的大小后不能像web的canvas那样通过css样式来调整画布在手机上显示的大小、还有canvas不能设置太大因为可能会在某些安卓机上导致小程序崩溃、canvas绘制过大的图片会让小程序变得非常卡顿等等。

网上能找到的图片剪裁框架大多采用在canvas上面直接绘制图片,然后通过监听canvas上的用户手势来控制图片移动旋转等,这样截出来的图片会出现模糊的问题,因为canvas的太小了。一种解决方法是,在页面上再放置一个隐藏的canvas大小设为原来的两倍或者再大一点也行用来作为实际剪裁图片的canvas,当然剪裁数据都是从第一个canvas那里来的。但是这样还是有些小问题,就是canvas绘制大的图片会出现卡顿的问题,这种方案在监听用户手势的变化的时候要不停的重新绘制canvas,卡顿变得更加严重,体验非常不好。

基于上面原因,我采用的是view里面放置图片,监听view上面的手势,通过css样式控制图片的旋转、缩放和移动,最后剪裁用隐藏的canvas。先看下页面布局:

<view class="container">
 <!-- 剪裁框与初始图片,剪裁框监听用户手势,获取移动缩放旋转值,images通过css样式显示变化 -->
 <view class="img" style="width:{{ width }}px; height:{{height}}px" catchtouchstart="touchstartCallback" catchtouchmove="touchmoveCallback" catchtouchend="touchendCallback" >
  <image style="transform: translate({{stv.offsetX}}px, {{stv.offsetY}}px) scale({{stv.scale}}) rotate({{ stv.rotate }}deg);width:{{originImg.width}}px; height: {{originImg.height}}px" src="{{ originImg.url }}"></image>
 </view>
 <view class='footer'>
   <view bindtap='uploadTap'>选择图片</view> 
   <view bindtap='rotate'>旋转</view>
   <view bindtap='cropperImg'>剪裁</view>
 </view>

 <!-- canvas长宽设为初始图片设置的长款的两倍,使剪裁得到的图片更清晰,也不至于过大 -->
 <canvas class='imgcrop' style="width:{{ width * 2 }}px;height:{{ height * 2}}px;" canvas-id='imgcrop'></canvas>
</view>

最重要的操作是图片在view中的位置变化如何在canvas中保持一致再剪裁出来,图片相对与view中的左上角坐标、图片的长度和宽度我们都是知道的,还有旋转值通过用户手势变化计算出来,旋转的时候将画布的中心移动到图片的中心点再旋转就行了。

let ctx = wx.createCanvasContext('imgcrop',this);
   let cropData = _this.data.stv;
   ctx.save();
   // 缩放偏移值
   let x = (_this.data.originImg.width - _this.data.originImg.width * cropData.scale) / 2;
   let y = (_this.data.originImg.height - _this.data.originImg.height * cropData.scale) / 2;

   //画布中点坐标转移到图片中心
   let movex = (cropData.offsetX + x) * 2 + _this.data.originImg.width * cropData.scale;
   let movey = (cropData.offsetY + y) * 2 + _this.data.originImg.height * cropData.scale;
   ctx.translate(movex, movey);
   ctx.rotate(cropData.rotate * Math.PI / 180);
   ctx.translate(-movex, -movey);
   
   ctx.drawImage(_this.data.originImg.url, (cropData.offsetX + x) * 2, (cropData.offsetY + y) * 2, _this.data.originImg.width * 2 * cropData.scale, _this.data.originImg.height * 2 * cropData.scale);
   ctx.restore();

查看完整代码请移步到:https://github.com/yuanwyj/Mini-Program-cropper, 喜欢的画点个start~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javaScript 数值型和字符串型之间的转换
Jul 25 Javascript
jQuery的$.proxy()应用示例介绍
Apr 03 Javascript
jquery获取radio值(单选组radio)
Oct 16 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
AngularJS 应用身份认证的技巧总结
Nov 07 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
Mar 27 Javascript
vue + element-ui实现简洁的导入导出功能
Dec 22 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
浅谈Express.js解析Post数据类型的正确姿势
May 30 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
Oct 22 Javascript
Vue绑定用户接口实现代码示例
Nov 04 Javascript
vue使用中的内存泄漏【推荐】
Jul 10 #Javascript
Vue脚手架的简单使用实例
Jul 10 #Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
Jul 10 #Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 #Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 #Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 #Javascript
ng-alain表单使用方式详解
Jul 10 #Javascript
You might like
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
校园新闻广播稿
2014/01/10 职场文书
操行评语大全
2014/04/30 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
作风建设年度心得体会
2014/10/29 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
教师求职信怎么写
2015/03/20 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
Elasticsearch 数据类型及管理
2022/04/19 Python