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


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 相关文章推荐
Prototype Template对象 学习
Jul 19 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
Jun 11 Javascript
理解jQuery stop()方法
Nov 21 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
Dec 04 Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 Javascript
AngularJS自定义指令之复制指令实现方法
May 18 Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 Javascript
使用react render props实现倒计时的示例代码
Dec 06 Javascript
vue+高德地图写地图选址组件的方法
May 18 Javascript
通过实践编写优雅的JavaScript代码
May 30 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 mkdir()定义和用法
2009/01/14 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
javascript计时器事件使用详解
2014/01/07 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
JS高级运动实例分析
2016/12/20 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python smallseg分词用法实例分析
2015/05/28 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Python编程中类与类的关系详解
2019/08/08 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
运动会跳远加油稿
2014/02/20 职场文书
《匆匆》教学反思
2014/02/22 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
Python的这些库,你知道多少?
2021/06/09 Python