微信小程序生成分享海報(bào)(附帶二維碼生成)

昨天寫(xiě)了一篇小程序本地生成二維碼的功能 小程序本地生成二維碼漫谷,趁熱打鐵今天給大家分享一下小程序內(nèi)生成海報(bào)的功能以及具體步驟

這次分享海報(bào)里面的元素比較少,進(jìn)行繪制的分別有頭像拿霉,海報(bào)背景以及二維碼(二維碼的生成請(qǐng)看上面《小程序本地生成二維碼》一文)曹体,此次沒(méi)有涉及到文字的繪制扳缕,不過(guò)原理大致相同,這篇文章就不對(duì)文字繪制進(jìn)行闡述了举畸。

下面我們就開(kāi)始吧??
注:實(shí)現(xiàn)基于mpvue框架查排,如果使用小程序自有框架直接開(kāi)發(fā)需要少許改動(dòng)

流程

0-1

0-2

在(0-1)頁(yè)面點(diǎn)擊“生成專屬海報(bào)” > 跳轉(zhuǎn)到(0-2)頁(yè)面進(jìn)行海報(bào)

資源前期準(zhǔn)備

在生成海報(bào)之前需要準(zhǔn)備,頭像抄沮,海報(bào)背景圖以及二維碼
為了在海報(bào)生成是頁(yè)面沒(méi)有閃動(dòng)或者卡頓跋核,需要先在(0-1)頁(yè)面把這些數(shù)據(jù)準(zhǔn)備好

需要注意的是,生成海報(bào)時(shí)需要時(shí)臨時(shí)文件或者是本地文件合是,如果是網(wǎng)絡(luò)圖片了罪,需要通過(guò)wx.getImageInfo() api獲取圖片的臨時(shí)路徑

這里頭像用到的是網(wǎng)絡(luò)路徑,所以需要獲取頭像的臨時(shí)臨時(shí)路徑聪全,海報(bào)背景在本地直接用本地路徑即可
二維碼則通過(guò)weapp-qrcode生成后返回臨時(shí)路徑進(jìn)行使用(生成邏輯詳見(jiàn)文章開(kāi)頭“小程序本地生成二維碼”)
準(zhǔn)備完成后將資源信息以參數(shù)的形式傳給(0-2)頁(yè)面

let shareInfo = {
  headerImg: 'tempfilepath',
  bgImg: '本地路徑的圖片',
  qrcode: 'tempfilepath'
}
wx.navigateTo({
  url: '/pages/createPoster/main?shareInfo=' + JSON.stringify(shareInfo)
})

獲取資源

在(0-2)中獲取參數(shù)
我們公司的工程是通過(guò)mpvue搭建的,獲取方法是

mounted () {
  const options = this.$root.$mp.query
  this.shareInfo= JSON.parse(options.shareInfo)
}
// 如果是通過(guò)微信開(kāi)發(fā)工具直接開(kāi)發(fā)則在onLoad函數(shù)中獲取options
onLoad (options) {
  const shareInfo = JSON.parse(options.shareInfo)
}

生活?yuàn)蕵?lè):夏天到了辅辩,來(lái)喝點(diǎn)雪碧可樂(lè)吧?

畫(huà)布的樣式

由于在獲取臨時(shí)路勁保存圖片的時(shí)候用一倍的canvas保存的圖片會(huì)很模糊难礼,我們需要對(duì)canvas畫(huà)布進(jìn)行多倍處理,一般二倍即可玫锋,太大了在Android上可能會(huì)出現(xiàn)問(wèn)題

也可以以像素比為倍率蛾茉,這樣比較好處理,這里用的是像素比撩鹿,具體如下

wx.getSystemInfo({
  success (res) {
    // 通過(guò)像素比計(jì)算出畫(huà)布的實(shí)際大星妗(330x490)是展示的出來(lái)的大小
    this.width = 330 * res.pixelRatio
    this.height = 490 * res.pixelRatio
  }
})
// 結(jié)構(gòu)樣式
<canvas class="canvas-poster" id="canvasPoster" :style="{width:width+'px;',height: height+'px'}" canvas-id="canvasPoster"></canvas>
<img :src="poster" class="poster-img" @click="previewImg" alt="">
<div type="button" @click="savePoster" class="save-btn">
  <img src="../img/0.3_btn_yellow_bg.png" alt="">
  <div class="btn-text">保存圖片</div>
