前段时间做了个跟裁剪相关的活动《用H5中的Canvas等技术制作海报》,这次公司要做个与奥运相关的活动,扫车牌赢奖。

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

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

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

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

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

Github的插件项目中,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,这是为了减小图片的大小,使得在性能差的手机上面也能做操作。

三、旋转

当在操作图片的时候,我通过手势库touch.js绑定的事件,获取到了角度,然后再将这个角度设置到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上的地址:

https://github.com/pwstrick/veCrop

H5图片裁剪升级版的更多相关文章

  1. H5图片裁剪升级版(手机版)

    前段时间做了个跟裁剪相关的活动<用H5中的Canvas等技术制作海报>,这次公司要做个与奥运相关的活动,扫车牌赢奖. 于是我就在上一个活动的基础上,将代码重新封装一下,并且将计算方式写的更 ...

  2. 移动端 H5图片裁剪插件,内置简单手势操作

    前面曾经写过一篇<H5图片裁剪升级版>,但里面需要借助第三方手势库,这次就不需要使用手势库,全部封装在代码中. 下图是裁剪的展示,下面就做了拖放和裁剪,没有做缩放,在插件中需要用到大量的计 ...

  3. 从web图片裁剪出发:了解H5中的canvas

    本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 重说三,好了,现在进 ...

  4. H5移动端图片裁剪(base64)

    在移动端开发的过程中,或许会遇到对图片裁剪的问题.当然遇到问题问题,不管你想什么方法都是要进行解决的,哪怕是丑点,难看点,都得去解决掉. 图片裁剪的jquery插件有很多,我也测试过很多,不过大多数都 ...

  5. web开发实战--图片裁剪和上传

    前言: 最近的开发中, 有一个上传头像的任务. 由于头像本身的特殊性, 其一般流程为选择图片, 编辑裁剪区域, 再继而上传图片操作. 看似简单的东西, 实则是挺麻烦的一件事. 借助这次开发机会, 来具 ...

  6. 图片裁剪 cropper.js 上传组件封装 vue

    //HTML cropper.js 文档地址: https://github.com/fengyuanchen/cropperjs/blob/master/README.md <template ...

  7. iOS常见用户头像的圆形图片裁剪常见的几种方法

    在开发中,基本上APP的用户头像的处理都需要把用户所上传的方形图片,处理为圆形图片.在这里就总结三种常见的处理圆形图片的方法. 1.使用位图上下文 2.使用UIView的layer进行处理 3.使用r ...

  8. Cropper – 简单的 jQuery 图片裁剪插件

    Cropper 是一个简单的 jQuery 图像裁剪插件.它支持选项,方法,事件,触摸(移动),缩放,旋转.输出的裁剪数据基于原始图像大小,这样你就可以用它们来直接裁剪图像. 如果你尝试裁剪跨域图像, ...

  9. 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)

    using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; na ...

随机推荐

  1. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

  2. 页面嵌入dom与被嵌入iframe的攻防

    1.情景一:自己的页面被引入(嵌入)至别人的页面iframe中 if(window.self != window.top){ //url是自己页面的url window.top.location.hr ...

  3. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  4. VisualStudio2013 如何打开之前版本开发的(.vdproj )安装项目

    当你的项目使用早于 visualstudio2013 的版本开发并且使用 Visual Studio Installer 制作安装项目时,在升级至 VS2013 后会发现新安装项目无法打开, VS20 ...

  5. Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)

    忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...

  6. CSS 3学习——transform 2D转换

    首先声明一点,transform属性不为none的元素是它的定位子元素(绝对定位和固定定位)的包含块,而且对内创建一个新的层叠上下文. 注意:可以通过 transform-box 属性指定元素的那个盒 ...

  7. ASP.NET MVC5----常见的数据注解和验证

    只要一直走,慢点又何妨. 在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部 ...

  8. Redis简单案例(二) 网站最近的访问用户

    我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...

  9. Android Studio开发RecyclerView遇到的各种问题以及解决(二)

    开发RecyclerView时候需要导入别人的例子,我的是从github导入的,下载下github的压缩包之后解压看你要导入的文件是priject还是Module.(一般有app文件夹的大部分是pro ...

  10. IOS开发基础知识--碎片51

    1:https关闭证书跟域名的验证 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; securityPolic ...