一级片大奶子_色又黄又爽18禁免费视频_热久久久久久久_久久久精品一区二区_日韩av不卡在线播放_精品国内自产拍在线观看视频

商城系統(tǒng) 注冊(cè)

小程序生成海報(bào)保存分享圖片完全指南

2020-09-27|HiShop
導(dǎo)讀:在我們分享小程序時(shí),會(huì)有一個(gè)圖片式的海報(bào),這種功能顯示是如何顯示的,下面小編為大家解答小程序生成海報(bào)保存分享圖片完全指南...

在我們分享小程序時(shí),會(huì)有一個(gè)圖片式的海報(bào),這種功能顯示是如何顯示的,下面小編為大家解答小程序生成海報(bào)保存分享圖片完全指南

小程序生成海報(bào)保存分享圖片完全指南

業(yè)務(wù)

在小程序中生成海報(bào)(包括用戶頭像和自定義文字)并且保存到本地

實(shí)現(xiàn)思路

利用canvas畫布,把用戶頭像和自定義文字定位好,用戶點(diǎn)擊按鈕保存到本地

小程序生成海報(bào)保存分享圖片完全指南

注意事項(xiàng) 難點(diǎn)

小程序canvas不支持自定義寬高,反正我沒找到,canvas畫布大部分業(yè)務(wù)都需要全屏,響應(yīng)式,至少寬100%
解決方案:判斷到屏幕尺寸,傳到wxml 里面
遠(yuǎn)程圖片不能直接使用 getImageInfo 獲取,需要保存到本地
解決方案:canvas直接支持遠(yuǎn)程圖片,不需要使用這個(gè)api

技術(shù)棧

  • canvas
  • wx.createCanvasContext
  • wx.canvasToTempFilePath
  • Promise

實(shí)戰(zhàn)

首先我們?cè)趙xml里面寫一個(gè)canvas占位
注意這里的寬度是100%,響應(yīng)式,海報(bào)的高posterHeight 是從js里面動(dòng)態(tài)計(jì)算的
<canvas canvas-id="starkImg" style="width:100%;height:{{posterHeight}}px;"></canvas>

根據(jù)屏幕動(dòng)態(tài)計(jì)算海報(bào)的尺寸

data: {
  motto: 'Hello World',
  hidden: true,
  userInfo: {},
  hasUserInfo: false,
  windowWidth: '',
  posterHeight: '',
},
onLoad: function () {
  const poster = {
    "with": 375,
    "height": 587
  }
  const systemInfo = wx.getSystemInfoSync()
  let windowWidth = systemInfo.windowWidth
  let windowHeight = systemInfo.windowHeight
  let posterHeight = parseInt((windowWidth / poster.with) * poster.height)
  this.setData({
    windowWidth: windowWidth,
    posterHeight: posterHeight
  })
}

背景圖片生成

  const that = this
  // 圖片路徑
  const imagePath = '../../static/image/common/'
  let bgimgPromise = new Promise(function (resolve, reject) {
    console.log('data', that.data)
    wx.getImageInfo({
      src: imagePath + "base.png",
      success: function (res) {
        resolve(res);
      }
    })
  });

頭像直接使用遠(yuǎn)程頭像

初始化的時(shí)候,調(diào)取,一定在生成海報(bào)之前
此處可以存儲(chǔ)本地,或使用狀態(tài)都可以

wxml

// 可以從后端接口獲取 或 官方本身遠(yuǎn)程地址

 
  <button class="share" type="primary" open-type="getUserInfo" bindgetuserinfo="getUserInfo">開始答題(獲取用戶信息)</button>

js

  getUserInfo: function (e) {
    app.globalData.userInfo = e.detail.userInfo
    let userInfo = e.detail.userInfo
    console.log('userInfo', userInfo)
    // 更新用戶信息
    // api.post('更新用戶信息的url', userInfo)
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  },

生成海報(bào)背景和圖片

wxml