</div>
.canvas-poster{
  background-color: #fafafa;
  zoom: 50%; // 將畫(huà)布縮小到50%(最好通過(guò)像素比進(jìn)行縮小,像素比是2的話就是50%节沦,如果不全是以像素比為標(biāo)準(zhǔn)键思,在生成圖片的時(shí)候可能會(huì)出現(xiàn)四周黑邊)
  position: absolute;
  left: -10000px; // 將畫(huà)布隱藏在可視區(qū)域外
  background: #206949;
}

生成之前獲取畫(huà)布信息

mounted () {
  var query = wx.createSelectorQuery()
  query.select('#canvasPoster').boundingClientRect((res) => {
    // 返回值包括畫(huà)布的實(shí)際寬高
    this.drawImage(res)
  }).exec()
}

生成邏輯

methods: {
  drawImage (canvasAttrs) {
    let ctx = wx.createCanvasContext('canvasPoster', this)
    let canvasW = canvasAttrs.width // 畫(huà)布的真實(shí)寬度
    let canvasH = canvasAttrs.height //畫(huà)布的真實(shí)高度
    // 頭像和二維碼大小都需要在規(guī)定大小的基礎(chǔ)上放大像素比的比例后面都會(huì) *this.systemInfo.pixelRatio
    let headerW = 48 * this.systemInfo.pixelRatio
    let headerX = (canvasW - headerW) / 2
    let headerY = 40 * this.systemInfo.pixelRatio
    let qrcodeW = 73 * this.systemInfo.pixelRatio
    let qrcodeX = 216 * this.systemInfo.pixelRatio
    let qrcodeY = 400 * this.systemInfo.pixelRatio
    // 填充背景
    ctx.drawImage(this.shareInfo.bgImg, 0, 0, canvasW, canvasH)
    ctx.save()
    // 控制頭像為圓形
    ctx.setStrokeStyle('rgba(0,0,0,.2)') //設(shè)置線條顏色,如果不設(shè)置默認(rèn)是黑色甫贯,頭像四周會(huì)出現(xiàn)黑邊框
    ctx.arc(headerX + headerW / 2, headerY + headerW / 2, headerW / 2, 0, 2 * Math.PI)
    ctx.stroke()
    //畫(huà)完之后執(zhí)行clip()方法吼鳞,否則不會(huì)出現(xiàn)圓形效果
    ctx.clip()
    // 將頭像畫(huà)到畫(huà)布上
    ctx.drawImage(this.shareInfo.headerImg, headerX, headerY, headerW, headerW)
    ctx.restore()
    ctx.save()
    // 繪制二維碼
    ctx.drawImage(this.shareInfo.qrcode, qrcodeX, qrcodeY, qrcodeW, qrcodeW)
    ctx.save()
    ctx.draw()
    setTimeout(() => {
      //下面的13以及減26推測(cè)是因?yàn)樵趯?xiě)樣式的時(shí)候?qū)懥斯潭ǖ膠oom: 50%而沒(méi)有用像素比縮放導(dǎo)致的黑邊,所以在生成時(shí)進(jìn)行了適當(dāng)?shù)目s小生成叫搁,這個(gè)大家可以自行嘗試
      wx.canvasToTempFilePath({
        canvasId: 'canvasPoster',
        x: 13,
        y: 13,
        width: canvasW - 26,
        height: canvasH - 26,
        destWidth: canvasW - 26,
        destHeight: canvasH - 26,
        success: (res) => {
          this.poster = res.tempFilePath
        }
      })
    }, 200)
  },
  previewImg () {
    if (this.poster) {
      //預(yù)覽圖片赔桌,預(yù)覽后可長(zhǎng)按保存或者分享給朋友
      wx.previewImage({
        urls: [this.poster]
      })
    }
  },
  savePoster () {
    if (this.poster) {
      wx.saveImageToPhotosAlbum({
        filePath: this.poster,
        success: (result) => {
          wx.showToast({
            title: '海報(bào)已保存,快去分享給好友吧渴逻。',
            icon: 'none'
          })
        }
      })
    }
  }
}

