JS中圖片壓縮的通常方法

最近圖片庫有比較大的改動,添加了很多新方法,其中重要的一個特性就是能夠 經過指定大小來壓縮圖片 ,感興趣的同窗能夠參考這篇文章 , 或者直接參考GitHub庫image-conversiongit


前兩天公司業務上有需求須要將較大的圖片壓縮後再傳到遠程服務器,網上找了很多方法都不太好用,今天有空索性本身寫了一個方法,並把它放到了本身的github上,有興趣的同窗能夠戳這裏

1、需求是什麼?

首先想想咱們有哪些需求?大多時候咱們須要將一個File對象壓縮以後再變爲File對象傳入到遠程圖片服務器;有時候咱們也須要將一個base64字符串壓縮以後再變爲base64字符串傳入到遠程數據庫;有時候後它還有多是一塊canvas畫布,或者是一個Image對象,或者直接就是一個圖片的url地址,咱們須要將它們壓縮上傳到遠程;面對這麼多的需求,王二索性畫了一張圖:github

Alt text

2、解決辦法

如上圖所示,王二一共寫了七個方法,基本覆蓋了JS中大部分文件類型的轉換與壓縮,其中:數據庫

一、urltoImage(url,fn) 會經過一個url加載所須要的圖片對象,其中url參數傳入圖片的url,fn爲回調方法,包含一個Image對象的參數,代碼以下:canvas

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

二、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 ;
};
複製代碼

三、canvasResizetoFile(canvas,quality,fn)會將一個Canvas對象壓縮轉變爲一個Blob類型對象;其中canvas參數傳入一個Canvas對象;quality參數傳入一個0-1的number類型,表示圖片壓縮質量;fn爲回調方法,包含一個Blob對象的參數;代碼以下:post

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

這裏的Blob對象表示不可變的相似文件對象的原始數據。Blob表示不必定是JavaScript原生形式的數據。 File接口基於Blob,繼承了Blob的功能並將其擴展使其支持用戶系統上的文件。咱們能夠把它當作File類型對待,其餘更具體的用法能夠參考MDN文檔ui

四、canvasResizetoDataURL(canvas,quality) 會將一個Canvas對象壓縮轉變爲一個dataURL字符串,其中canvas參數傳入一個Canvas對象;quality參數傳入一個0-1的number類型,表示圖片壓縮質量;代碼以下:url

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

其中的 toDataURL API能夠參考MDN文檔spa

五、filetoDataURL(file,fn) 會將 FileBlob)類型文件轉變爲dataURL字符串,其中 file 參數傳入一個FileBlob)類型文件;fn爲回調方法,包含一個dataURL字符串的參數;代碼以下:code

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

六、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;
};
複製代碼

七、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});
};
複製代碼

3、進一步封裝

對於經常使用的將一個File對象壓縮以後再變爲File對象,咱們能夠將上面的方法再封裝一下,參考以下代碼:

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

其中,file參數傳入一個FileBlob)類型文件;quality參數傳入一個0-1number類型,表示圖片壓縮質量;fn爲回調方法,包含一個Blob類型文件的參數。

它使用起來就像下面這樣:

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

這樣的話,圖片壓縮上傳就能輕鬆地搞定了,以上的8個方法我已經封裝好放到github上了,喜歡的話可使勁的star哈。

參考文檔: MDN

相關文章
相關標籤/搜索