近两年做了几次微信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. txt文件覆盖恢复

    1.txt文件恢复到之前保存的版本 2.电脑未重启 方式:如果你使用系统还原可以用"还原以前的版本"功能来轻松找回. 右击.txt文件-还原以前的版本-选择时间点-还原

  2. Springboot使用EasyExcel(仅限自己收藏)

    pom文件依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel< ...

  3. 如何修改IDM下载器的临时文件夹位置

    所有的应用程序在下载时,都会有一些默认的选项.比如产生的临时文件存放在C盘目录下,或者定期自动更新等设置.那么当我们的计算机上安装了很多程序之后,C盘的空间就会渐渐地变小了,从而有了空间不足等等情况, ...

  4. 统一软件开发过程(RUP)的概念和方法

    统一软件开发过程(Rational Unified Process,RUP)是一种面向对象且基于网络的程序开发方法论. 根据Rational(Rational Rose和统一建模语言的开发者)的说法, ...

  5. go学习路线资料

    编辑器 JetBrains公司出品的,goland go初步学习路线 Go 指南 如何使用Go编程 实效Go编程 Go by Example 中文版 参考: Go 语言学习资料与社区索引 Go入门指南 ...

  6. dubbo协议之响应头编码器&响应对象编码

    前2节分析完了请求头和请求对象的编码,这里看一下响应头和响应对象的编码: 和请求头部一样进来先指定序列化器,没有的话用默认的Hessian2,接下来2个字节的操作和请求头编码类似,第三个字节时去req ...

  7. 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...

  8. LeetCode 020 Valid Parentheses

    题目描述:Valid Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']' ...

  9. 分布式系统唯一ID

    一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...

  10. ASP.NET Core管道详解[6]: ASP.NET Core应用是如何启动的?[下篇]

    要承载一个ASP.NET Core应用,只需要将GenericWebHostService服务注册到承载系统中即可.但GenericWebHostService服务具有针对其他一系列服务的依赖,所以在 ...