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


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 相关文章推荐
5个最佳的Javascript日期处理类库分享
Apr 15 Javascript
利用js 进行输入框自动匹配字符的小例子
Jun 29 Javascript
使用jQuery动态加载js脚本文件的方法
Apr 03 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
Jan 28 Javascript
全面了解javascript中的错误处理机制
Jul 18 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
原生JS实现圆环拖拽效果
Apr 07 Javascript
js简单实现网页换肤功能
Apr 07 Javascript
JavaScript实现简单的文本逐字打印效果示例
Apr 12 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
Javascript异步编程async实现过程详解
Apr 02 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
ecshop实现smtp发送邮件
2015/02/03 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
Bootstrap基本插件学习笔记之折叠(22)
2016/12/08 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
ant-design-vue 时间选择器赋值默认时间的操作
2020/10/27 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python使用MD5加密字符串示例
2014/08/22 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python进度条的制作代码实例
2019/08/31 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
python线性插值解析
2020/07/05 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
你们项目是如何进行变更控制的
2015/08/26 面试题
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
自主招生英文自荐信
2015/03/25 职场文书
和谐拯救危机观后感
2015/06/15 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android