多语言展示
当前在线:773今日阅读:19今日分享:20

canvas实现压缩上传相片和摆正上传相片的功能

本文是在《 canvas实现相片滤镜功能》和《canvas实现拖动、旋转、缩放和删除功能》基础上,增加了下面两点优化:  1.压缩上传相片,使对图片的操作过程更顺畅(特别是大图的滤镜操作);  2.修改部分相片上传后会显示不正的问题。
工具/原料
1

Sublime Text

2

Chrome浏览器调试

编写静态页面

这一块主要在前面功能上增加了两点修改:  1.增加隐藏画布(offCanvas),用于绘制上传的相片;  2.引入exif.js,用于获取相片的方向值。

实现原理
1

声明变量和初始化数据,详细代码如下图,该部分是基于前面功能声明修改了红色框的数据,变量的作用都已经做了详细备注,可自行查看代码。

2

压缩上传相片的功能实现,简单说就是先把上传相片绘制到隐藏画布中(设小画布尺寸),然后把该画布转化为图片重新绘制到操作画布,从而实现压缩;详细分析如下:  先设置最大宽度(maxWidth)或最大高度(maxHeight)(该值会影响上传相片的压缩比例,越大越清晰,所以要选择一个既清晰又不会太大的值(建议800-1000),这里为了演示设置了230),如果相片宽高都小于设置的值,则保持原值,如果大于设置的值,就根据下面代码计算(等比例缩小);  然后把上传相片绘制到该画布上(offCtx.drawImage(offImgObject, 0, 0, offCanvas.width, offCanvas.height));  最后把该画布转化为图片(fileSrc = offCanvas.toDataURL('image/jpeg')),并传值给操作画布(drawImageToCanvas(initDistance, fileSrc, filters, scaleValue, rotateValue))。  Tips:由于绘制到操作画布的图片已经压缩过,所以操作滤镜不用使用定时器,修改如图2。

3

上传相片摆正的功能实现,简单说就是先获取上传相片的方向值,然后根据数值判断旋转的弧度,最后对操作画布作相应的旋转,从而实现相片的摆正;详细分析如下:  先执行函数selectFileImage(files)获取相片的方向值(orientation--图1、2);  然后根据方向值的不同计算出不同的旋转弧度(sAngle--图3);  最后操作画布旋转相应的弧度(ctx.rotate(rotateValue + sAngle))。

推荐信息