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


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学习笔记(二) js对象
Oct 25 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
Jan 11 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 Javascript
jquery控制页面部分刷新的方法
Jun 24 Javascript
如何解决hover在ie6中的兼容性问题
Dec 15 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
Feb 13 Javascript
jQuery EasyUI Draggable拖动组件
Mar 01 Javascript
关于ES6箭头函数中的this问题
Feb 27 Javascript
vue实现多个元素或多个组件之间动画效果
Sep 25 Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 Javascript
vue使用axios实现excel文件下载的功能
Jul 16 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
详解php协程知识点
2018/09/21 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
详解Python编程中包的概念与管理
2015/10/16 Python
python将文本分每两行一组并保存到文件
2018/03/19 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Django缓存系统实现过程解析
2019/08/02 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
《纸船和风筝》教学反思
2014/02/15 职场文书
《社戏》教学反思
2014/04/15 职场文书
第二课堂活动总结
2014/05/07 职场文书
企业承诺书怎么写
2014/05/24 职场文书
单位车辆管理制度
2015/08/05 职场文书
养成教育工作总结
2015/08/13 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
比较node.js和Deno
2021/04/27 Javascript