使用vue實(shí)現(xiàn)HTML頁面生成圖片

1.生成帶logo的二維碼

用vue_qrcodes生成帶logo的二維碼

安裝:npm install vue_qrcodes -- save

使用:

<!--部分html代碼-->

<qrcode :url="qrcodeUrl"

? ? ? ? :iconurl="iconurl"

? ? ? ? :wid="298"

? ? ? ? :hei="278"

? ? ? ? :imgwid="100"

? ? ? ? :imghei="100">

</qrcode>

// 部分js代碼

import qrcode from 'vue_qrcodes'

//...省略其他代碼

components: {

? ? qrcode

}

問題來了:二維碼出現(xiàn)了,但是二維碼和logo大小并不是你想要,無法自適應(yīng)。那就需要我們重置二維碼和logo的樣式。

.logoimg {

? ? ? height: 100px !important;

? ? ? width: 100px !important;

? ? ? margin-top: -50px !important;

? ? ? margin-left: -50px !important;

? ? }

#qrcode {

? ? ? margin-top: 20px;

? ? ? img {

? ? ? ? height: 278px !important;

? ? ? ? width: 298px !important;

? ? ? }

? ? }

html轉(zhuǎn)化為base64圖片

html轉(zhuǎn)化為canvas中我選用組件html2canvas

yarn add html2canvas

import html2canvas from 'html2canvas'

為了防止頁面有閃屏我用了兩個(gè)div,一個(gè)存放原來的dom,一個(gè)存放canvas的生成的圖片,再v-if控制展示的元素。

js調(diào)用函數(shù):

htmlToCanvas() {

? html2canvas(this.$refs.bill, {})

? .then((canvas) => {

? ? let imageUrl = canvas.toDataURL('image/png'); // 將canvas轉(zhuǎn)成base64圖片格式

? ? this.canvasImageUrl = imageUrl;

? ? this.isDom = false;

? });

}

// 二維碼地址

this.qrcodeUrl = data.data.inviteCodeAddress

// 調(diào)用html轉(zhuǎn)化canvas函數(shù)

this.htmlToCanvas();

結(jié)果如圖:

頁面轉(zhuǎn)化成了圖片,但是二維碼沒有展示出來,控制臺(tái)報(bào)錯(cuò):


除二維碼其他部分已經(jīng)轉(zhuǎn)化為圖片,二維碼不顯示,原因有兩種可能:

轉(zhuǎn)化時(shí)二維碼還沒有加載完成

轉(zhuǎn)化二維碼的過程中報(bào)錯(cuò)了

首先嘗試了nextTick

使用 nextTick 將回調(diào)延遲到下次DOM更新循環(huán)之后執(zhí)行

// 二維碼地址

this.qrcodeUrl = data.data.inviteCodeAddress

this.$nextTick(() => {

? ? // 跳用html轉(zhuǎn)化canvas函數(shù)

? ? this.htmlToCanvas();

})

發(fā)現(xiàn)二維碼出來了,但是二維碼的大小不對(duì),并且控制臺(tái)還是存在報(bào)錯(cuò)。雖然問題沒有完全解決,但是二維碼出現(xiàn)了??梢宰C明二維碼不展示的原因是,轉(zhuǎn)化時(shí)二維碼沒有加載完成。

再嘗試使用setTimeout

使用 setTimeout 將回調(diào)延遲到指定時(shí)間之后執(zhí)行

// 二維碼地址

this.qrcodeUrl = data.data.inviteCodeAddress

setTimeout(()=>{

? ? // 調(diào)用html轉(zhuǎn)化canvas函數(shù)

? ? this.htmlToCanvas();

}, 200)

查看效果:

注:setTimeout是我目前能想到延遲加載方法。各位大佬們,如果這個(gè)有更好的方法解決上面的問題,麻煩給留言,在此謝過。

頁面正常,控制臺(tái)沒有報(bào)錯(cuò),可是logo沒有展示出來。

logo地址是:

iconurl: 'https://static.daojia.com/assets/project/tosimple-pic/LOGO_1576564983633.png',

項(xiàng)目在本地啟動(dòng),可能存在跨域問題。

htmlToCanvas() {

? ? ? html2canvas(this.$refs.bill, {

? ? ? ? useCORS: true // 解決圖片跨域問題

? ? ? }).then((canvas) => {

? ? ? ? // 將canvas轉(zhuǎn)成base64圖片格式

? ? ? ? let imageUrl = canvas.toDataURL('image/png');

? ? ? ? this.canvasImageUrl = imageUrl;

? ? ? ? this.isDom = false;

? ? ? }).catch((e) => console.log(e));

? ? }

至此html成功轉(zhuǎn)化為圖片。

圖片保存至手機(jī)

首先嘗試了JS-SDK中的下載圖片downloadImage

經(jīng)過各種嘗試并不能實(shí)現(xiàn)。

最后采用的是微信長(zhǎng)按保存圖片

海報(bào)部分已經(jīng)轉(zhuǎn)化為圖片,無需再開發(fā),只要提示用戶長(zhǎng)按圖片可以保存即可。

注 :各位大佬們?nèi)绻玫姆椒ū4鎴D片至手機(jī)相冊(cè),歡迎留言

最后

本文介紹海報(bào)保存至手機(jī)相冊(cè)的實(shí)現(xiàn)流程,部分環(huán)節(jié)上還存在優(yōu)化空間,歡迎大家批評(píng)與指正,共同進(jìn)步。

?著作權(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)容

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