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


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 的方法重载效果
Aug 07 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
Nov 14 Javascript
js中的屏蔽的使用示例
Jul 30 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
Jan 05 Javascript
js仿腾讯QQ的web登陆界面
Aug 19 Javascript
折叠菜单及选择器的运用
Feb 03 Javascript
利用JS实现scroll自定义滚动效果详解
Oct 17 Javascript
vue安装和使用scss及sass与scss的区别详解
Oct 15 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
elementUI同一页面展示多个Dialog的实现
Nov 19 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
PHP读取xml方法介绍
2013/01/12 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
PHP 断点续传实例详解
2017/11/11 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
Python 调用Java实例详解
2017/06/02 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
Oracle性能调优原则
2012/05/03 面试题
what is the difference between ext2 and ext3
2013/11/03 面试题
任课老师推荐信范文
2013/11/24 职场文书
服务承诺书范文
2014/05/19 职场文书
装修施工安全责任书
2014/07/24 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
爱国之歌(8首)
2019/09/29 职场文书
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python