Canvas?drawImage方法實現(xiàn)圖片壓縮詳解
圖片壓縮原理
- CanvasRenderingContext2D.drawImage() 方法可以從頁面 DOM 元素作為圖像源來根據(jù)坐標和大小重新繪制該圖像。
- HTMLCanvasElement.toDataURL() 和 HTMLCanvasElement.toBlob() 方法支持導出為 base64 字符串或 Blob 對象。
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 對象等。
- dx, dy, dWidth, dHeight
- 這幾個屬性表示在 canvas 畫布上指定一片區(qū)域用來放置圖片,dx、dy 指定圖片左上角在 canvas 上的坐標,dWidth、dHeight 指定圖片在 canvas 上繪制的區(qū)域?qū)捀?。如果沒有指定 sx、sy、sWidth、sHeight 這4個參數(shù),則圖片會被拉伸或縮放在 canvas 區(qū)域內(nèi)。
- sx, sy, swidth, sheight
- 這幾個屬性是針對圖片元素的,表示圖片在 canvas 畫布上顯示的大小和位置。sx、sy 表示圖片上作為左上角的坐標,然后往右下角 swidth、sheight 尺寸范圍圖片作為最終在 canvas 上顯示的圖片內(nèi)容。
圖片壓縮,需要使用的是 CanvasRenderingContext2D.drawImage() 5個參數(shù)的語法,即指定圖片左上角在 canvas 上的坐標為 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)換后的圖像渲染到頁面 DOM 元素,可以使用 HTMLCanvasElement.toDataURL() 方法來獲取轉(zhuǎn)換后的圖像 base64 格式信息的字符串傳遞給 img 元素的 src?;蚴褂?HTMLCanvasElement.toBlob() 方法獲取 Blob 格式的對象,然后使用 URL.createObjectURL() 獲取對象 URL 傳遞給 img 元素的 src。也可以將該 base64 字符串或 Blob 對象上傳到后端服務(wù)器。
HTMLCanvasElement.toDataURL()
該方法將圖片轉(zhuǎn)換成 base64 格式信息的字符串表示法。
toDataURL() toDataURL(type) toDataURL(type, encoderOptions)
- type 可選
- 圖片格式,默認為 image/png。file 對象中的 file.type 屬性可以傳到此參數(shù)。
- encoderOptions 可選
- 在指定圖片格式為 image/jpeg 或 image/webp 時,可以從 0 到 1 的區(qū)間內(nèi)選擇圖片的質(zhì)量。如果超出取值范圍,將會使用默認值 0.92。其他參數(shù)會被忽略。
HTMLCanvasElement.toBlob()
- 比 HTMLCanvasElement.toDataURL() 方法多了一個 callback 參數(shù),其他參數(shù)相同。
- 無返回值。
- 該方法是異步的,所以需要在 callback 回調(diào)方法中處理轉(zhuǎn)換結(jié)果,回調(diào)參數(shù)是轉(zhuǎn)換好的包含 canvas 畫布上的圖像的 Blob 對象,如果圖像未被成功創(chuàng)建,可能會獲得 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方法實現(xiàn)圖片壓縮詳解的詳細內(nèi)容,更多關(guān)于Canvas drawImage 壓縮圖片的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
不到200行 JavaScript 代碼實現(xiàn)富文本編輯器的方法
這篇文章主要介紹了不到200行 JavaScript 代碼實現(xiàn)富文本編輯器的方法,需要的朋友可以參考下2018-01-01用js實現(xiàn)計算代碼行數(shù)的簡單方法附代碼
用js實現(xiàn)計算代碼行數(shù)的簡單方法附代碼...2007-08-08js實現(xiàn)統(tǒng)計字符串中特定字符出現(xiàn)個數(shù)的方法
這篇文章主要介紹了js實現(xiàn)統(tǒng)計字符串中特定字符出現(xiàn)個數(shù)的方法,涉及javascript針對字符串中字符運算操作相關(guān)技巧,需要的朋友可以參考下2016-08-08IE6中鏈接A的href為javascript協(xié)議時不在當前頁面跳轉(zhuǎn)
IE6中當鏈接A的href為javascript協(xié)議時不能在當前頁面跳轉(zhuǎn),本例給出有效的解決方法,大家不妨參考下2014-06-06《JavaScript DOM 編程藝術(shù)》讀書筆記之JavaScript 語法
這篇文章主要介紹了《JavaScript DOM 編程藝術(shù)》讀書筆記之JavaScript 語法,需要的朋友可以參考下2015-01-01利用uniapp開發(fā)APP時的調(diào)試/安卓打包等詳解
uni-app??是一個使用??Vue.js開發(fā)所有前端應用的框架,開發(fā)者編寫一套代碼,下面這篇文章主要給大家介紹了關(guān)于利用uniapp開發(fā)APP時的調(diào)試/安卓打包等的相關(guān)資料,需要的朋友可以參考下2022-12-12詳解ES6 export default 和 import語句中的解構(gòu)賦值
這篇文章主要介紹了詳解ES6 export default 和 import語句中的解構(gòu)賦值,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05