最近一个产品需要是把微信服务号中一个网页内容生成一张图片,用户长按可以保存为图片,图片中的二维码可以识别,图片中包含用户头像。效果如图1-1

最常用的做法是把网页转换为cancas,接着转成图片,最流行的插件是html2canvas。官网的文档个人感觉不是特别好。html2canvas.hertzen.com/具体做法参考了此博客。segmentfault.com/a/119000001…。

图1-1

红色圆圈位置应该为微信头像的位置,web端获取不到用红圈代替。右下角二维码是根据后端数据渲染出来的动态二维码。

整个需求难点和坑分为几部分:

1.获取头像并且可以保存到canvas生成的img中(canvas对于跨域图片的处理一般是在原图片处显示空白---需要后端配合)

2.生成canvas比生成二维码或微信头像快,导致二维码没有附在canvas生成的整图中(异步处理,安排事件执行顺序)

3.设置canvas宽高为背景大图带小数的原始尺寸(通过offsetWidth width等获得的是取整之后的宽度 )以及偏移尺寸。

4.图片清晰度处理(设置canvas画布缩放比)

1.处理canvas中跨域的问题,微信头像和自己的服务器必然不在同一个域,那首先需要前端设置canvas的配置项,允许跨域。网上有几种做法可以参考

1.1将微信头像上传到自己服务器,再返回前段图片地址,就不会涉及跨域问题。

1.2在NGINX上设置反向代理,把微信头像域名地址换成自己服务器的。(但是一旦微信头像更新域名这种做法就会出bug )参考资料blog.csdn.net/mengruobaob…

location ^~ /wechat_image/ {add_header 'Access-Control-Allow-Origin' "$http_origin" always;add_header 'Access-Control-Allow-Credentials' 'true' always;add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-   Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;proxy_pass http://wx.qlogo.cn/;
}
复制代码

然后将微信的头像 wx.qlogo.cn/xxx => https://${自己的域名}/wechat_image/xxx和后端协商好下划线部分。

2.异步处理可以涉及很多内容,笔者自己也不是特别懂,此处不展开讲,下次专门出一篇异步的博客。此处处理将替换头像地址,生成动态二维码,canvas绘图按照前中后三步顺序执行,(没有做异步处理时,safiri中生成canvas比生成头像和生成二维码都快,导致最后的整图没有微信头像和二维码。)

3.生成canvas过程中会发现二维码的位置会在打开页面一秒左右往上方偏移一下,一开始以为是因为生成的画布以及图片和之前的dom节点高度不同,所以设置了画布高度时采用了getBoundingClientRect()获得实际dom元素宽高,以及生成画布过程中可能出现的偏移。

4.设置canvas的缩放scale。

代码如下:

 // $(function() {    function imgUrlChange(){    var wximg = $("#wximg").attr('src');      if(wximg){           var newimg =  window.location.origin +'/wechat_image'+ wximg.split("http://thirdwx.qlogo.cn")[1];    }else{     console.log('微信头像没有读取到');      }     $("#wximg").attr('src',newimg);   }   function  shareQRCode () {    return new Promise (function(resolve,reject){   setTimeout(function() {      var  shareid = $("#urldata").attr('uid');   var qrcode = new QRCode('qrcode', {  text: 'your content',width: 90, height: 90,  correctLevel: QRCode.CorrectLevel.H  });             //使用 API           qrcode.clear();      qrcode.makeCode(shareid);  console.log(2);       resolve();        },0)      })  }    function canvasImg (){    console.log(3)     setTimeout(function(){        var cntElem = $('#html2canvas')[0];   var shareContent = cntElem;//需要截图的包裹的(原生的)DOM 对象 var cont = cntElem.getBoundingClientRect(); var width = cont.width; //获取dom 宽度  var height = cont.height; //获取dom 高度 var canvas = document.createElement("canvas"); //创建一个canvas节点var scale = 2; //定义任意放大倍数 支持小数     canvas.width = width * scale; //定义canvas 宽度 * 缩放  canvas.height = height * scale; //定义canvas高度 *缩放  var context = canvas.getContext("2d");    context.scale(scale, scale); //获取context,设置scalecontext.translate(-cont.left,-cont.top);//设置context位置,值为相对于视窗的偏移量负值,让图片复位       var opts = {       scale: scale, // 添加的scale 参数canvas: canvas, //自定义 canvas  // logging: true, //日志开关,便于查看html2canvas的内部执行流程  width: width, //dom 原始宽度          height: height,              useCORS: true // 【重要】开启跨域配置       };           html2canvas(shareContent, opts).then(function (canvas) {  // 【重要】关闭抗锯齿      context.mozImageSmoothingEnabled = false; context.webkitImageSmoothingEnabled = false;  context.msImageSmoothingEnabled = false;  context.imageSmoothingEnabled = false;   // 【重要】默认转化的格式为png,也可设置为其他格式    var image = canvas.toDataURL("image/png");          var pHtml = "<img src="+image+" />";          $('#html2canvas').html(pHtml);             $('#html2canvas>img').css({                "width": 100 + "%",                "height":height,             });            }, 200)             });
}      imgUrlChange()   shareQRCode().then(function() { canvasImg() }) // })复制代码

