婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > html5使用canvas壓縮圖片的示例代碼

html5使用canvas壓縮圖片的示例代碼

熱門標簽:ok電銷機器人 智能電銷機器人被禁用了么 惡搞電話機器人 欣鼎電銷機器人 效果 地圖標注軟件打印出來 電話機器人技術 如何查看地圖標注 黃石ai電銷機器人呼叫中心 高德地圖標注商戶怎么標

前倆天做了一個圖片轉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,壓縮,圖片,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《html5使用canvas壓縮圖片的示例代碼》相關的同類信息!
  • 本頁收集關于html5使用canvas壓縮圖片的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 辉南县| 穆棱市| 津南区| 彭水| 即墨市| 凤城市| 枝江市| 怀来县| 陆河县| 垣曲县| 织金县| 长沙县| 长白| 开封市| 娱乐| 句容市| 梁河县| 鄂温| 米泉市| 丹江口市| 长沙县| 罗定市| 靖边县| 洮南市| 叶城县| 收藏| 枝江市| 沙洋县| 奉化市| 横山县| 阿拉善盟| 历史| 陇川县| 义乌市| 张家口市| 朝阳市| 阿勒泰市| 博野县| 西乌| 石泉县| 福建省|