近两年做了几次微信H5活动的开发,为了达到传播分享的效果,通常最终都需要生成个性化的图片,供用户长按保存分享,在这里就把自己的一些使用心得记录下来,供其他小伙伴借鉴。

这里备注一下,我目前用的是  html2canvas 0.5.0-beta4 版本,这篇文章也以它为例,先贴一下代码

 
   
let canvas = document.createElement('canvas');
let cardBox = document.querySelector("#imgBox");
let w=cardBox.offsetWidth;
let h=cardBox.offsetHeight;
let scale=3;
canvas.width = w*scale;
canvas.height = h*scale;
canvas.style.width=w+"px";
canvas.style.height=h+"px";
let context = canvas.getContext("2d");
context.scale(scale,scale);
let rect = cardBox.getBoundingClientRect();//获取元素相对于视察的偏移量
context.translate(-rect.left,-rect.top);//设置context位置,值为相对于视窗的偏移量负值,让图片复位
html2canvas(cardBox, {
canvas: canvas,
scale: scale,
dpi:1,
width:w,
height:h,
}).then((canvas)=> {
var dataUrl = canvas.toDataURL();
      //这个dataUrl就是生成图片的base64编码了
});

  

1.图片模糊的问题

  这个问题很常见,造成的原因也是有多个的,首先就是上图代码中声明的 scale 参数,通过这个参数控制画布的缩放,可以增加图片的清晰度,但是太高也会有问题,会导致图片太大,以及超过屏幕分辨率而出现色彩斑点,因此找到一个比较合适的比例就好;

  另一个常见的原因就是在需要生成为图片的html中,一些原本就是图片的元素,最好使用img标签去加载他,而不是用作背景图。

2.图片跨域

  我们在生成的图片中经常会用到当前用户的头像,这个头像是微信那边返回的一个url,如果直接把他通过img标签放在html里面,会发现最终生成的图片没有头像,这是因为canvas的浏览器安全协议阻止了这个行为,这个目前没找到办法在前端去解决,我一般是让后端讲这个图片转为base64以后传给我,这样就像是本地资源一样,便不会有跨域问题了。

3.图片中的元素位置发生偏移

  经过一些对比,我发现生成的图片中一些元素相对于html的位置发生了细小的偏移,后来在网上找到了解决方法

 let rect = cardBox.getBoundingClientRect();//获取元素相对于视察的偏移量
context.translate(-rect.left,-rect.top);//设置context位置,值为相对于视窗的偏移量负值,让图片复位

  就是通过以上两行代码,在canvas中绘制html元素时,会纠正元素的偏移问题。

4.如何实现长按保存

  因为微信浏览器中的图片标签,经过长按以后会触发浏览器的事件,弹出保存和分享等菜单栏,因此在微信中只要你将最终生成的图片放在手指可以操作的地方,然后提示用户长按就好。不过通常我是讲生成后的图片加载为img后通过相对定位覆盖在需要生成为图片的那个div上面,最好透明度设置为0,这样生成的那一瞬间也没有突然变化的效果,用户体验会更好一些,用户对着那个div长按,实际则是按到了覆盖在上面的img,微信浏览器就会弹出菜单栏,用户便可以保存或者分享了。

html2canvas使用心得的更多相关文章

  1. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  3. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  7. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  9. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

随机推荐

  1. Spark3.0.1各种集群模式搭建

    对于spark前来围观的小伙伴应该都有所了解,也是现在比较流行的计算框架,基本上是有点规模的公司标配,所以如果有时间也可以补一下短板. 简单来说Spark作为准实时大数据计算引擎,Spark的运行需要 ...

  2. 内存使用过高点检checklist

    正在运行的程序按照内存段来组织,内存段的类型有如下几种: 代码段:用户程序指令,长期存在内存中 数据段:全局变量等,长期存在内存中 堆:局部变量,参数参数等,短期存在内存中 栈:动态存储,可变 代码段 ...

  3. phpstorm 远程调式 php

    https://cloud.tencent.com/developer/article/1561767 超时设置 fastcgi: ``` 1. apache module的情况下: 修改配置文件 h ...

  4. 公式编辑器MathType之入门攻略

    许多时候在工作.学习,尤其是写文献时,需要在Word文档中输入较多公式,简单的公式或符号,可以借助Word自带的公式编辑器,但是,遇到较多并且复杂的公式,该如何高效解决呢?其实可以借助一款强大的公式编 ...

  5. 【VUE】7.组件通信(二)子组件修改父组件

    1. 前提&知识点 1./components/Father.vue 是父组件, Son.vue 是子组件 2.子组件修改父组件 emit 2. 组件通信 1. 首先对子组件绑定一个事件 ch ...

  6. python+selenium通过加载用户配置实现免登陆

    1查看profile路径 在Chrome地址栏访问chrome://version,可以查看个人资料存储位置: 2 python代码如下: from selenium import webdriver ...

  7. Java集合【5】-- Collections源码分析

    目录 一.Collections接口是做什么的? 二.Collections源码之大类方法 1.提供不可变集合 2.提供同步的集合 3.类型检查 4.提供空集合或者迭代器 5.提供singleton的 ...

  8. 最佳置换算法OPT

    原文链接:https://www.jianshu.com/p/544ee20e307c

  9. 将 python3 添加到环境变量(ubuntu)

    将 python3 添加到环境变量 echo alias python = python3 >> ~/.bashrc 更新环境变量 source ~/.bashrc

  10. 最常用的分布式ID解决方案,你知道几个

    一.分布式ID概念 说起ID,特性就是唯一,在人的世界里,ID就是身份证,是每个人的唯一的身份标识.在复杂的分布式系统中,往往也需要对大量的数据和消息进行唯一标识.举个例子,数据库的ID字段在单体的情 ...