canvas签字+html2canvas将dom保存为图片避坑指南

1. 前言

如果你需要h5签字,并需要将相关dom保存成图片,那你算是 掏上了😂 这是一篇全方位避坑指南。至少可以给你节省 8小时。

技术栈: vue2.x js 一定要先看技术栈哦,避免出现未知ERROR

canvas 签字自己去实现其实也没啥难度,有更好的插件,可以帮助我们多争取一点摸鱼时间,那何尝不可呐。

之前也写过一篇小程序签字保存图片,您可以点击查看👉👉👉 微信小程序 canvas 签字连笔卡顿 如何解决

2. 使用的插件

js 复制代码
npm i  html2canvas@1.3.2
npm i  vue-esign@1.1.4

说到这,我不得不夸一下 vue-esign 好用、非常好用👍 ,我需要的功能都做了配置,你们可以感受下demo,看看是不是符合你的需求再决定是否向下看,点击查看

3. 签字组件的使用

js 复制代码
 <vue-esign 
     ref="esign" 
     class="mySign" 
     :height="300" 
     :isCrop="isCrop" 
     :lineWidth="lineWidth" 
     :lineColor="lineColor" 
     :bgColor="bgColor" 
     :isClearBgColor="false"
 />
// 重置事件
handleReset() {
    this.$refs.esign.reset()
}
// 校验是否签字
openLink() {
    try {
        // 生成签名结果
        const res = await this.$refs.esign.generate()
        console.log('res')
        // 处理其他业务逻辑
     }catch (error) {
        console.log('err', error)
        Toast('请先签名')
    }
}

简单吧,他把签字的动作都封装了,代码看着非常清爽。感谢大佬,如果你需要看其它的配置请看这个

ok到这 canvas签字就结束了,非常好用,接下来就说说 html2canvas将dom保存为图片的坑

4. html2canvas的使用

js 复制代码
 <div class="confirm_content_clone" ref="htmlContent">
      <img style="width: 100%; height: 100%;"  :src="filePath" alt="" />
      <img style="width: 100%; height: 150px;" :src="resultImg" alt="" />
 </div>
 
 async openLink() { 
     // 别问直接把这些属性,放上
     const newCanvas = await html2canvas(this.$refs.htmlContent, {
        useCORS: true, // 处理跨域资源
        scale: 2, // 提高截图清晰度
        allowTaint: true,
        scale: 2, //按比例增加分辨率 (2=双倍).
        dpi: window.devicePixelRatio * 2, //设备像素
    })
    const imgData = newCanvas.toDataURL('image/png')
}

正常情况,那就是把类名为 confirm_content_clone的div 里面的两个图片,生成同一个拼接图片,不正常情况, 那恭喜你,我们开始走上了填坑之路

5. 坑one

图片不全,如下图所示

其实这里并没有太为难我, 我的处理方式是:页面展示是正常一套逻辑 ,需要生成的图片dom, 我采用绝对定位,使用 top:10000 让其消失在可视范围内 ,野蛮是野蛮了一点, 毕竟我和代码 有一个能跑就行

在以为解决的时候(开心鼓掌),你不知道的是,第二个坑向你迎面走来,在ios系统中,图片空白

6. 坑Two

第一个img 的src是一个图片url, 第二个src 图片是 base64格式, 在ios系统中截图如下图所示

也就是图片是url不是base64 在ios系统中 无法显示,这个比较坑的是,pc浏览器中正常显示,也就是开发的时候好好的 ,为啥到了你那就不行了,是不是你手机有问题 🤣

必坑指南第二式: 敲黑板,认真看,要不然够你找的 crossOrigin="anonymous"

js 复制代码
// 添加  crossOrigin="anonymous" 
 <img  
     crossOrigin="anonymous" 
     style="width: 100%; height: 100%;" 
     src=""
     alt=""
 />

看,只要抵住最黑的暗,就能收获最光的亮

6. 坑Three

这个坑的现象是在ios系统的,涉及中文符号的时候,保存的图片 换行错乱,而且莫名其妙靠右: 如下图所示

其实这个解决方案已经在上面了,就是在浏览中,样式是正确的 如下图所示

终极一招: 先生成一张正确的图片,然后用图片替代文字,即可。是不是 脑回路清奇,好了 就这吧。

**野蛮的人生不需要解释, 下次见。 **

相关推荐
liangshanbo121519 分钟前
面试题:常见的前端构建工具有哪些?分别适用于什么场景?
前端
事圆则缓31 分钟前
Flutter 状态管理框架对比(三):Riverpod 如何连起购物车与异步价格
开发语言·javascript·flutter
linux_cfan32 分钟前
videojs v10 源代码系列解读:30 · `SerialRunner` 与 `ConcurrentRunner`
前端
liangshanbo121532 分钟前
面试题:页面需要发起大量 Ajax / HTTP 请求时,如何优化请求性能?
前端·http·ajax
lyz2468591 小时前
vue3页面因参数未声明而报错的常犯错误
前端·javascript·vue.js
摸爬滚打的小李1 小时前
流程图同步AI生成
前端
Hilaku1 小时前
我重写了整个项目,但没人感谢我!
前端·javascript·程序员
zach2 小时前
Vue/React SPA 打包部署后,子路由刷新 401 未登录问题彻底解决
前端·nginx·next.js
旋生万物2 小时前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
亿元程序员2 小时前
游戏引擎都没用!纯AI又上线了一款蚂蚁搬家小游戏!
前端