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
- 繪制到上下文的元素。允許任何的畫布圖像源,包括 canvas、img、svg、video 元素和 ImageBitmap 對(duì)象等。
- dx, dy, dWidth, dHeight
- 這幾個(gè)屬性表示在 canvas 畫布上指定一片區(qū)域用來(lái)放置圖片,dx、dy 指定圖片左上角在 canvas 上的坐標(biāo),dWidth、dHeight 指定圖片在 canvas 上繪制的區(qū)域?qū)捀?。如果沒有指定 sx、sy、sWidth、sHeight 這4個(gè)參數(shù),則圖片會(huì)被拉伸或縮放在 canvas 區(qū)域內(nèi)。
- sx, sy, swidth, sheight
- 這幾個(gè)屬性是針對(duì)圖片元素的,表示圖片在 canvas 畫布上顯示的大小和位置。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 畫布上的圖像的 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-08js實(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-08IE6中鏈接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-06js 剪切板應(yīng)用clipboardData詳細(xì)解析
本篇文章主要介紹了js剪切板應(yīng)用clipboardData。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12《JavaScript DOM 編程藝術(shù)》讀書筆記之JavaScript 語(yǔ)法
這篇文章主要介紹了《JavaScript DOM 編程藝術(shù)》讀書筆記之JavaScript 語(yǔ)法,需要的朋友可以參考下2015-01-01利用uniapp開發(fā)APP時(shí)的調(diào)試/安卓打包等詳解
uni-app??是一個(gè)使用??Vue.js開發(fā)所有前端應(yīng)用的框架,開發(fā)者編寫一套代碼,下面這篇文章主要給大家介紹了關(guān)于利用uniapp開發(fā)APP時(shí)的調(diào)試/安卓打包等的相關(guān)資料,需要的朋友可以參考下2022-12-12詳解ES6 export default 和 import語(yǔ)句中的解構(gòu)賦值
這篇文章主要介紹了詳解ES6 export default 和 import語(yǔ)句中的解構(gòu)賦值,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05