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


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 相关文章推荐
asp 的 分词实现代码
May 24 Javascript
Javascript学习笔记5 类和对象
Jan 11 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
适用于手机端的jQuery图片滑块动画
Dec 09 Javascript
Vue实现双向绑定的方法
Dec 22 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
Jun 25 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
Vue Echarts实现可视化世界地图代码实例
May 07 Javascript
vue Element左侧无限级菜单实现
Jun 10 Javascript
vue中使用echarts的示例
Jan 03 Vue.js
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
基于mysql的bbs设计(三)
2006/10/09 PHP
测试您的 PHP 水平的题目
2007/05/30 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
php魔术变量用法实例详解
2014/11/13 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
常用的javascript function代码
2008/05/23 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
python三元运算符实现方法
2013/12/17 Python
python 定时修改数据库的示例代码
2018/04/08 Python
pytorch 预训练层的使用方法
2019/08/20 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
Python通过socketserver处理多个链接
2020/03/18 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
2014年幼儿园植树节活动方案
2014/03/02 职场文书
公益广告标语
2014/06/19 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书