bgimgPromise.then(res => {
      console.log('Promise.all', res)
      const ctx = wx.createCanvasContext('shareImg')
      ctx.width = windowWidth
      ctx.height = posterHeight
      console.log(windowWidth, posterHeight)
      // 背景圖
      ctx.drawImage('../../' + res[0].path, 0, 0, windowWidth, posterHeight, 0, 0)
      // 頭像
      ctx.drawImage(that.data.userInfo.avatarUrl, 48, 182, 58, 58, 0, 0)
      ctx.setTextAlign('center')
      ctx.setFillStyle('#000')
      ctx.setFontSize(22)
      // ctx.fillText('分享文字2:stark.wang出品', 88, 414)
      ctx.fillText('分享文字1我的博客:https://shudong.wang', 55, 414)
      ctx.stroke()
      ctx.draw()
    })

保存到本地

onLoad: function () {
  share: function () {
    var that = this
    wx.showLoading({
      title: '正在制作海報(bào)。。。'
    })
    new Promise(function (resolve, reject) {
      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: 444,
        height: 500,
        destWidth: 555,
        destHeight: 666,
        canvasId: 'starkImg',
        success: function (res) {
          console.log(res.tempFilePath);
          that.setData({
            prurl: res.tempFilePath,
            hidden: false
          })
          wx.hideLoading()
          resolve(res)
        },
        fail: function (res) {
          console.log(res)
        }
      })
    }).then(res => {
      console.log(res)
      this.save()
    })
  }
}

更新頭像裁剪為圓形

ctx.save() // 對(duì)當(dāng)前區(qū)域保存
ctx.beginPath() // 開始新的區(qū)域
ctx.arc(73, 224, 38, 0, 2 * Math.PI);
ctx.clip();  // 從畫布上裁剪出這個(gè)圓形
ctx.drawImage(res[1], 36, 186, 94, 94, 0, 0) // 把圖片填充進(jìn)裁剪的圓形
ctx.restore() // 恢復(fù)

上面是遠(yuǎn)程連接容易發(fā)生請(qǐng)求失敗

把頭像提前存到本地存儲(chǔ)中解決
getImg: function () {
  let avatarUrl = this.data.userInfo.avatarUrl
  downLoadFile(avatarUrl).then((res) => {
    console.log(res)
    wx.saveFile({
      tempFilePath: res.data.tempFilePath,
      success: function (res) {
        wx.setStorageSync('avatarUrl', res.savedFilePath)
      }
    })
  })
},

獲取頭像

// 頭像
let promiseAvatarUrl = new Promise(function (resolve, reject) {
  resolve(wx.getStorageSync('avatarUrl'))
}).catch(res=>{
  console.log('catch',res)
});

背景還是不變

