博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
H5图片裁剪升级版
阅读量:5906 次
发布时间:2019-06-19

本文共 1743 字,大约阅读时间需要 5 分钟。

前段时间做了个跟裁剪相关的活动《》,这次公司要做个与奥运相关的活动,扫车牌赢奖。

于是我就在上一个活动的基础上,将代码重新封装一下,并且将计算方式写的更通用。下图是活动中裁剪的页面:

先来看看两个活动的不同:

1、原先的活动每次旋转只能90°,而此次活动可以任意角度旋转。

2、原先的活动每次旋转就会生成一段Base64数据,导致页面卡顿严重,而此次只有在裁剪的时候才生成图片。

以上两点是最大的不同,其它方面基本一致,如果碰到不明白的可以参考一下《

中,index.html页面是一个示例demo。

 

一、裁剪原理

1)计算坐标

在上一篇海报制作的文章中,提到了裁剪时候各个位置的计算。这次使用的计算方式与上次一样。

最终也是在分别获取裁剪框与图片的x、y和宽高。

只是此次是任意角度的旋转,所以在裁剪的时候要使用更通用的计算方式。

2)生成旋转图片

我在最终裁剪的时候,会先生成一张旋转后的图片,然后再在这张图片中裁剪指定区域。

在上图中选中的透明蓝色部分就是一张旋转后的图片,这里只能看到部分,其实完整的应该是会比原图的宽大很多。

而通过计算后的裁剪框与图片的位置如下:

image的x和y坐标大概就是上图中红点的位置,如果要裁剪就要生成这张旋转后的图片。

细的蓝色线条描绘了旋转后的图片样子,这里只展示到了部分。接下来就是如何计算得到这张图片。

 

二、三角函数

要生成上面那张旋转图片,需要通过三角函数计算出宽高,以及在Canvas上画图的时候需要偏移的值。

通过手工计算,得出旋转分为四种情况90°以内、180°以内、270°以内和360°以内。

上图是我手工计算的90°以内的情况,可以计算粗话x1、x2、y1、y2,旋转角度是30°。

知道了这四个值就能计算出新图的宽和高,还能得出需要平移的坐标值,像上图就是(x2,0)。

插件中函数“radian”,“sin”,“cos”,“caculate1”,“caculate2”,“rotateCanvas”都是在做三角函数相关计算。

其他三个情况以此类推。

      

最终图片生成是在方法“filterImage”中做的,下面是部分代码。

顺便说下,最后canvas生成了jpeg图片,并且质量是0.5,这是为了减小图片的大小,使得在性能差的手机上面也能做操作。

 

三、旋转

当在操作图片的时候,我通过手势库绑定的事件,获取到了角度,然后再将这个角度设置到CSS属性“rotate”中,使得图片旋转了起来。

平移和缩放分别用到了“translate3d”和“scale3d”,用3d属性是为了增强性能。

在插件的“initTouch”方法中配置了手势事件。插件的私有属性“param”缓存了平移、缩放和角度的值。

veCropProtytype.initTouch = function() {        var currScale, _this = this,            Touch = this.opts.Touch,            frame = this.opts.frame;        Touch.on(frame, 'rotate', function (ev) {            var totalAngle = _this.param.deg + ev.rotation;            if(ev.fingerStatus === 'end'){                _this.param.deg = _this.param.deg + ev.rotation;            }            _this.formatTransform(_this.param.offsetX, _this.param.offsetY, _this.param.scale, totalAngle);        });        //......    };

 

 

Github上的地址:

 

    本文转自 咖啡机(K.F.J)   博客园博客,原文链接:http://www.cnblogs.com/strick/p/5746162.html,如需转载请自行联系原作者

你可能感兴趣的文章
20个非常有用的Java代码片段
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>
mongoDB(1):windows下安装mongoDB(解压缩版)
查看>>
CentOS修改主机名
查看>>
php 5.3.6中php-fpm 配置
查看>>
XMPP协议分析-原理篇
查看>>
centos7常用操作
查看>>
系统集成资质培训 - 新书发布
查看>>
Ubuntu解决RTNETLINK answers: File exists
查看>>
ES6数组去重的最佳实践:Set结合Array.from() | 拓展运算符结合 Set
查看>>
深入屏幕像素概念
查看>>
awk命令的几个选项注释
查看>>
Windows更改临时文件夹
查看>>
django base (1)
查看>>
iRedMail调整附件大小 & Postfix的bcc(自动转发/邮件备份/监控/归档) 在同一个服务器是有压力...
查看>>
唯识相链由来
查看>>
linux系统的负载与CPU、内存、硬盘、用户数监控shell脚本
查看>>
Percona Toolkit 安装
查看>>
VOD, TVOD, SVOD FVOD的区别(转)
查看>>