Canvas?drawImage方法實(shí)現(xiàn)圖片壓縮詳解
圖片壓縮原理
- CanvasRenderingContext2D.drawImage() 方法可以從頁(yè)面 DOM 元素作為圖像源來(lái)根據(jù)坐標(biāo)和大小重新繪制該圖像。
- HTMLCanvasElement.toDataURL() 和 HTMLCanvasElement.toBlob() 方法支持導(dǎo)出為 base64 字符串或 Blob 對(duì)象。
CanvasRenderingContext2D.drawImage()
drawImage(image, dx, dy) drawImage(image, dx, dy, dWidth, dHeight) drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
- image
- 繪制到上下文的元素。允許任何的畫(huà)布圖像源,包括 canvas、img、svg、video 元素和 ImageBitmap 對(duì)象等。
- dx, dy, dWidth, dHeight
- 這幾個(gè)屬性表示在 canvas 畫(huà)布上指定一片區(qū)域用來(lái)放置圖片,dx、dy 指定圖片左上角在 canvas 上的坐標(biāo),dWidth、dHeight 指定圖片在 canvas 上繪制的區(qū)域?qū)捀摺H绻麤](méi)有指定 sx、sy、sWidth、sHeight 這4個(gè)參數(shù),則圖片會(huì)被拉伸或縮放在 canvas 區(qū)域內(nèi)。
- sx, sy, swidth, sheight
- 這幾個(gè)屬性是針對(duì)圖片元素的,表示圖片在 canvas 畫(huà)布上顯示的大小和位置。sx、sy 表示圖片上作為左上角的坐標(biāo),然后往右下角 swidth、sheight 尺寸范圍圖片作為最終在 canvas 上顯示的圖片內(nèi)容。
圖片壓縮,需要使用的是 CanvasRenderingContext2D.drawImage() 5個(gè)參數(shù)的語(yǔ)法,即指定圖片左上角在 canvas 上的坐標(biāo)為 0,圖片在 canvas 上繪制的區(qū)域?qū)捀邽?canvas 的寬高即可。例如,圖片的原始尺寸是 4000*3000,現(xiàn)在要把尺寸限制為 400*300 大小。
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = 400;
canvas.height = 300;
context.drawImage(img,0,0,canvas.width,canvas.height);
如果需要將轉(zhuǎn)換后的圖像渲染到頁(yè)面 DOM 元素,可以使用 HTMLCanvasElement.toDataURL() 方法來(lái)獲取轉(zhuǎn)換后的圖像 base64 格式信息的字符串傳遞給 img 元素的 src。或使用 HTMLCanvasElement.toBlob() 方法獲取 Blob 格式的對(duì)象,然后使用 URL.createObjectURL() 獲取對(duì)象 URL 傳遞給 img 元素的 src。也可以將該 base64 字符串或 Blob 對(duì)象上傳到后端服務(wù)器。
HTMLCanvasElement.toDataURL()
該方法將圖片轉(zhuǎn)換成 base64 格式信息的字符串表示法。
toDataURL() toDataURL(type) toDataURL(type, encoderOptions)
- type 可選
- 圖片格式,默認(rèn)為 image/png。file 對(duì)象中的 file.type 屬性可以傳到此參數(shù)。
- encoderOptions 可選
- 在指定圖片格式為 image/jpeg 或 image/webp 時(shí),可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。如果超出取值范圍,將會(huì)使用默認(rèn)值 0.92。其他參數(shù)會(huì)被忽略。
HTMLCanvasElement.toBlob()
- 比 HTMLCanvasElement.toDataURL() 方法多了一個(gè) callback 參數(shù),其他參數(shù)相同。
- 無(wú)返回值。
- 該方法是異步的,所以需要在 callback 回調(diào)方法中處理轉(zhuǎn)換結(jié)果,回調(diào)參數(shù)是轉(zhuǎn)換好的包含 canvas 畫(huà)布上的圖像的 Blob 對(duì)象,如果圖像未被成功創(chuàng)建,可能會(huì)獲得 null 值。
toBlob(callback) toBlob(callback, type) toBlob(callback, type, quality)
示例
下面原始圖片的大小為 84867 字節(jié)(大約 83KB),壓縮后大小僅為 16354 字節(jié)(約 16KB)。

(async function() {
const {size, type} = await fetch(img.src).then(res=>res.blob());
result.textContent += JSON.stringify({size, type});
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = 400;
canvas.height = 300;
context.drawImage(img,0,0,400,300);
img2.src = canvas.toDataURL(type);
canvas.toBlob(({size, type}) => result2.textContent += JSON.stringify({size, type}), type);
})()以上就是Canvas drawImage方法實(shí)現(xiàn)圖片壓縮詳解的詳細(xì)內(nèi)容,更多關(guān)于Canvas drawImage 壓縮圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
js實(shí)現(xiàn)簡(jiǎn)單手風(fēng)琴效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單手風(fēng)琴效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
不到200行 JavaScript 代碼實(shí)現(xiàn)富文本編輯器的方法
這篇文章主要介紹了不到200行 JavaScript 代碼實(shí)現(xiàn)富文本編輯器的方法,需要的朋友可以參考下2018-01-01
用js實(shí)現(xiàn)計(jì)算代碼行數(shù)的簡(jiǎn)單方法附代碼
用js實(shí)現(xiàn)計(jì)算代碼行數(shù)的簡(jiǎn)單方法附代碼...2007-08-08
js實(shí)現(xiàn)統(tǒng)計(jì)字符串中特定字符出現(xiàn)個(gè)數(shù)的方法
這篇文章主要介紹了js實(shí)現(xiàn)統(tǒng)計(jì)字符串中特定字符出現(xiàn)個(gè)數(shù)的方法,涉及javascript針對(duì)字符串中字符運(yùn)算操作相關(guān)技巧,需要的朋友可以參考下2016-08-08
IE6中鏈接A的href為javascript協(xié)議時(shí)不在當(dāng)前頁(yè)面跳轉(zhuǎn)
IE6中當(dāng)鏈接A的href為javascript協(xié)議時(shí)不能在當(dāng)前頁(yè)面跳轉(zhuǎn),本例給出有效的解決方法,大家不妨參考下2014-06-06
js 剪切板應(yīng)用clipboardData詳細(xì)解析
本篇文章主要介紹了js剪切板應(yīng)用clipboardData。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
《JavaScript DOM 編程藝術(shù)》讀書(shū)筆記之JavaScript 語(yǔ)法
這篇文章主要介紹了《JavaScript DOM 編程藝術(shù)》讀書(shū)筆記之JavaScript 語(yǔ)法,需要的朋友可以參考下2015-01-01
利用uniapp開(kāi)發(fā)APP時(shí)的調(diào)試/安卓打包等詳解
uni-app??是一個(gè)使用??Vue.js開(kāi)發(fā)所有前端應(yīng)用的框架,開(kāi)發(fā)者編寫(xiě)一套代碼,下面這篇文章主要給大家介紹了關(guān)于利用uniapp開(kāi)發(fā)APP時(shí)的調(diào)試/安卓打包等的相關(guān)資料,需要的朋友可以參考下2022-12-12
詳解ES6 export default 和 import語(yǔ)句中的解構(gòu)賦值
這篇文章主要介紹了詳解ES6 export default 和 import語(yǔ)句中的解構(gòu)賦值,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05

