您现在的位置是:网站首页> 编程资料编程资料

深入研究HTML5实现图片压缩上传功能_html5_网页制作_

2023-11-11 351人已围观

简介 下面小编就为大家带来一篇深入研究HTML5实现图片压缩上传功能。小编觉得挺不错的,现在分享给大家。也给大家一个参考,一起跟随小编过来看看吧

上篇文章中提到移动端上传图片,我们知道现在流量还是挺贵的,手机的像素是越来越高,拍个照动不动就是好几M,伤不起。虽然客户端可以轻轻松松实现图片压缩再上传,但是我们的应用还可能在浏览器里面打开,怎么办呢,图片压缩。受以前PC上的开发思维影响,尼玛js哪有权限去操作文件,哪有资格压缩图片啊,搞不了,你们客户端去整吧。只能说自己还是有些井底之蛙了。在HTML5的影响下,前端能干的事情越来越多了,开发的功能逼格也越来越高了,H5万岁!前端的魅力也在这,过去不可能的并不意味现在、以后不可能,努力吧,骚年!

js怎么压缩图片???潜意识里确实一开始是觉得实现不了,后来翻阅资料,研究了下,发现可行!搞起!

先说说H5以前我们怎么上传,一般是借助插件、flash或者干脆一个文件form表单,少操不少心。

自从有了H5,老板再也不担心我的开发了。

上篇文章提到图片上传用到了FileReader,FormData,实际上主要用这两个我们基本能实现图片的预览和上传了。实现图片压缩,我们需要借助canvas,是的,就是canvas!

大致思路是:

1、创建一个图片和一个canvas

XML/HTML Code复制内容到剪贴板
  1. var image = new Image(),   
  2. canvas = document.createElement("canvas"),   
  3. ctx = canvas.getContext('2d');  

2、我们将input中选择的图片地址通过FileReader获取后赋给新建的图片对象,然后将图片对象丢到canvas画布上。

XML/HTML Code复制内容到剪贴板
  1. var file = obj.files[0];   
  2.                         var reader = new FileReader();//读取客户端上的文件   
  3.                         reader.onload = function() {   
  4.                             var url = reader.result;//读取到的文件内容.这个属性只在读取操作完成之后才有效,并且数据的格式取决于读取操作是由哪个方法发起的.所以必须使用reader.onload,   
  5.                             image.src=url;//reader读取的文件内容是base64,利用这个url就能实现上传前预览图片   
  6.                             ...   
  7.                         };   
  8.                         image.onload = function() {   
  9.                             var w = image.naturalWidth,   
  10.                                 h = image.naturalHeight;   
  11.                             canvas.width = w;   
  12.                             canvas.height = h;   
  13.                             ctx.drawImage(image, 0, 0, w, h, 0, 0, w, h);   
  14.                             fileUpload();   
  15.                         };   
  16.                         reader.readAsDataURL(file);  


这里需要注意的是,canvas将图片画到画布上的时候需要确定canvas的尺寸,同时设定好drawImage的参数,具体如下:

XML/HTML Code复制内容到剪贴板
  1. void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);  

dx源图像的左上角在目标canvas上 X 轴的位置。

dy源图像的左上角在目标canvas上 Y 轴的位置。

dWidth在目标canvas上绘制图像的宽度。 允许对绘制的图像进行缩放。 如果不说明, 在绘制时图片宽度不会缩放。

dHeight在目标canvas上绘制图像的高度。 允许对绘制的图像进行缩放。 如果不说明, 在绘制时图片高度不会缩放。

sx需要绘制到目标上下文中的,源图像的矩形选择框的左上角 X 坐标。

sy需要绘制到目标上下文中的,源图像的矩形选择框的左上角 Y 坐标。

sWidth需要绘制到目标上下文中的,源图像的矩形选择框的宽度。如果不说明,整个矩形从坐标的sx和sy开始,到图像的右下角结束。

sHeight需要绘制到目标上下文中的,源图像的矩形选择框的高度。

为了上传完整的图片,这里dx,dy必须设置为0,dWidth和dHeight必须设置为原始图片的宽度和高度。这就是为什么我们需要等image对象下载完毕后获取其原始尺寸,这很关键!

3、图片上传

XML/HTML Code复制内容到剪贴板
  1. function fileUpload() {   
  2.      var data = canvas.toDataURL("image/jpeg", quality);   
  3.      //dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了   
  4.     datadata = data.split(',')[1];   
  5.     data = window.atob(data);   
  6.     var ia = new Uint8Array(data.length);   
  7.     for (var i = 0; i < data.length; i++) {   
  8.           ia[i] = data.charCodeAt(i);   
  9.     };   
  10.      //canvas.toDataURL 返回的默认格式就是 image/png   
  11.   

-六神源码网