H5图片裁剪升级版

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

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

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


65.jpg


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

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

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

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

Github的插件项目中,index.html页面是一个示例demo。

 

一、裁剪原理


1)计算坐标

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

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


66.jpg


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

2)生成旋转图片

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


67.jpg


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

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


68.jpg


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

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

 

二、三角函数


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

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


69.jpg


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

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

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

其他三个情况以此类推。


70.jpg71.jpg72.jpg


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


73.jpg



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


74.jpg


三、旋转


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



75.jpg


平移和缩放分别用到了“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);
        });
        //......
    };



相关文章
|
6月前
|
Java 数据安全/隐私保护
SpringBoot【集成Thumbnailator】Google开源图片工具缩放+区域裁剪+水印+旋转+保持比例等(保姆级教程含源代码)
SpringBoot【集成Thumbnailator】Google开源图片工具缩放+区域裁剪+水印+旋转+保持比例等(保姆级教程含源代码)
305 0
|
缓存 Kubernetes API
数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图
在文章《23秒完成从零开始搭建StableDiffusion》中我们详细讲解了通过ECI的数据缓存快速搭建StableDiffusion应用,用户通过模型网站选择好自己需要的模型,然后创建ECI数据缓存,即可快速部署自己的StableDiffusion应用。本文将基于StableDiffusion + 扩展插件 ControlNet 来完成实现网红爆款文字光影图
402 0
数据缓存系列分享(三):通过 StableDiffusion 扩展插件实现网红爆款文字光影图
|
API 数据库 开发者
用HarmonyOS ArkUI调用三方库PhotoView实现图片的联播、缩放
本文演示如果用HarmonyOS的ArkUI来调用已经上架到三方库中心的社区库。体验HarmonyOS 3最新的API 9,欢迎大家一起参与构建这个万物互联的时代
218 0
|
Web App开发 编解码 移动开发
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配 (上)
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配
322 0
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配 (上)
|
Web App开发 移动开发 前端开发
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配 (下)
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配 (下)
362 0
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配 (下)
|
算法 Java 计算机视觉
Java实现图片滤镜的高级玩法
Java实现图片滤镜的高级玩法
418 0
Java实现图片滤镜的高级玩法
|
小程序 前端开发 安全
《iOS逆向》小程序的基础配置:文章的特色图片(缩略图/封面)模糊的解决方案
《iOS逆向》小程序的基础配置:文章的特色图片(缩略图/封面)模糊的解决方案
263 0
《iOS逆向》小程序的基础配置:文章的特色图片(缩略图/封面)模糊的解决方案
|
Web App开发 存储 缓存
手淘图片库新特性解析
随着手淘拉新和用户体量的增加,CDN图片资源的访问量也随之增加。我们知道访问量增加,会带来带宽的增加,服务器成本也随之增加。
手淘图片库新特性解析
|
算法 开发工具
美狐滤镜sdk技术(一):所谓的滤镜算法如何实现
滤镜sdk适用的场景有很多,比较常见的有直播、短视频、社交软件、美颜相机等,而随着时代的不断变化,现代人对照片视频的色彩和质感方面的要求也越来越高。本文以滤镜算法为主要内容来简单分享下。
下一篇
无影云桌面