欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

小程序canvas生成海報(bào) - 新聞資訊 - 云南小程序開(kāi)發(fā)|云南軟件開(kāi)發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開(kāi)發(fā)/軟件開(kāi)發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 小程序相關(guān) >

小程序canvas生成海報(bào)

發(fā)表時(shí)間:2020-9-29

發(fā)布人:葵宇科技

瀏覽次數(shù):95

小程序canvas生成海報(bào)

  • 先看看效果圖 以下↓
    • 使用場(chǎng)景
    • 前提
    • wxml
    • js
      • drawCanvas.js
      • 在Canvas.js引入drawCanvas.js
    • 希望大家能夠用到!

如果文章中有出現(xiàn)紕漏、錯(cuò)誤之處,還請(qǐng)看到的小伙伴多多指教,先行謝過(guò)

先看看效果圖 以下↓

在這里插入圖片描述

使用場(chǎng)景

  • 分享小程序的,繪制分享圖
  • 不同商品分享的是后生成不同的圖片,每個(gè)商品的信息圖片不同,小程序默認(rèn)分享的是頁(yè)面默認(rèn)截圖
  • 小程序分享朋友圈,生成海報(bào)

前提

  • 根據(jù)上面圖片需要一個(gè)背景圖片(上面是750*777),大家可根據(jù)實(shí)際情況進(jìn)行改變
  • 本文用的是小程序canvas最新api,大家可以閱讀小程序canvas文檔

wxml

<canvas style="width:750px;height:777px;position:absolute;top:0px;left:-2000px;" id="canvas" type="2d"></canvas>

js

drawCanvas.js

[單獨(dú)創(chuàng)建drawCanvas.js存放一些公共函數(shù),里面封裝了圖片渲染文字換行等一些方法(由于畫(huà)布無(wú)法直接使用網(wǎng)絡(luò)圖片,所以需要 wx.downloadFile或者wx.getImageInfo把它下載回來(lái)才能使用,本文使用wx.downloadFile)]


export default {
  // 下載圖片函數(shù)
  downloadImg(img) {
    return new Promise((resolve, reject) => {
      //將網(wǎng)絡(luò)圖片轉(zhuǎn)成本地路徑     
      // wx.getImageInfo({
      //   src: img,
      //   success: function (res) {
      //     resolve(res.path)

      //   }
      // })
      //方法二
      wx.downloadFile({
        url: img,
        success: (res) => {
          let cover = res.tempFilePath;
          resolve(cover)
        },
        fail: (err) => {

          reject(err)
        },
      })
    })
  },
  //圖片渲染
  drawImage(canvas, ctx, imgUrl, x, y, w, h) {
    ctx.save();
    const img = canvas.createImage();
    img.src = imgUrl
    img.onload = () => ctx.drawImage(img, x, y, w, h);
    ctx.closePath();
  },

  //文字換行
  drawTxt: function (ctx, _str, _x, _y, _total, _lineh, _linenum) {
    if (_str == "" || _str == undefined) {
      return;
    }
    var total = _total ? _total : 15; //每行字?jǐn)?shù)(數(shù)字算半個(gè))
    var lineH = _lineh ? _lineh : 20; //行間距
    var lineNum = _linenum ? _linenum : 4; //最大顯示行數(shù)

    /*
    拆解字符串到數(shù)組,按行,每行15個(gè)(判斷數(shù)字占半個(gè),其他占1個(gè))
    */
    var lineArray = [];
    var len = 0; //數(shù)字算半個(gè),中文算一個(gè)
    for (var i = 0; i < _str.length; i++) {
      var line = '';
      if (Math.ceil(len) % total == 0) {
        if (lineArray[lineArray.length - 1] != "") {
          lineArray.push("");
        }
      }
      var index = Math.floor(len / total); //
      lineArray[index] = lineArray[index] + _str[i];

      if (!isNaN(_str[i])) {
        //是數(shù)字
        len = len + 0.5;
      } else {
        len = len + 1;
      }
    }

    for (var i = 0; i < lineArray.length; i++) {
      var t_str = lineArray[i];
      if (lineArray.length > lineNum && i == (lineNum - 1)) {
        //如果總行數(shù)大于設(shè)定的行數(shù),則到最大設(shè)定行時(shí),加省略號(hào),退出
        t_str = t_str + '...'
        ctx.fillText(t_str, _x, _y + lineH * i);
        break;
      } else {
        ctx.fillText(t_str, _x, _y + lineH * i);
      }
    }
  },

  //裁切圓角  
  drawRoundRect: function (cxt, x, y, width, height, radius) {
    cxt.save()
    cxt.beginPath();
    cxt.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
    cxt.lineTo(width - radius + x, y);
    cxt.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
    cxt.lineTo(width + x, height + y - radius);
    cxt.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
    cxt.lineTo(radius + x, height + y);
    cxt.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
    cxt.closePath();
  }
}

