您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

JS中图片压缩实现方法

2024/3/27 10:39:22发布18次查看
本文主要介绍了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中图片压缩方法
canvas与图片压缩的示例代码
html5实现图片压缩上传功能的深度解析
以上就是js中图片压缩实现方法的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product