將canvas批量下載為圖片壓縮包

需求:點擊【批量下載】按鈕鸡岗,將多張canvas圖片下載為壓縮包垂攘。

1.需要用到jszip慢逾,在項目中安裝:npm install jszip

2.實現(xiàn)下載

const download = () => {
  let imgs = [bg1, bg2, bg3];
  let canvasList: any[] = [];

  let request = imgs.map(e => getBase64Image(e));
  // 在渲染圖片時晋渺,img.onload方法是同步的窄驹,如果圖片過大,會導(dǎo)致圖片一張一張被刷出來博烂,影響視覺效果
  // 所以將圖片的繪制封裝為Promise函數(shù)香椎,使用Promise.all來獲取繪制結(jié)果,當(dāng)全部圖片都繪制成功后脖母,再開始下載圖片
  Promise.all(request)
    .then(res => {
      canvasList = res;
      getZip();
    })
    .catch(err => {
      console.log(err);
    });

  function getBase64Image(path: any) {
    return new Promise((resolve, reject) => {
      const img = new Image();
      img.src = path;
      img.onload = function () {
        resolve(imgTobase64(img));
      };
      if (!path) {
        reject("image error");
      }
    });
  }
  function imgTobase64(img: any) {
    const canvas = document.createElement("canvas");
    canvas.width = 300;
    canvas.height = 300;
    let ctx = canvas.getContext("2d")!;
    ctx.drawImage(img, 0, 0, 300, 300);
    return canvas.toDataURL();
  }

  function getZip() {
    //創(chuàng)建JSZip實例對象
    let zip = new JSZip();
    // 創(chuàng)建文件夾
    let imgFolder = zip.folder("example")!;
    for (let i = 0; i < canvasList.length; i++) {
      // 將base64格式轉(zhuǎn)為文件士鸥,加入文件夾
      imgFolder.file(`${i + 1}.png`, base64ImgtoFile(canvasList[i]), { base64: true });
    }
    // 生成zip文件并下載
    zip
      .generateAsync({
        type: "blob", // 壓縮類型
        compression: "DEFLATE", // STORE:默認(rèn)不壓縮 DEFLATE:需要壓縮
        compressionOptions: {
          level: 9, // 壓縮等級1~9 1壓縮速度最快,9最優(yōu)壓縮方式
        },
      })
      .then(function (content) {
        // 下載的文件名
        let filename = "download.zip";
        // 創(chuàng)建隱藏的可下載鏈接
        let eleLink = document.createElement("a");
        eleLink.download = filename;
        eleLink.style.display = "none";
        // 下載內(nèi)容轉(zhuǎn)變成blob地址
        eleLink.href = URL.createObjectURL(content);
        // 觸發(fā)點擊
        document.body.appendChild(eleLink);
        eleLink.click();
        document.body.removeChild(eleLink);
      });

    function base64ImgtoFile(dataurl: any, filename = "file") {
      let arr = dataurl.split(",");
      let mime = arr[0].match(/:(.*?);/)[1];
      let suffix = mime.split("/")[1];
      // atob : 解碼使用 base-64 編碼的字符串
      let bstr = window.atob(arr[1]);
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], `${filename}.${suffix}`, {
        type: mime,
      });
    }
  }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谆级,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讼积,更是在濱河造成了極大的恐慌肥照,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勤众,死亡現(xiàn)場離奇詭異舆绎,居然都是意外死亡,警方通過查閱死者的電腦和手機们颜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門吕朵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窥突,你說我怎么就攤上這事努溃。” “怎么了阻问?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵梧税,是天一觀的道長。 經(jīng)常有香客問我,道長第队,這世上最難降的妖魔是什么哮塞? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮凳谦,結(jié)果婚禮上忆畅,老公的妹妹穿的比我還像新娘。我一直安慰自己尸执,他們只是感情好家凯,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剔交,像睡著了一般肆饶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岖常,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天驯镊,我揣著相機與錄音,去河邊找鬼竭鞍。 笑死板惑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偎快。 我是一名探鬼主播冯乘,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晒夹!你這毒婦竟也來了裆馒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丐怯,失蹤者是張志新(化名)和其女友劉穎喷好,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體读跷,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡梗搅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了效览。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无切。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丐枉,靈堂內(nèi)的尸體忽然破棺而出哆键,到底是詐尸還是另有隱情,我是刑警寧澤矛洞,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布洼哎,位于F島的核電站烫映,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏噩峦。R本人自食惡果不足惜锭沟,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望识补。 院中可真熱鬧族淮,春花似錦、人聲如沸凭涂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切油。三九已至蝙斜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澎胡,已是汗流浹背孕荠。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攻谁,地道東北人稚伍。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像戚宦,于是被迫代替她去往敵國和親个曙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容