在Canvas.js引入drawCanvas.js

import drawCanvas from 'drawCanvas.js';
Page(Object.assign({},drawCanvas, {
 /**
   * 頁(yè)面的初始數(shù)據(jù)
   */
  data: {
    canvasImg: 'https://dss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=2635355882,2630309952&fm=218&app=2&f=JPEG?w=121&h=75&s=FF7204C5C0615D0773AD7CD103003098' // 實(shí)例
  },
 /**
   * 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
   */
 >: function (options) {
    this.shareCreate()
  },
  //分享微信朋友圈
  async shareCreate() {
    var self = this;
    //self.downloadImg是drawCanvas.js里面方法
    let imgUrl = await self.downloadImg(self.data.canvasImg);
    wx.nextTick(() => { self.drawAll(imgUrl) })
  },
    drawAll(imgUrl) {
    const query = wx.createSelectorQuery()
    const node = query.select('#canvas').node();
    var self = this;
    node.exec(async res => {
      const canvas = res[0].node;
      //設(shè)置寬高
      canvas.width = canvas._width
      canvas.height = canvas._height
      const ctx = canvas.getContext('2d');
      //背景圖
      await self.drawImage(canvas, ctx, "/images/shareImg.png", 0, 0, 750, 777);

      //cover
      await self.drawImage(canvas, ctx, imgUrl, 0, 0, 750, 460);

      //logo
      await self.drawImage(canvas, ctx, imgUrl, 50, 525, 363, 45);


      setTimeout(async () => {
        //背景透明
        ctx.fillStyle = 'rgba(0, 0, 0, 0.6)';
        ctx.fillRect(0, 0, 750, 460);
        //繪制空心矩形
        ctx.strokeStyle = 'rgba(0, 0, 0, 0.6)';
        ctx.strokeRect(0, 0, 750, 460);
        ctx.save();
        //title
        ctx.textAlign = 'left';
        ctx.fillStyle = 'rgba(255, 255, 255, 1)';
        ctx.font = "normal bold 41px PingFangSC-Regular";
        self.drawTxt(ctx, "測(cè)試卡片", 50, 390, 30, 50, 1);

        //desc
        ctx.textAlign = 'left';
        ctx.fillStyle = "#1e1e1e";
        ctx.font = "normal normal 28px PingFangSC-Regular";
        self.drawTxt(ctx, "測(cè)試卡片測(cè)試卡片測(cè)試卡測(cè)試卡片片測(cè)試卡片測(cè)試卡片測(cè)試卡片測(cè)試卡片測(cè)試卡片測(cè)試卡片片測(cè)試卡片測(cè)試卡片", 159, 661, 18, 43, 2);
        //裁切圓角 
        self.drawRoundRect(ctx, 50, 625, 92, 92, 46);
        ctx.clip();
        ctx.stroke();
        //頭像
        await self.drawImage(canvas, ctx, imgUrl, 50, 625, 92, 92);
        ctx.restore();
        ctx.closePath();
        //canvas轉(zhuǎn)成圖片
        self.previewHB(canvas)
      }, 500)


    })
  },
   //圖片預(yù)覽
  previewHB(canvas) {
    var self = this;
    wx.nextTick(() => {
      //轉(zhuǎn)換圖片
      wx.canvasToTempFilePath({
        canvas: canvas,
        success:async (res)=> {
          let img=res.tempFilePath
          //預(yù)覽
          wx.previewImage({
            urls: [img]
          })
        }
      })
    })
  },
}})

希望大家能夠用到!

相關(guān)案例查看更多