import { Canvg } from 'canvg' import html2canvas from 'html2canvas' import { ElMessage } from 'element-plus' export const useGenThumbnail = async (canvas_id: string = 'mtCanvasArea') => { const el = document.querySelector(`#${canvas_id}`) if (!el) { ElMessage.error('没有找到canvas元素,请检查!') return } // //记录要移除的svg元素 const shouldRemoveSvgNodes = [] // 获取到所有的SVG 得到一个数组 目前只有自定义连线需要特殊处理 别的元素直接使用html2canvas就可以 const svgElements: NodeListOf = document.body.querySelectorAll(`#${canvas_id} .mt-line-render`) // 遍历这个数组 for (const item of svgElements) { //去除空白字符 const svg = item.outerHTML.trim() // 创建一个 canvas DOM元素 const canvas = document.createElement('canvas') //设置 canvas 元素的宽高 canvas.width = item.getBoundingClientRect().width canvas.height = item.getBoundingClientRect().height const ctx = canvas.getContext('2d') // 将 SVG转化 成 canvas const v = Canvg.fromString(ctx!, svg) await v.render() //设置生成 canvas 元素的坐标 保证与原SVG坐标保持一致 if (item.style.position) { canvas.style.position += item.style.position canvas.style.left += item.style.left canvas.style.top += item.style.top } //添加到需要截图的DOM节点中 item.parentNode!.appendChild(canvas) // 删除这个元素 shouldRemoveSvgNodes.push(canvas) } const width = el.offsetWidth const height = el.offsetHeight const canvas = await html2canvas(el, { useCORS: true, scale: 2, // width, // height, allowTaint: true, // windowHeight: height, logging: false, ignoreElements: element => { if (element.classList.contains('mt-line-render')) { return true } return false } }) // const img_link = document.createElement('a') // img_link.href = canvas.toDataURL('image/png') // 转换后的图片地址 // img_link.download = Date.now().toString() // document.body.appendChild(img_link) // // 触发点击 // img_link.click() // // 然后移除 // document.body.removeChild(img_link) // 移除需要移除掉的svg节点 shouldRemoveSvgNodes.forEach(item => { item.remove() }) return canvas.toDataURL('image/png') }