国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 web前端 js教程 JS中圖片壓縮實(shí)現(xiàn)方法

JS中圖片壓縮實(shí)現(xiàn)方法

Jan 19, 2018 am 10:58 AM
javascript 實(shí)現(xiàn) 方法

本文主要介紹了JS中圖片壓縮的方法,包括等比壓縮圖片的方法,需要的朋友可以參考下,希望能幫助到大家。

首先想一想我們有哪些需求?大多時(shí)候我們需要將一個(gè)File對象壓縮之后再變?yōu)镕ile對象傳入到遠(yuǎn)程圖片服務(wù)器;有時(shí)候我們也需要將一個(gè)base64字符串壓縮之后再變?yōu)閎ase64字符串傳入到遠(yuǎn)程數(shù)據(jù)庫;有時(shí)候后它還有可能是一塊canvas畫布,或者是一個(gè)Image對象,或者直接就是一個(gè)圖片的url地址,我們需要將它們壓縮上傳到遠(yuǎn)程;面對這么多的需求,王二索性畫了一張圖:

Alt text

二、解決辦法

如上圖所示,王二一共寫了七個(gè)方法,基本覆蓋了JS中大部分文件類型的轉(zhuǎn)換與壓縮,其中:

1、 urltoImage(url,fn) 會通過一個(gè)url加載所需要的圖片對象,其中 url 參數(shù)傳入圖片的 url , fn 為回調(diào)方法,包含一個(gè)Image對象的參數(shù),代碼如下:

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

2、 imagetoCanvas(image) 會將一個(gè) Image 對象轉(zhuǎn)變?yōu)橐粋€(gè) Canvas 類型對象,其中 image 參數(shù)傳入一個(gè)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) 會將一個(gè) Canvas 對象壓縮轉(zhuǎn)變?yōu)橐粋€(gè) Blob 類型對象;其中 canvas 參數(shù)傳入一個(gè) Canvas 對象; quality 參數(shù)傳入一個(gè)0-1的 number 類型,表示圖片壓縮質(zhì)量; fn 為回調(diào)方法,包含一個(gè) Blob 對象的參數(shù);代碼如下:

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

這里的 Blob 對象表示不可變的類似文件對象的原始數(shù)據(jù)。 Blob 表示不一定是 JavaScript 原生形式的數(shù)據(jù)。 File 接口基于 Blob ,繼承了 Blob 的功能并將其擴(kuò)展使其支持用戶系統(tǒng)上的文件。我們可以把它當(dāng)做File類型對待,其他更具體的用法可以參考MDN文檔

4、 canvasResizetoDataURL(canvas,quality) 會將一個(gè) Canvas 對象壓縮轉(zhuǎn)變?yōu)橐粋€(gè) dataURL 字符串,其中 canvas 參數(shù)傳入一個(gè) Canvas 對象; quality 參數(shù)傳入一個(gè)0-1的 number 類型,表示圖片壓縮質(zhì)量;代碼如下:

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

其中的 toDataURL API可以參考MDN文檔

5、 filetoDataURL(file,fn) 會將 File ( Blob )類型文件轉(zhuǎn)變?yōu)?dataURL 字符串,其中 file 參數(shù)傳入一個(gè) File ( Blob )類型文件; fn 為回調(diào)方法,包含一個(gè) dataURL 字符串的參數(shù);代碼如下:

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

6、 dataURLtoImage(dataurl,fn) 會將一串 dataURL 字符串轉(zhuǎn)變?yōu)?Image 類型文件,其中 dataurl 參數(shù)傳入一個(gè) dataURL 字符串, fn 為回調(diào)方法,包含一個(gè) Image 類型文件的參數(shù),代碼如下:

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

7、 dataURLtoFile(dataurl) 會將一串 dataURL 字符串轉(zhuǎn)變?yōu)?Blob 類型對象,其中 dataurl 參數(shù)傳入一個(gè) 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});
};

三、進(jìn)一步封裝

對于常用的將一個(gè) File 對象壓縮之后再變?yōu)?File 對象,我們可以將上面的方法再封裝一下,參考如下代碼:

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