以上就是今天分享的所有內(nèi)容了疾党,謝謝觀看,喜歡可以點(diǎn)贊加關(guān)注哦??

相關(guān)推薦

微信小程序內(nèi)生成二維碼

[微信小程序分享小程序碼的生成(帶參數(shù))以及參數(shù)的獲取]

微信小程序生成清晰海報(bào)(http://www.reibang.com/p/108233ed7ed0)

簡(jiǎn)單實(shí)現(xiàn)小程序自定義導(dǎo)航欄(基于mpvue)

微信小程序中的版本管理

生活?yuàn)蕵?lè)

惨奕!驚雪位,跑步竟然能跑出錢(qián)來(lái)(你的額外收入)

大家注意啦,產(chǎn)品經(jīng)理打人啦墓贿!(一)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茧泪,一起剝皮案震驚了整個(gè)濱河市蜓氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌队伟,老刑警劉巖穴吹,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嗜侮,居然都是意外死亡港令,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)锈颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)顷霹,“玉大人,你說(shuō)我怎么就攤上這事击吱×艿恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵覆醇,是天一觀的道長(zhǎng)朵纷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)永脓,這世上最難降的妖魔是什么袍辞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮常摧,結(jié)果婚禮上搅吁,老公的妹妹穿的比我還像新娘。我一直安慰自己落午,他們只是感情好谎懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著板甘,像睡著了一般党瓮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盐类,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天寞奸,我揣著相機(jī)與錄音,去河邊找鬼在跳。 笑死枪萄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猫妙。 我是一名探鬼主播瓷翻,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了齐帚?” 一聲冷哼從身側(cè)響起妒牙,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎对妄,沒(méi)想到半個(gè)月后湘今,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剪菱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年摩瞎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孝常。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旗们,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出构灸,到底是詐尸還是另有隱情上渴,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布冻押,位于F島的核電站驰贷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洛巢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一次兆、第九天 我趴在偏房一處隱蔽的房頂上張望稿茉。 院中可真熱鬧,春花似錦芥炭、人聲如沸漓库。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渺蒿。三九已至,卻和暖如春彪薛,著一層夾襖步出監(jiān)牢的瞬間茂装,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工善延, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留少态,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓易遣,卻偏偏與公主長(zhǎng)得像彼妻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 從微信小程序發(fā)布到現(xiàn)在經(jīng)手的小程序也有好幾個(gè)了侨歉,開(kāi)發(fā)過(guò)程中多少會(huì)遇到一些坑屋摇,這里匯總一下開(kāi)發(fā)中遇到過(guò)的坑與小程序開(kāi)...
    HelloKang閱讀 5,332評(píng)論 0 3
  • 本文主要講解小程序二維碼的基本概念,幫助開(kāi)發(fā)和運(yùn)營(yíng)人員更好的掌握小程序參數(shù)二維碼幽邓,同時(shí)也包含小程序二維碼官方文檔解...
    zhuyuansj閱讀 11,064評(píng)論 0 16
  • 有個(gè)街坊颊艳,他是老板的時(shí)候我還未起步茅特,當(dāng)我成了老板,他已經(jīng)是大老板了棋枕。擁有灑店白修、醫(yī)院、百貨批發(fā)等產(chǎn)業(yè)重斑,名副其實(shí)的千萬(wàn)...
    木易葉子閱讀 353評(píng)論 6 7
  • 清輝一縷過(guò)山門(mén)兵睛, 月影送花魂。 信步池塘小徑窥浪, 萋萋芳草成蔭祖很。 嬌荷弄舞, 蓮苞染絳漾脂, 碧水波粼假颇。 陶醉清幽美景,...
    四海閑人閱讀 545評(píng)論 7 15
  • 丑小鴨的故事我們都耳熟能詳骨稿,丑小鴨生下來(lái)就和別的鴨子不一樣笨鸡,它又大又丑,在哪里都受到排擠和歧視坦冠,但最終經(jīng)過(guò)不懈...
    牽著蝸牛去旅行1閱讀 675評(píng)論 0 1