前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 html2canvas 生成分享图片,CDN图片不展示问题

使用 html2canvas 生成分享图片,CDN图片不展示问题

作者头像
用户10106350
发布2022-10-28 17:19:46
发布2022-10-28 17:19:46
2K00
代码可运行
举报
文章被收录于专栏:WflynnWebWflynnWeb
运行总次数:0
代码可运行

背景

生成分享图片,包含后端返回的图文,图片是 cdn 资源。开始尝试使用 html2canvas 时,使用的是本地图片,生成截图无问题。

代码实现

代码语言:javascript
代码运行次数:0
运行
复制
import html2canvas from 'html2canvas';
const shareContent = document.getElementById("capture"); // 要生成截图的内容区域
(window.html2canvas || html2canvas)(shareContent, {
  useCORS: true, // 允许跨域 + 设置 <img crossOrigin="Anonymous" />
  scrollY: 0,
  scrollX: 0,
  height:shareContent.offsetHeight - 2,
}).then((canvas) => {
  console.log("生成整个图片");
  setUrl(canvas.toDataURL("image/png", 1))
})
复制代码

问题

但是换成 cdn 资源时,在 ios 设备上随机出现 截图为空、图片展示不了的情况。

解决方案

因为使用本地图片,未遇到此问题,所以前端在获取图片 cdn 资源时,

  1. 将资源异步转换为 base64
  2. 将 base64 赋值给 img 标签
  3. 最后执行生成截图的代码

测试后问题解决

代码实现

  1. 需加载多张 cdn 图片,所以使用 Promise 处理多张 cdn 图片转为 base64
代码语言:javascript
代码运行次数:0
运行
复制
// 传入 cdn 地址
function convertUrlToBase64(url) {
    return new Promise((resolve) => {
        let img = new Image();
        img.crossOrigin = 'Anonymous';
        img.src = url;
        img.onload = function () {
            let canvas = document.createElement('canvas');
            canvas.width = img.width;
            canvas.height = img.height;
            let ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0, img.width, img.height);
            let ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase();
            let dataURL = canvas.toDataURL('image/' + ext);
            let base64 = {
                dataURL: dataURL,
                type: 'image/' + ext,
                ext: ext
            };
            resolve(base64)
        }
    })
}
复制代码
  1. 实现异步加载完多张图片,将base64赋值给 img 标签,最后执行生成截图
代码语言:javascript
代码运行次数:0
运行
复制
const bgImg = document.getElementsByClassName('photo')[0];
const avatarImg = document.getElementsByClassName('avatar')[0]
Promise.all([convertUrlToBase64(bgImg.src), convertUrlToBase64(avatarImg.src)])
    .then(([base641,base642]) => {
        bgImg.src = base641.dataURL;
        avatarImg.src = base642.dataURL;
        (window.html2canvas || html2canvas)(shareContent, {
          useCORS: true,
          scrollY: 0,
          scrollX: 0,
          height:shareContent.offsetHeight - 2,
        }).then((canvas) => {
          console.log("生成整个图片");
          setUrl(canvas.toDataURL("image/png", 1))
          Toast.hide();
        })
})
复制代码

结语

html2canvas 生成截图,cdn图片不展示问题已完美解决。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WflynnWeb 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
    • 代码实现
  • 问题
  • 解决方案
    • 代码实现
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档