這篇文章主要介紹了html5使用canvas壓縮圖片的範例程式碼的相關資料,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。
前兩人天做了一個圖片轉base64上傳的功能,發現如果圖片的base64過大的話,請求會變的很慢,嚴重的直接超時了,所以想到了在上傳前壓縮一下圖片,然後再上傳到後台,這樣可以大大的提高效率,在這裡記錄利用canvas 壓縮圖片遇到的幾個坑。完整程式碼會在文末給出。
第一個坑,在壓縮圖片的時候沒獲取圖片本身的寬高,給了一個600*480 的定寬定高,因為是手機端的,在上傳圖片的時候都是幾兆的圖片,所以這塊沒任何問題。出問題的地方在修改頭像的時候,測試的時候上傳的圖片都是小圖片,然後就出現了壓縮後的圖片顯示不完全,大部分都是空白的現象,這就是因為在壓縮的時候沒有考慮圖片原本的寬高的情況。
第二個坑,解決第一個坑的辦法就是在圖片載入完成後(onload),取得圖片本身的寬高,然後賦值給canvas ,這樣進行操作,但是這有個坑就是,圖片載入是異步的,在你return 的時候,回傳的可能是undefined 而不是你需要的壓縮後的base64。這裡的解決方法是,新建一個 Promise ,然後把結果 resolve() 返回去,在呼叫的時候 .then() 得到結果。
知識點:
canvas 的toDataURL('image/png', 0.9) ; 把canvas 畫的圖片轉換為base64,第一個參數表示的是圖片的類型,第二個參數表示的是圖片的清晰度。
規定一個最大尺寸,如果圖片本身的寬高大於這個尺寸,按照最大的一個邊進行縮放,另一個根據圖片的比例進行設置,然後設置給canvas .
miniImage.js
export default async function miniSize(imgData, maxSize = 200*1024){ // const maxSize = 200 * 1024; if(imgData && imgData.files && imgData.files.size < maxSize) { return imgData.url; }else{ console.log('----------------压缩图片-------------------'); const canvas = document.createElement('canvas'); let img = new Image(); img.src = imgData.url; let ctx = canvas.getContext('2d'); return new Promise((resolve =>{ img.addEventListener('load', function(){ //图片原始尺寸 let originWidth = this.width; let originHeight = this.height; // 最大尺寸限制 let maxWidth = 400, maxHeight = 400; // 目标尺寸 let targetWidth = originWidth, targetHeight = originHeight; // 图片尺寸超过400x400的限制 if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > maxWidth / maxHeight) { // 更宽,按照宽度限定尺寸 targetWidth = maxWidth; targetHeight = Math.round(maxWidth * (originHeight / originWidth)); } else { targetHeight = maxHeight; targetWidth = Math.round(maxHeight * (originWidth / originHeight)); } } canvas.width = targetWidth; canvas.height = targetHeight; ctx.drawImage(img, 0, 0, targetWidth, targetHeight); let base64 = canvas.toDataURL('image/png', 0.9); resolve(base64); }, false); })) } }
呼叫:
test.js
onChangeImg = async (files, type, index) => { let previous = this.props.imagePicker.files; if(type === "add") { let result = miniSize(files[files.length-1]); //使用 .then() 调用获得结果 await result.then(res => { previous.push({url: res}); }); }else if(type === "remove") { previous.splice(index,1); } await this.props.dispatch({ type: 'imagePicker/saveImage', payload: { files: previous } }) }
以上就是本文的全部內容,希望對大家的學習有所幫助!
以上是html5使用canvas壓縮圖片的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!