const that = this
let promiseBdImg = new Promise(function (resolve, reject) {
  console.log('data', that.data)
  wx.getImageInfo({
    src: imagePath + "base1.png",
    success: function (res) {
      console.log('promiseBdImg', res)
      resolve(res);
    }
  })

此時(shí)生成canvas更新

Promise.all([
    promiseBdImg, promiseAvatarUrl
  ]).then(res => {
    console.log('Promise.all', res)
    const ctx = wx.createCanvasContext('shareImg')
    ctx.width = windowWidth
    ctx.height = posterHeight
    console.log(windowWidth, posterHeight)
    //主要就是計(jì)算好各個(gè)圖文的位置
    ctx.drawImage('../../' + res[0].path, 0, 0, windowWidth, posterHeight, 0, 0)
    ctx.save() // 對(duì)當(dāng)前區(qū)域保存
    ctx.beginPath() // 開始新的區(qū)域
    ctx.arc(73, 224, 38, 0, 2 * Math.PI);
    ctx.clip();  // 從畫布上裁剪出這個(gè)圓形
    ctx.drawImage(res[1], 36, 186, 94, 94, 0, 0) // 把圖片填充進(jìn)裁剪的圓形
    ctx.restore() // 恢復(fù)
    ctx.setTextAlign('center')
    ctx.setFillStyle('#000')
    ctx.setFontSize(22)
    ctx.save()
    ctx.beginPath();
    ctx.fillText('作者:stark.wang', 545 / 2, 130)
    ctx.fillText('我的博客:http://shudong.wang', 190, 414)
    ctx.stroke()
    ctx.draw()
  })

以上是小程序生成海報(bào)保存分享圖片完全指南,更多小程序開發(fā)內(nèi)容,請(qǐng)查看本網(wǎng)站,謝謝。

HiShop小程序工具提供多類型商城/門店小程序制作,可視化編輯 1秒生成5步上線。通過拖拽、拼接模塊布局小程序商城頁(yè)面,所看即所得,只需要美工就能做出精美商城。更多小程序商店請(qǐng)查看:小程序商店

電話咨詢 預(yù)約演示 0元開店
主站蜘蛛池模板: 无码免费婬=aV片在线观看|免费黄色小视频在线观看|eeuss鲁丝片=aV无码|国产精品videossexohd|亚洲欧美成人一区二区在线|久久www免费人成网站 | 在线视频免费观看爽爽爽|午夜视讯|国产传媒在线视频|综合国产一区|#NAME?|777午夜精品 | 秋霞国产精品一区二区|无遮无挡非常色的视频免费|日韩不卡一卡二卡3卡四卡网站|在线高清国语成人网站|2020天天干夜夜爽|国产99视频精品免费专区 | 巜豪妇荡乳2在线观看|又粗又硬进去好爽=a片视频野花|6969成人亚洲婷婷|99视频免费播放|97国产在线播放第一页|人人人澡人人人妻人人人少妇 | 无码国产精品一区二区VR|欧美精品亚洲精品日韩专区v=a|欧美xxx久久|黄在线观看免费|国产草草草|7777kkk亚洲综合欧美网站 | 久久精品欧美一区二区|国产91精品网站|精品免费|亚洲=aV无码一区二区乱孑伦=aS|超碰影院在线观看|內射XXX韩国在线观看 | 国产精品视频专区|国产在线国产|精品一区二区三区成人精品|国产不卡在线观看免费视频|蜜桃综合|欧美精品日韩一区 | 麻豆精品蜜桃|黄网wwwccc|色自拍偷拍|久久亚洲精品无码网站|国产成人免费视频在线网站2|久久久老熟女一区二区三区91 | pron麻豆|66lu国产在线观看|久久WWW免费人成一看片|亚洲精品乱码久久久久久久久|国语高潮无遮挡无码免费看|成人在线观看18 | 91九色porny视频|亚洲4区|日本一区久久|中国老太卖婬HD播放|日本公妇被公侵犯中文字幕|www.youjizz视频 | 色综合天天综合高清网国产在线|国产精品九九九九|国产乱妇乱子|国产色情理论在线观看视频|久久影院精品|寂寞骚妇被后入式爆草抓爆 | 久久综合婷婷|中文日产幕无线码一二|77777五月色婷婷丁香视频在线|粉嫩=av久久一区二区三区小说|亚洲成人网络|亚洲色欲色欲77777小说 | 国产黄=a一级|亚洲人成网站18禁止人|#NAME?|视频一区二区高清在线播放|在线看一区|伊人久久大香线蕉=aV一区 | 黄色一级短视频|啊片在线观看|91精品xxxx瑜伽裤日本|成人免费观看cn|亚洲熟妇色自偷自拍另类|免费=a观看 | 午夜免费啪视频在线体验区|亚洲成本人片无码免费|亚洲=av成人无码网站色优|自拍偷拍第1页|久久精品性一区区裸体艺术|久久久久亚洲=av成人动图 | 国产一级做=a爱片久久毛片=a|www.欧美视频|亚洲自国产拍揄拍|龙珠超二在线观看免费国语高清|羞羞答答=av成人免费看|99日精品视频 | 欧美野外伦姧在线观看|人妻饥渴偷公乱中文字幕|麻豆宣传片|#NAME?|色网激情|亚洲欧美日韩视频一区 | 亚洲乱小说|未满十八18禁止免费无码网站|日韩=av免费网址|在线国v免费看|人成午夜大片免费视频77777|亚洲激情影院 | 性欧美欧美巨大69|亚洲热色|性欧美另丰满69xxxxx|国产精品伦|中文字幕在线官网|成=a人片国产精品 | xvideos国产在线观看|国内精自视频品线一区|国产免费久久精品99RESW=aG|又大又长粗又爽又黄少妇视频|毛片大片|成人一区二区三区在线 | 亚洲午夜久久久综合37日本|欧美高潮抽搐喷水大叫|啪一啪鲁一鲁|亚洲欧洲美洲无码精品V=a|亚洲高清视频网站|三级黄色影院 | 亚洲妇女多毛撒尿XXXⅩ|黄色毛片黄色毛片|公和我做好爽添厨房|日本韩国最新免费观看|日本=a∨精品中文字幕在线|国产免费拔擦拔擦8X高清在线 | 日本免费一区二区三区日本|特=a级片|人人看人人做|乱码精品一卡二卡无卡|经典一区二区三区|国产999在线观看 | 野花社区WWW在线全网|久久在线观看|日本久操|久久黄色小说|亚洲=aV无码一区东京热久久|成人无码小视频在线观看 | 亚洲性久久|欧美三级图片|日韩美一区二区|13小箩利洗澡无码视频网站免费|114一级片|91免费观看国产 | 美女视频黄的全是免费|欧美丰满熟妇XXXX性PPX人交|色屁屁一区|#NAME?|国产特级毛片=a=a=a=a=a=a喷潮|免费高潮视频 | 爱情到此为止在线观看|精品热99|老熟女多次高潮露脸视频|91国偷自产一区二区三区老熟女|美女久久久久久久久|高潮VPSWINDOWS国产乱 | 黄色国产毛片|成年人啪啪|午夜影院免费观看视频|久久免费精品国自产拍网站|成人免费=a级毛片韩国|www.伊人网 | 亚洲乱小说|未满十八18禁止免费无码网站|日韩=av免费网址|在线国v免费看|人成午夜大片免费视频77777|亚洲激情影院 | 亚洲精品久久久久一区二区|啊灬啊灬啊灬快灬高潮了视频网站|国产妇女野外牲一级毛片|两个人的房间高清在线观看|国产chinese男男G=aYG=aY视频网站|日本=aⅴ毛片成人偷拍 | 国产成人毛片在线视频|视频在线播放|91福利在线看|国产亚洲无|天堂一区二区三区在线|日韩精品一卡 | 日本一区二区三区四区视频|亚洲一区黄色|久久综合狠狠综合久久狠狠色综合|法国性xxxxx极品|久久无码=aV中文出轨人妻|无码少妇一区二区三区=av | 成www日本在线观看|绯色=av麻豆一区二区懂色|玩弄j=ap=an白嫩少妇hd|国产精品永久久久|日本无卡码高清免费v|河北炮打泻火老熟女 | 亚洲精品成人|疯狂做受XXXX欧美老人|亚洲精品视频在线观看免费|亚洲一区二区三区在线播放|在线日韩欧美|东京热无码人妻系列综合网站 | www.超碰在线.com|日本在线观看无码不卡V|免费观看日本污污ww网站|一区2区|91福利区|国产精品久久久久久238 | 国产精品亚洲专区无码蜜芽|国产一级内谢一级一内高请|无码孕妇孕交在线观看|免费的欧美gv在线网站|精品美女=av|亚洲综合久久精品无码色欲 | 欧美激情视频一区|欧美9999|各种少妇正面bbw撒尿|黄视频网站在线|97综合在线|一本大道在线无码一区 | 澳门成免费crm大全|日韩在线精品成人=aV|精品国产一区二区三区成人影院|日韩=av中文无码影院|久久最新金品视频免费播放|国产精品1卡2卡3卡4卡 | 久久网国产|国产精品久99|国产hsck在线亚洲|性导航唐人社区|久久精品国产亚洲=aV高清色欲|久久99精品久久久久久久夜夜爽 | 久久久久动漫|亚洲影视资源网|久操福利在线|娇小小小泬ⅩXXX深喉|中文字幕乱码中文乱码777|超碰在线个人 | 欧美高清福利|免费亚洲黄色|黄片毛片免费|亚洲欧美日韩在线资源观看|国产精品久久久久久久久久久久午|日本三级播放 |