当前位置:首页 > 日记 > 正文

JS中压缩的方法小结

JS中压缩的方法小结

首先想一想我们有哪些需求?大多时候我们需要将一个File对象压缩之后再变为File对象传入到远程图片服务器;有时候我们也需要将一个base64字符串压缩之后再变为base64字符串传入到远程数据库;有时候后它还有可能是一块canvas画布,或者是一个Image对象,或者直接就是一个图片的url地址,我们需要将它们压缩上传到远程;面对这么多的需求,王二索性画了一张图:

Alt text

二、解决办法

如上图所示,王二一共写了七个方法,基本覆盖了JS中大部分文件类型的转换与压缩,其中:

1、 urltoImage(url,fn) 会通过一个url加载所需要的图片对象,其中 url 参数传入图片的 url , fn 为回调方法,包含一个Image对象的参数,代码如下:

function urltoImage (url,fn){  var img = new Image();  img.src = url;  img.onload = function(){    fn(img);  }};

2、 imagetoCanvas(image) 会将一个 Image 对象转变为一个 Canvas 类型对象,其中 image 参数传入一个Image对象,代码如下:

function imagetoCanvas(image){  var cvs = document.createElement("canvas");  var ctx = cvs.getContext('2d');  cvs.width = image.width;  cvs.height = image.height;  ctx.drawImage(image, 0, 0, cvs.width, cvs.height);  return cvs ;};

3、 canvasResizetoFile(canvas,quality,fn) 会将一个 Canvas 对象压缩转变为一个 Blob 类型对象;其中 canvas 参数传入一个 Canvas 对象; quality 参数传入一个0-1的 number 类型,表示图片压缩质量; fn 为回调方法,包含一个 Blob 对象的参数;代码如下:

function canvasResizetoFile(canvas,quality,fn){  canvas.toBlob(function(blob) {    fn(blob);  },'image/jpeg',quality);};

这里的 Blob 对象表示不可变的类似文件对象的原始数据。 Blob 表示不一定是 JavaScript 原生形式的数据。 File 接口基于 Blob ,继承了 Blob 的功能并将其扩展使其支持用户系统上的文件。我们可以把它当做File类型对待,其他更具体的用法可以参考MDN文档

4、 canvasResizetoDataURL(canvas,quality) 会将一个 Canvas 对象压缩转变为一个 dataURL 字符串,其中 canvas 参数传入一个 Canvas 对象; quality 参数传入一个0-1的 number 类型,表示图片压缩质量;代码如下:

methods.canvasResizetoDataURL = function(canvas,quality){  return canvas.toDataURL('image/jpeg',quality);};

其中的 toDataURL API可以参考MDN文档

5、 filetoDataURL(file,fn) 会将 File ( Blob )类型文件转变为 dataURL 字符串,其中 file 参数传入一个 File ( Blob )类型文件; fn 为回调方法,包含一个 dataURL 字符串的参数;代码如下:

function filetoDataURL(file,fn){  var reader = new FileReader();  reader.onloadend = function(e){    fn(e.target.result);  };  reader.readAsDataURL(file);};

6、 dataURLtoImage(dataurl,fn) 会将一串 dataURL 字符串转变为 Image 类型文件,其中 dataurl 参数传入一个 dataURL 字符串, fn 为回调方法,包含一个 Image 类型文件的参数,代码如下:

function dataURLtoImage(dataurl,fn){  var img = new Image();  img.onload = function() {    fn(img);  };  img.src = dataurl;};

7、 dataURLtoFile(dataurl) 会将一串 dataURL 字符串转变为 Blob 类型对象,其中 dataurl 参数传入一个 dataURL 字符串,代码如下:

function dataURLtoFile(dataurl) {  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],    bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);  while(n--){    u8arr[n] = bstr.charCodeAt(n);  }  return new Blob([u8arr], {type:mime});};

三、进一步封装

对于常用的将一个 File 对象压缩之后再变为 File 对象,我们可以将上面的方法再封装一下,参考如下代码:

function fileResizetoFile(file,quality,fn){  filetoDataURL (file,function(dataurl){    dataURLtoImage(dataurl,function(image){      canvasResizetoFile(imagetoCanvas(image),quality,fn);    })  })}

其中, file 参数传入一个 File ( Blob )类型文件; quality 参数传入一个 0-1 的 number 类型,表示图片压缩质量; fn 为回调方法,包含一个 Blob 类型文件的参数。

它使用起来就像下面这样:

