h5页面在微信内置浏览器打开下载功能,页面截屏HTML2canvas使用

最近公司要做一个h5的小程序,要求是基于微信打开,要求可以分享微信卡片给朋友。同时要下载服务器上的文件,还要指定区域图片自动截屏保存。
首先微信卡片分享是通过wx.config()这个api来实现,这里需要后端配合,获取后端的signature也就是验签。在调用wx.config()来实现
我们这里是需要下载一个压缩包,压缩包里面是一堆图片,直接上a标签,结果是在pc端微信浏览器可以正常下载,在ios端浏览器也可以下载,但是android端就提示,打开网页浏览器进行下载(大概是这么个意思)。这个功能最终没能做出来百度完了之后看到微信社区里的回答,最终选择更换方案,在下载页面提供下载地址,要求用户通过网址打开浏览器进行下载。(下载文件有大佬成功的还请教教我)
然后是生成图片进行保存,我这里是要求保存弹窗里的图片,当然这个图片是底图,还要再底图上加上相应文字后进行保存。一查网上都是用html2canvas进行截图保存的。一通copy加创作,发现截屏是成功了,但是很模糊。清晰度差的一塌糊涂。没办法接着找。最终找到了另一位大神的操作,使用html2canvas结合canvas2Image来处理的

let dom = $('.contain')
  
  var canvas = document.createElement('canvas');
  canvas.width = width * scaleBy;
  canvas.height = height * scaleBy;
  console.log(canvas)
  canvas.style.width = width * scaleBy + 'px';
  canvas.style.height = height * scaleBy + 'px';
  canvas.style.position = 'absolute';

  var context = canvas.getContext('2d');
  context.scale(scaleBy, scaleBy);

  var shareContent = document.getElementById("pic"); //获取囊括所有元素的最大的div元素
  var width = shareContent.offsetWidth; //获取dom宽度(包括元素宽度、内边距和边框,不包括外边距)
  var height = shareContent.offsetHeight;
  var canvas = document.createElement("canvas"); //创建一个canvas标签元素
  var scale = 2; //定义放大倍数,可以支持小数
  var imgType = "image/jpg";//设置默认下载的图片格式

  canvas.width = width * scale; //定义canvas宽度 * 倍数(图片的清晰度优化),默认宽度为300px
  canvas.height = height * scale; //定义canvas高度 * 倍数,默认高度为150px
  // var fontSize=$("html").css("font-size").split("px")[0];
  let actHeight = document.body.clientHeight
  console.log(actHeight)
  var context = canvas.getContext('2d');
  context.scale(scale, scale);
  //创建canvas的context对象,设
  var aaaa = 0;//距离左侧距离
  var bbbb = actHeight / 100 * 23.3;//距离顶部距离
  context.translate(-aaaa, -bbbb);//移动
  // context.shadowOffsetX = "150px"
  // console.log(context)
  var opts = { //初始化对象
    scale: 1, //添加的scale参数
    canvas: canvas, //自定义canvas
    logging: true, //日志开关,便于查看html2canvas的内部执行流程
    width: width, //dom的原始宽度和高度
    height: height,
    useCORS: true //开启html2canvas的useCORS配置,跨域配置,以解决图片跨域的问题
  };
  html2canvas(shareContent, opts).then(function (canvas) {
    console.log(canvas)
    var context = canvas.getContext('2d');
    // 【重要】关闭抗锯齿,进一步优化清晰度
    context.mozImageSmoothingEnabled = false;
    context.webkitImageSmoothingEnabled = false;
    context.msImageSmoothingEnabled = false;
    context.imageSmoothingEnabled = false;

    var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height, imgType); //将绘制好的画布转换为img标签,默认图片格式为PNG.
    document.getElementsByClassName("pic")[0].appendChild(img); //在body元素后追加的图片元素至页
    $(img).attr("id", "product");

  });

生成操作就是这么来的,我这边是保存图片,通过微信的长按保存,当然生成图片定位在原有图片的上方,进行了opacity:0处理,长安图片区域其实是按在我生成的图片上面,保存的自然是我要的生成的那张了。canvasj截图保存时其实默认是从页面顶部开始,刚开始截的是我要的一半,后来通过

 var bbbb = actHeight / 100 * 23.3;//距离顶部距离
  context.translate(-aaaa, -bbbb);//移动

将其移动到相应位置,实不相瞒,这两行代码卡了半天时间。希望对大家有用吧

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
h5 canvas在微信浏览器写字会触发下拉是因为微信浏览器在手机端上具有一种称为"全面屏优化"的特性。当在微信浏览器使用h5 canvas进行绘图,特别是在绘制过程中使用到了触摸事件时,用户手指在画布上滑动,微信浏览器会误将该操作视为页面下拉的手势操作。 这种误触下拉的原因在于微信浏览器为了适应手机全面屏的特性,引入了一种滑动操作的检测机制。当用户手指在页面上进行垂直滑动时,微信浏览器会判断该滑动操作是否可以触发页面下拉的动作,以提升用户体验。 然而,在h5 canvas上绘制时,绘图操作往往会涉及到用户手指在画布上的触摸事件,用户手指的滑动被误判为页面下拉的手势操作,导致页面被下拉,从而中断了绘图的过程。 为了解决这个问题,可以尝试以下方法: 1. 在canvas元素上添加touchstart、touchmove、touchend等触摸事件监听器,并阻止事件冒泡或默认行为,以防止微信浏览器误判操作。 2. 可以使用第三方库或框架,如createjs、egret等,来实现画布绘制,这些库或框架通常会对各种浏览器的兼容性问题进行处理,包括微信浏览器下的问题。 如果以上方法无法解决问题,那可能是由于微信浏览器的特性限制造成的,可以考虑使用其他浏览器或开发移动端应用程序来实现画布绘制,以避免微信浏览器中的下拉误触问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值