生成分享图片,包含后端返回的图文,图片是 cdn 资源。开始尝试使用 html2canvas
时,使用的是本地图片,生成截图无问题。
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 资源时,
测试后问题解决
// 传入 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)
}
})
}
复制代码
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图片不展示问题已完美解决。