其中, file 參數(shù)傳入一個(gè) File ( Blob )類型文件; quality 參數(shù)傳入一個(gè) 0-1 的 number 類型,表示圖片壓縮質(zhì)量; fn 為回調(diào)方法,包含一個(gè) Blob 類型文件的參數(shù)。

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

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

這樣的話,圖片壓縮上傳就能輕松地搞定了,以上的8個(gè)方法我已經(jīng)封裝好放到 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()?{?//?當(dāng)加載狀態(tài)改變時(shí)執(zhí)行此方法,因?yàn)閕mg的加載有延遲?
????if?(image.readyState?==?"complete")?{?//?當(dāng)加載狀態(tài)為完全結(jié)束時(shí)進(jìn)入?
??????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);?
??});?
}

相關(guān)推薦:

如何實(shí)現(xiàn)JS中圖片壓縮方法

Canvas與圖片壓縮的示例代碼

HTML5實(shí)現(xiàn)圖片壓縮上傳功能的深度解析

以上是JS中圖片壓縮實(shí)現(xiàn)方法的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
微信刪除的人如何找回(簡單教程告訴你如何恢復(fù)被刪除的聯(lián)系人) 微信刪除的人如何找回(簡單教程告訴你如何恢復(fù)被刪除的聯(lián)系人) May 01, 2024 pm 12:01 PM

而后悔莫及、人們常常會因?yàn)橐恍┰虿恍⌒膶⒛承┞?lián)系人刪除、微信作為一款廣泛使用的社交軟件。幫助用戶解決這一問題,本文將介紹如何通過簡單的方法找回被刪除的聯(lián)系人。1.了解微信聯(lián)系人刪除機(jī)制這為我們找回被刪除的聯(lián)系人提供了可能性、微信中的聯(lián)系人刪除機(jī)制是將其從通訊錄中移除,但并未完全刪除。2.使用微信內(nèi)置“通訊錄恢復(fù)”功能微信提供了“通訊錄恢復(fù)”節(jié)省時(shí)間和精力,用戶可以通過該功能快速找回之前被刪除的聯(lián)系人,功能。3.進(jìn)入微信設(shè)置頁面點(diǎn)擊右下角,打開微信應(yīng)用“我”再點(diǎn)擊右上角設(shè)置圖標(biāo)、進(jìn)入設(shè)置頁面,,

怎么在番茄免費(fèi)小說app中寫小說 分享番茄小說寫小說方法教程 怎么在番茄免費(fèi)小說app中寫小說 分享番茄小說寫小說方法教程 Mar 28, 2024 pm 12:50 PM

  番茄小說是一款非常熱門的小說閱讀軟件,我們在番茄小說中經(jīng)常會有新的小說和漫畫可以去閱讀,每一本小說和漫畫都很有意思,很多小伙伴也想著要去寫小說來賺取賺取零花錢,在把自己想要寫的小說內(nèi)容編輯成文字,那么我們要怎么樣在這里面去寫小說呢?小伙伴們都不知道,那就讓我們一起到本站本站中花點(diǎn)時(shí)間來看寫小說的方法介紹吧。分享番茄小說寫小說方法教程  1、首先在手機(jī)上打開番茄免費(fèi)小說app,點(diǎn)擊個(gè)人中心——作家中心  2、跳轉(zhuǎn)到番茄作家助手頁面——點(diǎn)擊創(chuàng)建新書在小說的結(jié)

華為手機(jī)如何實(shí)現(xiàn)雙微信登錄? 華為手機(jī)如何實(shí)現(xiàn)雙微信登錄? Mar 24, 2024 am 11:27 AM

華為手機(jī)如何實(shí)現(xiàn)雙微信登錄?隨著社交媒體的興起,微信已經(jīng)成為人們?nèi)粘I钪胁豢苫蛉钡臏贤üぞ咧?。然而,許多人可能會遇到一個(gè)問題:在同一部手機(jī)上同時(shí)登錄多個(gè)微信賬號。對于華為手機(jī)用戶來說,實(shí)現(xiàn)雙微信登錄并不困難,本文將介紹華為手機(jī)如何實(shí)現(xiàn)雙微信登錄的方法。首先,華為手機(jī)自帶的EMUI系統(tǒng)提供了一個(gè)很便利的功能——應(yīng)用雙開。通過應(yīng)用雙開功能,用戶可以在手機(jī)上同

