方案
将html转成canvas,再利用canvas导出img功能达到目的。
实现
import html2canvas from 'html2canvas';
function DPR() {
if (window.devicePixelRatio && window.devicePixelRatio > 1) {
return window.devicePixelRatio;
}else{
return 1;
}
}
function parseValue(value) {
return parseInt(value, 10);
}
//同步加载图片
export const img2base64 = async (url, crossOrigin) => {
return new Promise(resolve => {
const img = new Image();
img.onload = () => {
const c = document.createElement('canvas');
c.width = img.naturalWidth;
c.height = img.naturalHeight;
const cxt = c.getContext('2d');
cxt.drawImage(img, 0, 0);
// 得到图片的base64编码数据
resolve(c.toDataURL('image/png'));
};
crossOrigin && img.setAttribute('crossOrigin', crossOrigin);
img.src = url;
});
};
//dom -> canvas
export const drawCanvas = async selector => {
// 获取想要转换的 DOM 节点
const dom = document.querySelector(selector);
const box = window.getComputedStyle(dom);
// DOM 节点计算后宽高
const width = parseValue(box.width);
const height = parseValue(box.height);
// 获取像素比-防止模糊
const scaleBy = DPR();
// 创建自定义 canvas 元素
const canvas = document.createElement('canvas');
// 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
canvas.width = width * scaleBy;
canvas.height = height * scaleBy;
// 设定 canvas css宽高为 DOM 节点宽高
canvas.style.width = `${width}px`;
canvas.style.height = `${height}px`;
// 获取画笔
const context = canvas.getContext('2d');
// 将所有绘制内容放大像素比倍
context.scale(scaleBy, scaleBy);
// 将自定义 canvas 作为配置项传入,开始绘制
return await html2canvas(dom, {canvas}).then(canvas => {
//document.querySelector("#canvasContainer").appendChild(canvas);
//return canvas.toDataURL("image/png");
return canvas.toDataURL("image/png")
});
};
第一步:html中所有的图片资源都要用img2base64的方式加载,然后dom加载完成之后再进行第二步。
第二步:html --> canvas 利用drawCanvas方法,这里需要引用html2canvas库,具体见github文档。
第三部:插入img元素,src指定为第二步返回的二进制数据。