中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在html5中如何使用canvas來壓縮圖片

發布時間:2022-01-20 15:35:40 來源:億速云 閱讀:128 作者:iii 欄目:開發技術

這篇文章主要講解了“在html5中如何使用canvas來壓縮圖片”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“在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來壓縮圖片”的內容了,經過本文的學習后,相信大家對在html5中如何使用canvas來壓縮圖片這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌黎县| 无锡市| 博乐市| 正安县| 宜君县| 赫章县| 上栗县| 靖宇县| 江门市| 镇沅| 漯河市| 锡林浩特市| 涞源县| 惠东县| 洱源县| 凤山县| 郧西县| 鹤峰县| 佛冈县| 麻阳| 布拖县| 连平县| 宜州市| 龙南县| 武宁县| 石林| 恩施市| 九台市| 苗栗市| 湖南省| 塘沽区| 金昌市| 隆化县| 平顶山市| 邢台市| 黔江区| 西青区| 屏南县| 桐梓县| 外汇| 巴林右旗|