html2Canvas使用總結(jié)

需要將一個(gè)背景圖+動態(tài)獲取的文字+微信頭像拼接成一張圖片,用戶可長按保存最終圖片萎战,難免就是要將html轉(zhuǎn)換成圖片咐容。
最初想要自己用canvas畫,但是略麻煩蚂维,后來發(fā)現(xiàn)了html2canvas這個(gè)插件戳粒,先將html轉(zhuǎn)成canvas路狮,再生成圖片。

官網(wǎng)鏈接如下:
http://html2canvas.hertzen.com/

使用起來也很簡單:

 setTimeout(function () {
      html2canvas($('#img_html')[0]).then(function (canvas) {
        var img = new Image()
        img.src = canvas.toDataURL('image/jpeg')
        img.style.cssText += 'position:absolute;width:100%;left:0;top:0;'
        $('#result').append(img)
       })
    }, 1000)

但是踩坑不少蔚约,羅列如下:

  1. 因?yàn)閔tml是動態(tài)生成的奄妨,所以最好加上setTimeout延時(shí)轉(zhuǎn)換成canvas,不然可能html的dom元素還沒加載完苹祟。
  2. canvas.toDataURl()該方法是將canvas轉(zhuǎn)成圖片砸抛,如果html中有跨域請求的圖片資源,那么canvas就會報(bào)錯(cuò)不支持跨域树枫。所以只好將微信頭像先上傳到服務(wù)器的文件系統(tǒng)直焙,請求圖片時(shí),帶上允許跨域的響應(yīng)頭:Access-Control-Allow-Origin: *
  3. 要轉(zhuǎn)換成圖片的 html砂轻,其css樣式要有幾點(diǎn)注意:
  • 親測不能使用rem為單位定義文字大小奔誓、元素寬高等,不然無法顯示該元素
  • 不能添加background搔涝,假如設(shè)置背景顏色為紅色或者一張背景圖厨喂,莫名其妙會多出一個(gè)元素,如下所示:


    原始html

生成的圖片

4.canvas.toDataURl()生成的圖片是base64的格式data:image/jpeg;base64,/9j/4AAQ...庄呈,可以直接作為img標(biāo)簽的src蜕煌。
但是由于是小程序內(nèi)嵌H5,且圖片資源過大诬留,在某些機(jī)型(常見Ios)的微信小程序里面會限流斜纪。當(dāng)生成圖片,準(zhǔn)備渲染的時(shí)候故响,微信要么會直接白屏傀广,要么就是會彈框提醒:該小程序繼續(xù)運(yùn)行會影響微信的使用,強(qiáng)制退出該小程序彩届。

  • 解決方法
function dataURLtoBlob (data_url) {
  let arr = data_url.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  let blob = false
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  try {
    blob = new Blob([u8arr], { type: mime })
  } catch (e) {}
  return blob
}

如上所示伪冰,可將base64轉(zhuǎn)成二進(jìn)制流,資源會減小1到1.5倍樟蠕。

不過在某些安卓國產(chǎn)機(jī)型上贮聂,不支持長按保存該二進(jìn)制流圖片,所以可以設(shè)置僅Ios上轉(zhuǎn)換為二進(jìn)制圖片寨辩。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吓懈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子靡狞,更是在濱河造成了極大的恐慌耻警,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甘穿,居然都是意外死亡腮恩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門温兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秸滴,“玉大人,你說我怎么就攤上這事募判〉春” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵届垫,是天一觀的道長释液。 經(jīng)常有香客問我,道長装处,這世上最難降的妖魔是什么均澳? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮符衔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糟袁。我一直安慰自己判族,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布项戴。 她就那樣靜靜地躺著形帮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪周叮。 梳的紋絲不亂的頭發(fā)上辩撑,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音仿耽,去河邊找鬼合冀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛项贺,可吹牛的內(nèi)容都是我干的君躺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼开缎,長吁一口氣:“原來是場噩夢啊……” “哼棕叫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奕删,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤俺泣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伏钠,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡横漏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贝润。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊茧。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖打掘,靈堂內(nèi)的尸體忽然破棺而出华畏,到底是詐尸還是另有隱情,我是刑警寧澤尊蚁,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布亡笑,位于F島的核電站,受9級特大地震影響横朋,放射性物質(zhì)發(fā)生泄漏仑乌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一琴锭、第九天 我趴在偏房一處隱蔽的房頂上張望晰甚。 院中可真熱鬧,春花似錦决帖、人聲如沸厕九。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扁远。三九已至,卻和暖如春刻像,著一層夾襖步出監(jiān)牢的瞬間畅买,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工细睡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷羞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓溜徙,卻偏偏與公主長得像洒宝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子萌京,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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