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


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 相关文章推荐
Node.js中对通用模块的封装方法
Jun 06 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
Aug 24 Javascript
归纳下js面向对象的几种常见写法总结
Aug 24 Javascript
js字符串引用的两种方式(必看)
Sep 18 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
Apr 27 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 jQuery
微信小程序block的使用教程
Apr 01 Javascript
JavaScript引用类型Function实例详解
Aug 09 Javascript
浅谈React Event实现原理
Sep 20 Javascript
Vue分页插件的前后端配置与使用
Oct 09 Javascript
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
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
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
php操作MongoDB类实例
2015/06/17 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
JQuery球队选择实例
2015/05/18 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
numpy.linspace 生成等差数组的方法
2018/07/02 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
python重要函数eval多种用法解析
2020/01/14 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
Python调用Redis的示例代码
2020/11/24 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
师范生自荐信范文
2013/10/06 职场文书
动物科学专业毕业生的自我评价
2013/11/29 职场文书
企业门卫岗位职责
2013/12/12 职场文书
银行批评与自我批评
2014/02/10 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
开幕式邀请函
2015/01/31 职场文书
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android