var file = document.getElementById('demo').files[0];fileResizetoFile(file,0.6,function(res){  console.log(res);  //拿到res,做出你要上传的操作;})

这样的话,图片压缩上传就能轻松地搞定了,以上的8个方法我已经封装好放到 github 上了,喜欢的话可以使劲的star哈。

参考文档:

MDN

ps:下面看下JS等比压缩图片的办法

function proDownImage(path,imgObj) { // 等比压缩图片工具   //var proMaxHeight = 185;   var proMaxHeight=300;   var proMaxWidth = 175;   var size = new Object();    var image = new Image();    image.src = path;    image.attachEvent("onreadystatechange",   function() { // 当加载状态改变时执行此方法,因为img的加载有延迟     if (image.readyState == "complete") { // 当加载状态为完全结束时进入       if (image.width > 0 && image.height > 0) {         var ww = proMaxWidth / image.width;         var hh = proMaxHeight / image.height;          var rate = (ww < hh) ? ww: hh;         if (rate <= 1) {            alert("imgage width*rate is:" + image.width * rate);           size.width = image.width * rate;           size.height = image.height * rate;         } else {           alert("imgage width is:" + image.width);             size.width = image.width;             size.height = image.height;            }        }     }     imgObj.attr("width",size.width);     imgObj.attr("height",size.height);   }); } 

总结

以上所述是小编给大家介绍的JS中图片压缩的方法小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

相关文章

excel表格怎么设置和取消分页预览

excel表格怎么设置和取消分页预览

设置,取消,分页,方法,表格,  Excel中如何进行分页预览,如何操作呢?对于常用Excel功能的朋友小菜一碟,但是新手不会设置分页预览怎么办?下面给大家分享如何分页预览的设置和取消方法吧,希望能帮到大家。Excel2010分页预览的设置和取消的方法1…

photoshop cs6简单更换人物照片背

photoshop cs6简单更换人物照片背

照片,背景,效果,简单,人物,photoshop cs6简单更换人物照片背景效果的方法分享给大家,打开一张人物数码照片,选取人物主体,拖拽到另一张上,合并。是不是很简单,一起来学习吧。方法/步骤:1、启动软件,打开一张照片。2、左侧工具箱,选择&ldquo;魔棒工…

ps利用滤镜制作漂亮的云彩效果

ps利用滤镜制作漂亮的云彩效果

滤镜,云彩,效果,漂亮,电脑软件,云彩在现实中可以用相机拍摄得到,当然也可以用平面软件进行制作,下面小编就为大家介绍ps利用滤镜制作漂亮的云彩效果方法,来看看吧!步骤:1、首先我们找到桌面的ps的图标2、然后我们执行文件-新建的操作3、随便新建…

Sublime Text新建.vue模板并高亮 |

Sublime Text新建.vue模板并高亮 |

图文教程,模板,电脑软件,Text,Sublime,本文介绍了 Sublime Text新建.vue模板并高亮(图文教程),分享给大家,也给自己留个笔记。准备工作下载安装新建文件模板插件 SublimeTmpl 下载安装vue语法高亮插件 Vue Syntax HighlightSublime Text安装…

浅析正则表达式中的lastIndex以及

浅析正则表达式中的lastIndex以及

正则表达式,电脑软件,lastIndex,依次写出下列输出内容。var reg1 = /a/;var reg2 = /a/g;console.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.log(reg1.test('abcabc')); // trueconsole.l…

微信小程序 http请求的session管理

微信小程序 http请求的session管理

请求,程序,电脑软件,微信小,session,微信小程序 http请求的session管理作为一个开发JavaWeb应用的程序猿,都喜欢将用户登录后的用户信息(比如说用户id,用户名称)放入session中保存,之后在业务逻辑的开发中需要用到用户信息的时候就可以轻松又方…

PS怎么设计一款漂亮的梅花字体的文

PS怎么设计一款漂亮的梅花字体的文

文字,字体,漂亮,电脑软件,PS,艺术字是平面设计作品中常用的一种形式,今天,我们就要学学梅花字的制作技巧,从在PS的各种工具的使用技巧上再进行一次深入的探索,对于相关艺术字的创意与技术进行一次很好的体验。软件名称:Adobe Photoshop 8.0 中文…

ps怎么设计一个彩色的抽象电视机标

ps怎么设计一个彩色的抽象电视机标

抽象,彩色,标志,电脑软件,ps,ps中想要制作一个彩色的抽象电视机图标,该怎么制作呢?下面我们就来看看详细的教程。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、要想绘制出让人眼前一亮的电视机标志就…

Word如何去掉每行后的回车符但保留

Word如何去掉每行后的回车符但保留

回车符,段落,符号,电脑软件,Word,  word中总是默认出来很多回车符,在去除回车符的时候,正常的段落回车符也被去除了。以下是小编为您带来的关于Word去掉每行后的回车符但保留段落符号,希望对您有所帮助。Word去掉每行后的回车符但保留段落符…

PS合成制作出在云海中的泛舟的美女

PS合成制作出在云海中的泛舟的美女

云海,出在,场景,梦幻,美女,现阶段这部分教程适合初级设计师,画面简洁,用到的素材少,只需要溶图,抠图,调色等,可以迅速掌握合成思路。最终效果一、创建背景层。 12 3 4 5 6 阅读全文二、添加树元素。 1 23 4 5 6 阅读全文三、添加小船。 1 2 3…

PS使用3D工具7步打造出简单炫酷的

PS使用3D工具7步打造出简单炫酷的

教程,工具,3D,山脉,星辰,效果图:素材图:主要过程:教程结束,以上就是PS使用3D工具7步打造出简单炫酷的星辰山脉效果教程的全部内容,希望大家喜欢!相关教程推荐:PS怎么设计漂亮的星云艺术字体? PS制作自定义星星图案Photoshop为山水图片制作模拟耶稣…