在 <canvas> 上绘制 inline SVG

要导出 inline SVG 图像为普通图片,在 <canvas> 上绘制时需要获取到这部分 SVG 内容并创建可引用的 URL。

<canvas> 上绘制 SVG

解决外部的 CSS

Inline SVG 外部的 CSS 可以作用于 SVG 内的元素,但是这一部分并不属于当前 svg(文件)本身,如果将该 svg 绘制在 canvas 上,则这一部分样式会丢失。但是 svg 文件内 style 标签中的样式会得到保留。

针对这一点,可以有选择性的使用 Inline 内部的 style 标签来定义临时样式,又或者在创建 svg 内容时将外部的样式插入 svg 内。

以 URL 的形式引用 SVG 内容

SVG 的 MIME-Type 是 image/svg+xml

a. 使用 data: URL

有别于传统图片的二进制格式,SVG 是不需要将内容转成 Base64 的。

data:image/svg+xml;<svg>....</svg>

b. 使用 Blob URL

这是一个相对来说更好的方法。

const blob = new Blob(['<svg>...</svg>'], {
    type: 'image/svg+xml',
})

const blobURL = URL.createObjectURL(blob)

其它流程

剩下的就和在 canvas 上绘制其它图片格式完全一致了。一套流程下来可以把 svg 文件 / Inline SVG 转换成 PNG 格式。