转载于:https://juejin.im/post/5c15f87751882545e24f018f

微信服务号分享图片(包括微信头像以及二维码)相关推荐

  1. 微信公众号怎么生成能追踪效果的二维码?

    微号帮平台微信渠道二维码功能介绍:为了满足用户渠道推广分析的需要,微信公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,微信公众号可以接收到事件推送. 现在 ...

  2. 微信小程序分享生成海报(自带二维码)+头像+昵称

    前言: 我的分享海报是弹框,可根据自己要求写成页面,原理都是一样的,背景图是前期测试的,效果是OK的,真机测试手机也是显示的. 效果图: wxml: <!-- 生成海报 --><vi ...

  3. 微信公众号怎么生成带统计的渠道二维码

    公众号生成带统计的渠道二维码,通过公众号开发接口生成带参数的二维码实现,记录粉丝关注取关的结果,包含粉丝昵称.粉丝头像等都是公众号平台提供的接口开发.微号帮平台现有功能渠道二维码生成实现,也可以自己开 ...

  4. 【小程序开发原创】小程序裁剪图片上传头像,二维码源码

    微信小程序 图片裁剪工具,简单易用 项目需求 在做微信小程序的时候有个图片上传之前裁剪的需求,找过一些github中的项目,都不太理想,主要是没有办法自定义宽高,于是自己研究了一下,做了一个简单的图片 ...

  5. 实例:用C#.NET手把手教你做微信公众号开发(12)--带参数二维码裂变推广

    为什么能裂变推广是营销学和心理学的范畴了,这里举个简单的例子来介绍.公众号有足以吸引粉丝的地方,要么是知识.要么是优惠.要么是服务,反正不同于其他人,能够吸引人关注:有了这个前提,怎么让更多的人知道这 ...

  6. 微信公众号开发----生成带参数的临时二维码

    本文只提供代码实现,具体参数含义请先仔细阅读微信公众号技术文档之生成带参数的二维码 临时二维码请求说明: 一.常量类 public class WechartConst {//生成带参数的二维码pub ...

  7. 随便记录一下:微信公众号后台管理系统,获取需要扫描的二维码

    今天心血来潮,看了一下微信扫码登陆.这里记录一下,重申一下–做事需要耐心!!! 微信公众号官网:mp.weixin.qq.com 我们需要分析的是二维码图片如何拿到了,当然,强大的f12绝对可以, 拿 ...

  8. 微信长按图片无法弹出识别二维码选项解决方案

    1.首先页面中有两个二维码的兄弟别忙活了,一个页面中只可以识别其中一个二维码,两个的话需提示用户双击放大二维码进行二维码识别. 2.网页内有一张图片进行二维码识别时长按没有反应(长按图片无法弹出识别二 ...

  9. java实现微信支付宝等多个支付平台合一的二维码支付(SSM框架)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] ♪ 点击上方绿标 收听java实现微信支付宝等多个支付平台合一的二维码支付(SSM框架) 整体思路: 实现微信支付宝等支付平台合多为一的二 ...

最新文章

  1. 动态SLAM:关于语义分割时间效率的讨论
  2. Xamarin Visual Studio提示找不到AssemblyAttributes.cs文件
  3. python web为什么不火-Python这么火,为何有人说Python不好找工作?
  4. Android ListView中有Button,ItemClick事件失效
  5. oracle PL/SQL
  6. 阮一峰react demo代码研究的学习笔记 - demo7 debug - create ref element
  7. Jenkins配置MSBuild时使用环境变量
  8. Android 系统(74)--Android重启原因分析
  9. 某程序员的薪水变化数据
  10. 冒泡排序面向对象java_冒泡排序
  11. brew mysql要多久_mac brew 安装 mysql
  12. 计算机制造商提供的驱动程序,英特尔通用显卡驱动程序将覆盖计算机制造商(OEM)自定义...
  13. word转pdf转换器免费版是一款专业将word文档转换成pdf文件的软件,完美支持在线word转换成pdf,可将office word文档doc、docx、wps格式转换成PDF格式。word转pd
  14. 用360安全卫士检查计算机中是否有木马,你的电脑真的做好防护了吗?使用360安全卫士木马查杀一键扫描就知道...
  15. 51单片机与AVR单片机
  16. 第三届中国CEO新年峰会参会感想二
  17. 喜讯!清华大学镜像站恢复anaconda加速
  18. 中医是如何辩证出脾胃湿热的?
  19. AssetsManager下载类
  20. excel打开密码忘记了_如何设置EXCEL文件打开和编辑密码

热门文章

  1. Assets--unity资源映射
  2. “虎牙直播”实习生面试 c++中的智能指针
  3. keep-alive用法及注解
  4. 【详记MySql问题大全集】一、安装MySql
  5. 小白学习web零基础,大佬给出全面建议,一步到位!
  6. JAVA面试题总结【2】
  7. 将短信恢复到iphone上(无需越狱)
  8. 设计模式——桥接模式实验报告
  9. 用python写一个拼音编辑器(.py版|我会把这个文件的exe版发到评论区的|随时更新|最旧1.0.1|1.0.1)
  10. 异步网页采集利器CasperJs