手機(jī)版龍蛋孵化方法大揭秘(一步一步教你如何成功孵化手機(jī)版龍蛋) 手機(jī)版龍蛋孵化方法大揭秘(一步一步教你如何成功孵化手機(jī)版龍蛋) May 04, 2024 pm 06:01 PM

手機(jī)游戲成為了人們生活中不可或缺的一部分,隨著科技的發(fā)展。它以其可愛的龍蛋形象和有趣的孵化過程吸引了眾多玩家的關(guān)注,而其中一款備受矚目的游戲就是手機(jī)版龍蛋。幫助玩家們在游戲中更好地培養(yǎng)和成長自己的小龍,本文將向大家介紹手機(jī)版龍蛋的孵化方法。1.選擇合適的龍蛋種類玩家需要仔細(xì)選擇自己喜歡并且適合自己的龍蛋種類,根據(jù)游戲中提供的不同種類的龍蛋屬性和能力。2.提升孵化機(jī)的等級玩家需要通過完成任務(wù)和收集道具來提升孵化機(jī)的等級,孵化機(jī)的等級決定了孵化速度和孵化成功率。3.收集孵化所需的資源玩家需要在游戲中

PHP編程指南:實(shí)現(xiàn)斐波那契數(shù)列的方法 PHP編程指南:實(shí)現(xiàn)斐波那契數(shù)列的方法 Mar 20, 2024 pm 04:54 PM

編程語言PHP是一種用于Web開發(fā)的強(qiáng)大工具,能夠支持多種不同的編程邏輯和算法。其中,實(shí)現(xiàn)斐波那契數(shù)列是一個(gè)常見且經(jīng)典的編程問題。在這篇文章中,將介紹如何使用PHP編程語言來實(shí)現(xiàn)斐波那契數(shù)列的方法,并附上具體的代碼示例。斐波那契數(shù)列是一個(gè)數(shù)學(xué)上的序列,其定義如下:數(shù)列的第一個(gè)和第二個(gè)元素為1,從第三個(gè)元素開始,每個(gè)元素的值等于前兩個(gè)元素的和。數(shù)列的前幾個(gè)元

快速掌握:華為手機(jī)開啟兩個(gè)微信賬號方法大揭秘! 快速掌握:華為手機(jī)開啟兩個(gè)微信賬號方法大揭秘! Mar 23, 2024 am 10:42 AM

在當(dāng)今社會,手機(jī)已經(jīng)成為我們生活中不可或缺的一部分。而微信作為我們?nèi)粘贤?、工作、生活的重要工具,更是?jīng)常被使用。然而,在處理不同事務(wù)時(shí)可能需要分開兩個(gè)微信賬號,這就要求手機(jī)能夠支持同時(shí)登錄兩個(gè)微信賬號。華為手機(jī)作為國內(nèi)知名品牌,很多人使用,那么華為手機(jī)開啟兩個(gè)微信賬號的方法是怎樣的呢?下面就來揭秘一下這個(gè)方法。首先,要在華為手機(jī)上同時(shí)使用兩個(gè)微信賬號,最簡

如何在華為手機(jī)上實(shí)現(xiàn)微信分身功能 如何在華為手機(jī)上實(shí)現(xiàn)微信分身功能 Mar 24, 2024 pm 06:03 PM

如何在華為手機(jī)上實(shí)現(xiàn)微信分身功能隨著社交軟件的普及和人們對隱私安全的日益重視,微信分身功能逐漸成為人們關(guān)注的焦點(diǎn)。微信分身功能可以幫助用戶在同一臺手機(jī)上同時(shí)登錄多個(gè)微信賬號,方便管理和使用。在華為手機(jī)上實(shí)現(xiàn)微信分身功能并不困難,只需要按照以下步驟操作即可。第一步:確保手機(jī)系統(tǒng)版本和微信版本符合要求首先,確保你的華為手機(jī)系統(tǒng)版本已更新到最新版本,以及微信App

See all articles