近两年做了几次微信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. JWT 实战

    上一篇我们讲解了 JWT 的基本原理和结构 你了解JWT吗?,接下来我们具体实战一下! 1. 引入依赖 <!--引入jwt--> <dependency> <groupI ...

  2. jq判断input 复选框有没有选

    选中了返回true ,没选中返回false$("input[type='checkbox']").is(':checked'):

  3. 【转】Java工程师知识图谱

    一.Java工程师知识图谱(思维导图版) 二.Java工程师知识图谱(文字链接版) 专业基石 数据结构 数组 链表 队列 栈 哈希表 堆 树 图 BitMap 算法思想 排序 查找 分支算法 动态规划 ...

  4. MindManager主题标记功能怎么使用

    我们在使用MindManager制作思维导图的过程中,经常需要对主题的类别,优先程度等进行整理,毫无疑问,这是一项繁琐却又不得不做的工作.今天小编为大家带来了MindManager主题整理的一些小技巧 ...

  5. FL Studio 插件使用技巧——Fruity Reeverb 2(下)

    了解大教堂声场的特点 上节教程中我们说到,混响具有营造空间感的作用.当我们想要在FL Studio软件中用Fruity Reeverb 2 插件有目标地模仿一个特定空间的环境时,我们需要充分了解该空间 ...

  6. 简单几步就能把素材变成大片?老司机推荐Vegas

    "素材编辑"一般分为两种,一种是对时间线素材长度和位置的编辑,另一种就是遮罩法操作. 第一种,裁剪素材(将素材在我们选定的位置一分为二),对时间线上的素材进行裁剪,有两种方法: 一 ...

  7. web自动化测试难点 滚动条操作、日期框处理、上传文件

    如何把页面滑到最低部? 一般来说,做web自动化测试时,不需要单独写代码,把页面滑到可见,因为click操作,只要是元素存在并且加载出来了,就可以点击到,无需另外写滑动元素的代码. 如果特殊情况需要滑 ...

  8. Javascript严格模式与一般模式的区别

    严格模式是指使代码在严格条件下运行.如果你在JavaScript脚本的头部看到"use strict",那么就表明当前处于严格模式下.严格模式主要是为了消除JavaScript语法 ...

  9. JAVA 中的Optional (臭名昭著的空指针异常(NullPointerException))

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...

  10. 2014_07_11_VGA基础及封装

    -- VR1201 Color Filter LCOS Microdisplays QVGA (320*240 Pixel) Color Filter LCOS Microdisplays -- VR ...