vue html2canvas 釘釘

以前寫過PC瀏覽器上的html2Canvas,這次是給公司開發(fā)釘釘應(yīng)用,需要在釘釘應(yīng)用里面上傳圖片后,并和其他圖片、二維碼一起,繪制成一個(gè)宣傳海報(bào)。具體步驟見下圖:


1.png
2-上傳之后.png
3-點(diǎn)擊生成海報(bào).png

遇到的問題

1,背景圖片模糊問題

  • 不需要改插件,所有的圖都用img標(biāo)簽,不用background即可解決

2,圖片跨域問題

  • 后臺(tái)同事寫了一個(gè)接口,將oss服務(wù)器的圖片轉(zhuǎn)換為一個(gè)同域下的圖片。但是本地測(cè)試的時(shí)候,仍然有跨域,就使用了base64位做為img的src

3,釘釘中下載圖片問題

  • 這個(gè)項(xiàng)目是vue開發(fā)釘釘應(yīng)用,生成的海報(bào)是一個(gè)base64位格式。釘釘?shù)腶pi中預(yù)覽、下載均不支持base64,也不支持blob。所以,使用了a標(biāo)簽的download屬性來下載blob格式的圖片(blob://http://192.xxxxxx./xxxxxxx)

4,生成的圖片大小與左側(cè)不一致,有空白

  • 左側(cè)的imageWrapper區(qū)域,是最終繪制的源,要嚴(yán)格設(shè)置寬高,不能有空白,否則繪制出來的圖也會(huì)有空白

5,二維碼生成后,無法在微信識(shí)別

  • 圖中二維碼大小是55x55,生成的時(shí)候,生成200x200或者更大的,但是給二維碼的img設(shè)置成55x55即可

document.getElementById("j_design_code").innerHTML = '';
let qrDesCode = new QRCode('j_design_code', {
width: 200,
height: 200,
text: 'xxxx', // 二維碼內(nèi)容
render: 'table' // 設(shè)置渲染方式(有兩種方式 table和canvas,默認(rèn)是canvas)
});

用到的方法

getBase64(img){
        function getBase64Image(img,width,height) {//width、height調(diào)用時(shí)傳入具體像素值,控制大小 ,不傳則默認(rèn)圖像大小
          var canvas = document.createElement("canvas");
          canvas.width = width ? width : img.width;
          canvas.height = height ? height : img.height;

          var ctx = canvas.getContext("2d");
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
          var dataURL = canvas.toDataURL();
          return dataURL;
        }

        var image = new Image();
        image.crossOrigin = 'Anonymous';
        image.src = img;
        var deferred=$.Deferred();
        if(img){
          image.onload =function (){
            deferred.resolve(getBase64Image(image));//將base64傳給done上傳處理
          }
          return deferred.promise();//問題要讓onload完成后再return sessionStorage['imgTest']
        }
      },
  • base64轉(zhuǎn)換為blob
base64ToBlob(urlData) {
        var arr = urlData.split(',');
        var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';
        // 去掉url的頭,并轉(zhuǎn)化為byte
        var bytes = window.atob(arr[1]);
        // 處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
        var ab = new ArrayBuffer(bytes.length);
        // 生成視圖(直接針對(duì)內(nèi)存):8位無符號(hào)整數(shù),長(zhǎng)度1個(gè)字節(jié)
        var ia = new Uint8Array(ab);

        for (var i = 0; i < bytes.length; i++) {
          ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {
          type: mime
        });
      },base64ToBlob(urlData) {
        var arr = urlData.split(',');
        var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';
        // 去掉url的頭,并轉(zhuǎn)化為byte
        var bytes = window.atob(arr[1]);
        // 處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
        var ab = new ArrayBuffer(bytes.length);
        // 生成視圖(直接針對(duì)內(nèi)存):8位無符號(hào)整數(shù),長(zhǎng)度1個(gè)字節(jié)
        var ia = new Uint8Array(ab);

        for (var i = 0; i < bytes.length; i++) {
          ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {
          type: mime
        });
      },

注意:返回的是 new Blob類型,不能直接用于img的src,需要用window.URL.createObjectURL(Blob) 轉(zhuǎn)換為blob:http://192.xxxx/xx

詳細(xì)講解

  • 項(xiàng)目中安裝 html2canvas,我的是這個(gè)版本

"html2canvas": "^1.0.0-rc.1",
"jquery": "^3.3.1",

  • vue頁面中引用

import QRCode from 'qrcodejs2' --生成二維碼
import $ from 'jquery' --圖片轉(zhuǎn)base64的時(shí)候用到
import html2canvas from 'html2canvas';

  • 上傳操作
    • 上傳是調(diào)用后臺(tái)的接口,將本地圖片傳到oss服務(wù)器,返回給我一個(gè)http://xxxxx.png的圖片 ,假設(shè)賦給變量 noteImg
  • 上傳成功之后,得到base64位圖,做為img的src
uploadSuc{
        that.getBase64(that.noteImg)
              .then(function (base64) {
                that.uploadImgData = base64;
              }, function (err) {
                console.log(err);
              });
}

//html中直接用uploadImgData作為src
<div class="note-main">
      <img :src="uploadImgData" alt="">
</div>
  • 3,點(diǎn)擊‘生成海報(bào)’
//生成海報(bào)并在右側(cè)預(yù)覽
previewFun(){
        let that = this;

        html2canvas(that.$refs.imageWrapper,{
          backgroundColor: null,
          async: true,
          scale:5
        }).then((canvas) => {
          let dataURL = canvas.toDataURL("image/png");

          let tmpBlob = that.base64ToBlob(dataURL);
          that.designImgDataURL = window.URL.createObjectURL(tmpBlob);
          console.log('預(yù)覽的海報(bào)blob圖片  ',that.designImgDataURL);
        });
 },

//html中代碼
<div class="flex-item design-right">
     <img class="design-img" :src="designImgDataURL" alt="">
     <div style="text-align: right;" v-show="designImgDataURL">
           <a :href="designImgDataURL" class="design-download" target="_blank" 
:download="designRow.studentName+'.png'">點(diǎn)擊下載</a>
      </div>
</div>
html結(jié)構(gòu).png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大家好,今天我要給大家說說圖片上傳的功能。這個(gè)功能在項(xiàng)目中經(jīng)常用到,為此,我將寫個(gè)公共組件,方便大家直接調(diào)用。廢話...
    陳楠酒肆閱讀 3,188評(píng)論 0 12
  • 一、需求 最近做了一個(gè)H5頁面,大概內(nèi)容是:用戶進(jìn)入H5頁面后做一些測(cè)試題,答完測(cè)試題后生成一個(gè)結(jié)果,將這些結(jié)果生...
    小奵貓閱讀 40,961評(píng)論 10 28
  • 本文適用人群 需要在微信wap頁開發(fā)分享海報(bào)功能的前端程序員們 想要了解html2canvas庫的吃瓜群眾 掙扎在...
    朝顏vivian閱讀 10,340評(píng)論 4 17
  • 看到過這樣一個(gè)故事,奇天是個(gè)樂天派,生活質(zhì)量頗高,朋友貝特為此請(qǐng)教他一些問題。 貝特問:“假如你連一個(gè)朋友都沒有,...
    小小火紅閱讀 151評(píng)論 1 2
  • 你說簾外海棠,錦屏鴛鴦;后來庭院春深,咫尺畫堂。 你說笛聲如訴,費(fèi)盡思量;后來茶煙尚綠,人影茫茫。 你說可人如玉,...
    wxak柳姐閱讀 419評(píng)論 0 3

友情鏈接更多精彩內(nèi)容