首頁 >微信小程式 >小程式開發 >微信小程式透過保存圖片分享到朋友圈的功能實現

微信小程式透過保存圖片分享到朋友圈的功能實現

不言
不言原創
2018-06-26 15:51:066129瀏覽

這篇文章主要介紹了關於微信小程式透過保存圖片分享到朋友圈的功能實現,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

小程序內是不能直接分享到朋友圈的。所以只能透過產生圖片,攜帶小程式二維碼,儲存到手機相冊,讓使用者自己選擇發到朋友圈。然後可以透過在小程式中識別二維碼來進入小程式的指定頁面。下面小編跟大家分享實作程式碼,需要的朋友參考下吧

說明

#首先說明一點,小程式內是不能直接分享到朋友圈的。所以只能透過產生圖片,攜帶小程式二維碼,儲存到手機相冊,讓使用者自己選擇發到朋友圈。然後可以透過在小程式中識別二維碼來進入小程式的指定頁面。參考市面上支援分享的應用,基本上都是這種實現方式。

準備階段

1.透過伺服器取得小程式碼

這裡可以參考下微信的官方文檔,給後台指定的參數和路徑等信息,讓後台產生指定的小程式碼。然後呼叫wx.getImageInfo將後台產生的小程式碼儲存起來。

注意一定要仔細看下微信的文檔,如果產生小程式碼的路徑正式伺服器不存在,將會產生失敗。這點也很蛋疼,很不方便調試。

wx.getImageInfo({            
  src:'https://xxx.jpg',//服务器返回的带参数的小程序码地址
  success: function (res) {
    //res.path是网络图片的本地地址
    qrCodePath = res.path;
  },
  fail: function (res) {
    //失败回调
  }
});

1.透過canvas繪製所需資訊

#準備好所有的圖片之後就可以透過canvas繪製了,然後再將canvas匯出為圖片。關於繪製這塊,可以參考微信的canvas api,下面的基本上都是查著api的方法走的。

其中需要注意的有幾點。

1.是不知道繪出來的文字長度,所以不知道文字到底什麼時候該換行,所以針對商品標題,可能多行的資料固定了一行18個字元。

2.是關於繪製圖片的導出,按照官方api的說法應該在draw()完成的回調中執行,但是通過

canvasCtx.draw(false,function(res){
});

這種方式,一直不回調完成。不知道哪裡出問題了。所以最後只好加了一個延時去保存圖片。

/**
 * 绘制分享的图片
 * @param goodsPicPath 商品图片的本地链接
 * @param qrCodePath 二维码的本地链接
 */
drawSharePic: function (goodsPicPath, qrCodePath) {
  wx.showLoading({
    title: '正在生成图片...',
    mask: true,
  });
  //y方向的偏移量,因为是从上往下绘制的,所以y一直向下偏移,不断增大。
  let yOffset = 20;
  const goodsTitle = this.data.orderDetail.paltProduct.name1;
  let goodsTitleArray = [];
  //为了防止标题过长,分割字符串,每行18个
  for (let i = 0; i < goodsTitle.length / 18; i++) {
    if (i > 2) {
      break;
    }
    goodsTitleArray.push(goodsTitle.substr(i * 18, 18));
  }
  const price = this.data.orderDetail.price;
  const marketPrice = this.data.orderDetail.marketPrice;
  const title1 = &#39;您的好友邀请您一起分享精品好货&#39;;
  const title2 = &#39;立即打开看看吧&#39;;
  const codeText = &#39;长按识别小程序码查看详情&#39;;
  const imgWidth = 780;
  const imgHeight = 1600;

  const canvasCtx = wx.createCanvasContext(&#39;shareCanvas&#39;);
  //绘制背景
  canvasCtx.setFillStyle(&#39;white&#39;);
  canvasCtx.fillRect(0, 0, 390, 800);
  //绘制分享的标题文字
  canvasCtx.setFontSize(24);
  canvasCtx.setFillStyle(&#39;#333333&#39;);
  canvasCtx.setTextAlign(&#39;center&#39;);
  canvasCtx.fillText(title1, 195, 40);
  //绘制分享的第二行标题文字
  canvasCtx.fillText(title2, 195, 70);
  //绘制商品图片
  canvasCtx.drawImage(goodPicPath, 0, 90, 390, 390);
  //绘制商品标题
  yOffset = 490;
  goodsTitleArray.forEach(function (value) {
    canvasCtx.setFontSize(20);
    canvasCtx.setFillStyle(&#39;#333333&#39;);
    canvasCtx.setTextAlign(&#39;left&#39;);
    canvasCtx.fillText(value, 20, yOffset);
    yOffset += 25;
  });
  //绘制价格
  yOffset += 8;
  canvasCtx.setFontSize(20);
  canvasCtx.setFillStyle(&#39;#f9555c&#39;);
  canvasCtx.setTextAlign(&#39;left&#39;);
  canvasCtx.fillText(&#39;¥&#39;, 20, yOffset);
  canvasCtx.setFontSize(30);
  canvasCtx.setFillStyle(&#39;#f9555c&#39;);
  canvasCtx.setTextAlign(&#39;left&#39;);
  canvasCtx.fillText(price, 40, yOffset);
  //绘制原价
  const xOffset = (price.length / 2 + 1) * 24 + 50;
  canvasCtx.setFontSize(20);
  canvasCtx.setFillStyle(&#39;#999999&#39;);
  canvasCtx.setTextAlign(&#39;left&#39;);
  canvasCtx.fillText(&#39;原价:¥&#39; + marketPrice, xOffset, yOffset);
  //绘制原价的删除线
  canvasCtx.setLineWidth(1);
  canvasCtx.moveTo(xOffset, yOffset - 6);
  canvasCtx.lineTo(xOffset + (3 + marketPrice.toString().length / 2) * 20, yOffset - 6);
  canvasCtx.setStrokeStyle(&#39;#999999&#39;);
  canvasCtx.stroke();
  //绘制最底部文字
  canvasCtx.setFontSize(18);
  canvasCtx.setFillStyle(&#39;#333333&#39;);
  canvasCtx.setTextAlign(&#39;center&#39;);
  canvasCtx.fillText(codeText, 195, 780);
  //绘制二维码
  canvasCtx.drawImage(qrCodePath, 95, 550, 200, 200);
  canvasCtx.draw();
  //绘制之后加一个延时去生成图片,如果直接生成可能没有绘制完成,导出图片会有问题。
  setTimeout(function () {
    wx.canvasToTempFilePath({
      x: 0,
      y: 0,
      width: 390,
      height: 800,
      destWidth: 390,
      destHeight: 800,
      canvasId: &#39;shareCanvas&#39;,
      success: function (res) {
        that.setData({
          shareImage: res.tempFilePath,
          showSharePic: true
        })
        wx.hideLoading();
      },
      fail: function (res) {
        console.log(res)
        wx.hideLoading();
      }
    })
  }, 2000);
},

最後看下繪製出來的效果圖。

在產生圖片之後就可以提示使用者去儲存分享了。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

關於微信小程式的選擇器(時間,日期,地區)的解析

關於微信小程式收藏功能的實作

#微信小程式之讚和刪除清單以及分享的功能實作

以上是微信小程式透過保存圖片分享到朋友圈的功能實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn