在 <canvas> 上绘制 inline SVG

2019/04/12 | 1分钟阅读 | 更新于 2019/04/12

在 <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 格式。

© 2026 香蕉引擎故障报告

🌱 Powered by Hugo with theme Dream.

关于

要怎么介绍自己呢,🤔。

很早以前是作为 Web 前端在学习的,但是工作第一年就成为了全干工程师。喜欢尝试各种东西,什么都会一点。

一直很喜欢 Ebiten 游戏引擎 ,特别简洁,用它做过一些小东西,可以查看这个分类 。另外特别推荐这个木鱼 ,是一个相对完整的小玩意儿,包含手搓的一个简单的 UI 框架;支持鼠标和键盘操作;有多语言和主题切换功能;同时支持 Web 端和客户端。它的源代码在 bin16/wooden-fish

主题

网站基于 Hugo,当前使用的是 hugo-theme-dream 主题的修改版 ,根据我的需要,做了一些对 PaperMod 的兼容。

我自己也写过主题 ,但是没有别人写的好看。

正在从我的笔记中往外搬运内容

等待更新:

  • 从《锈湖》中学了些什么东西
  • 我拿 React 写解谜游戏的经过
  • 基于 Pocketbase 的 Pocket Memos
  • 数独!