微信小程序通过保存图片分享到朋友圈功能


Posted in Javascript onMay 24, 2018

说明

首先说明一点,小程序内是不能直接分享到朋友圈的。所以只能通过生成图片,携带小程序二维码,保存到手机相册,让用户自己选择发到朋友圈。然后可以通过在小程序中识别二维码来进入小程序的指定页面。参考市面上支持分享的应用,基本都是这种实现方式。

准备阶段

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 = '您的好友邀请您一起分享精品好货';
  const title2 = '立即打开看看吧';
  const codeText = '长按识别小程序码查看详情';
  const imgWidth = 780;
  const imgHeight = 1600;

  const canvasCtx = wx.createCanvasContext('shareCanvas');
  //绘制背景
  canvasCtx.setFillStyle('white');
  canvasCtx.fillRect(0, 0, 390, 800);
  //绘制分享的标题文字
  canvasCtx.setFontSize(24);
  canvasCtx.setFillStyle('#333333');
  canvasCtx.setTextAlign('center');
  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('#333333');
    canvasCtx.setTextAlign('left');
    canvasCtx.fillText(value, 20, yOffset);
    yOffset += 25;
  });
  //绘制价格
  yOffset += 8;
  canvasCtx.setFontSize(20);
  canvasCtx.setFillStyle('#f9555c');
  canvasCtx.setTextAlign('left');
  canvasCtx.fillText('¥', 20, yOffset);
  canvasCtx.setFontSize(30);
  canvasCtx.setFillStyle('#f9555c');
  canvasCtx.setTextAlign('left');
  canvasCtx.fillText(price, 40, yOffset);
  //绘制原价
  const xOffset = (price.length / 2 + 1) * 24 + 50;
  canvasCtx.setFontSize(20);
  canvasCtx.setFillStyle('#999999');
  canvasCtx.setTextAlign('left');
  canvasCtx.fillText('原价:¥' + marketPrice, xOffset, yOffset);
  //绘制原价的删除线
  canvasCtx.setLineWidth(1);
  canvasCtx.moveTo(xOffset, yOffset - 6);
  canvasCtx.lineTo(xOffset + (3 + marketPrice.toString().length / 2) * 20, yOffset - 6);
  canvasCtx.setStrokeStyle('#999999');
  canvasCtx.stroke();
  //绘制最底部文字
  canvasCtx.setFontSize(18);
  canvasCtx.setFillStyle('#333333');
  canvasCtx.setTextAlign('center');
  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: 'shareCanvas',
      success: function (res) {
        that.setData({
          shareImage: res.tempFilePath,
          showSharePic: true
        })
        wx.hideLoading();
      },
      fail: function (res) {
        console.log(res)
        wx.hideLoading();
      }
    })
  }, 2000);
},

最后看下绘制出来的效果图。

微信小程序通过保存图片分享到朋友圈功能

生成图片之后就可以提示用户去保存分享了。

总结

以上所述是小编给大家介绍的微信小程序通过保存图片分享到朋友圈,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
chrome浏览器不支持onmouseleave事件的解决技巧
May 31 Javascript
JS简单的轮播的图片滚动实例
Jun 17 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
Angular.js回顾ng-app和ng-model使用技巧
Apr 26 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
Jun 17 Javascript
JS实现简单易用的手机端浮动窗口显示效果
Sep 07 Javascript
jQuery拖拽通过八个点改变div大小
Nov 29 Javascript
基于Bootstrap框架实现图片切换
Mar 10 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 Javascript
微信浏览器左上角返回按钮监听的实现
Mar 04 Javascript
karma+webpack搭建vue单元测试环境的方法示例
May 24 #Javascript
react实现点击选中的li高亮的示例代码
May 24 #Javascript
浅谈Webpack 是如何加载模块的
May 24 #Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 #jQuery
详解javascript中的变量提升和函数提升
May 24 #Javascript
JavaScript轮播停留效果的实现思路
May 24 #Javascript
vue2单元测试环境搭建
May 24 #Javascript
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
使用php清除bom示例
2014/03/03 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
围观tangram js库
2010/12/28 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
Javascript如何判断数据类型和数组类型
2016/06/22 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
python time模块用法实例详解
2014/09/11 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
html2canvas把div保存图片高清图的方法示例
2018/03/05 HTML / CSS
数控专业毕业生求职信范文
2013/09/21 职场文书
老人节主持词
2015/07/04 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
学校标语口号大全
2015/12/26 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
python开发人人对战的五子棋小游戏
2022/05/02 Python