首頁  >  文章  >  web前端  >  html5使用canvas壓縮圖片的範例程式碼

html5使用canvas壓縮圖片的範例程式碼

青灯夜游
青灯夜游轉載
2018-10-08 17:34:272947瀏覽

這篇文章主要介紹了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(&#39;----------------压缩图片-------------------&#39;);
      const canvas = document.createElement(&#39;canvas&#39;);
      let img = new Image();
      img.src = imgData.url;
      let ctx = canvas.getContext(&#39;2d&#39;);
      return new Promise((resolve =>{
        img.addEventListener(&#39;load&#39;, 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(&#39;image/png&#39;, 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: &#39;imagePicker/saveImage&#39;,
      payload: {
        files: previous
      }
    })
  }

以上就是本文的全部內容,希望對大家的學習有所幫助!

以上是html5使用canvas壓縮圖片的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除