SVG转PNG

把 SVG 代码按 1~8 倍率栅格化成 PNG:先内联成 data URI 交给 <img> 渲染,再画进 canvas 导出,倍率越大文字边缘越锐利。全程浏览器本地完成。

已预载示例(240 × 160,示例图为倍率 2 的 480 × 320 预览):点「转换并下载 PNG」即得 480 × 320 的文件。
SVG 尺寸 × 倍率 → PNG 输出尺寸对照表(默认 12 行,数值仅作演示)
用途SVG 尺寸1 倍2 倍4 倍
示例图240 × 160240 × 160480 × 320960 × 640
方形头像120 × 120120 × 120240 × 240480 × 480
横幅800 × 400800 × 4001600 × 8003200 × 1600
favicon64 × 6464 × 64128 × 128256 × 256
OG 图512 × 288512 × 2881024 × 5762048 × 1152
社媒封面1200 × 6301200 × 6302400 × 12604800 × 2520
视频封面320 × 180320 × 180640 × 3601280 × 720
缩略图160 × 90160 × 90320 × 180640 × 360
小图标48 × 4848 × 4896 × 96192 × 192
触控图标96 × 9696 × 96192 × 192384 × 384
说明配图360 × 240360 × 240720 × 4801440 × 960
宽幅横幅720 × 360720 × 3601440 × 7202880 × 1440

使用方法

  1. 打开页面时输入框已预载一段 240 × 160 的示例 SVG(圆角矩形 + 圆 + 文字,共 311 字节),直接可用。
  2. 把倍率设在 1~8 之间(默认 2),按 Ctrl+Enter(Mac 用 Cmd+Enter)或点「转换并下载 PNG」;Enter 键保留给代码换行。
  3. 示例按倍率 2 输出 480 × 320 的 PNG:预览画布同步显示,浏览器开始下载文件;只要预览不要文件就点「仅预览」。
  4. 换自己的图:粘贴完整 <svg> 代码,或点「上传 .svg 文件」读入;没有 width/height 时会从 viewBox 推断尺寸。
  5. 下方尺寸 × 倍率对照表默认 12 行,点「加载更多」追加 12 行;「导出 CSV」带 BOM,「复制对照表」按制表符复制。

这个SVG转PNG能解决什么

平台只收位图:某些素材库、App 上传口、聊天工具不支持 .svg,需要先把矢量图固化成指定尺寸的 PNG,本页一次粘贴出图,倍率自由控制,不用打开桌面设计软件。

高分屏截图发虚:把 SVG 先按 1 倍转成 PNG 再拉伸会糊;本页在栅格化这一步就直接把画布开成 2 倍、4 倍尺寸,矢量边缘按目标分辨率重新计算,4 倍下示例图是 960 × 640 共 614,400 像素,放大后边缘依旧锐利。

需要透明底的图标:SVG 转 PNG 默认保留透明通道(示例图圆角外是透明的),适合做 favicon、App 图标源文件;若 SVG 根元素带背景矩形则输出不透明。

本页只做 SVG → PNG 单向栅格化,不做 PNG 转 SVG(位图描摹是另一类工具),也不做 JPG / WebP 互转——那几个方向在图片格式转换族页面里。

原理与规则说明

SVG转PNG的调用链是固定的三步:第一步把 SVG 源码内联成 data:image/svg+xml;charset=utf-8, + encodeURIComponent(源码) 的 data URI,交给一个 Image 对象;第二步等 Image.decode() 完成(不支持的浏览器回落 onload);第三步 canvas.width = w × scale、drawImage(img, 0, 0, w × scale, h × scale),最后 toDataURL('image/png') 导出。

为什么必须绕道 data URI 而不能把页面里的 <svg> 元素直接画进 canvas:drawImage 只接受位图来源(img / video / canvas / ImageBitmap),传入 SVG DOM 元素会抛 TypeError;而独立 <svg> 若没有显式 width/height,作为图像源时内在尺寸未定义,同样失败。data URI + <img> 是规范允许且全浏览器一致的唯一通路。

等 decode() 而不是画完就导出:decode 返回的 Promise 保证图像数据已解码可用,避免 onload 后立即 drawImage 在个别浏览器的首帧空白问题。渲染失败(语法错、截断)走 onerror,本页把失败原因回显而不是静默出白图。

SVG 在 <img> 里运行于「安全静态模式」:外部 <use xlink:href="http…">、外部 <image>、@font-face 引用的网络字体、脚本一律不执行不加载。所以引用外部资源的 SVG 转出来会缺字缺图——本页在转换前扫描源码并提前警告,提示把资源内联(字体转 path,图片转 data URI)。

倍率对清晰度的意义:SVG 是矢量描述,栅格化时按多少像素画一次成型;scale=2 时画布是 480 × 320,圆和文字边缘按 2 倍分辨率重采样,缩小使用时抗锯齿余量充足。反过来「先 1 倍转 PNG 再放大」是在位图上插值,边缘必然发糊——这是栅格化与位图缩放的本质区别,也是本页把倍率做成一级控件的原因。

完整示例(数值仅作演示)

默认示例:预载 SVG 为 240 × 160(311 字节),内联成 data URI 后长 546 字符。倍率 2 → 输出 480 × 320;倍率 4 → 960 × 640;倍率 8 → 1920 × 1280。控件默认倍率 2、正文与对照表首行三处一致。

favicon 示例:把 64 × 64 的 SVG 按倍率 4 转 256 × 256,一次性覆盖 ICO 常用的 16 / 32 / 48 / 256 四档(缩小时由系统插值),对照表第 4 行可查。

无 width 属性示例:只写 viewBox="0 0 120 120" 的 SVG,本页从 viewBox 推断 120 × 120,按倍率 2 输出 240 × 240——与对照表第 2 行同尺寸。

输入范围与对照表

输入范围:SVG 源码 ≤ 2MB(超出提示精简),倍率 1~8、步长 1;输出画布限制单边 ≤ 16,384px 且总像素 ≤ 40,000,000(约 4,000 万),超过会拒绝并给出最大可用倍率。例如 1200 × 630 的社媒封面最高允许 7 倍(8400 × 4410 = 37,044,000 像素),8 倍即越界。

输入情形处理提示文案要点
正常 SVG + 合法倍率转换并下载输出尺寸回显
输入为空拒绝SVG 代码不能为空
语法错误 / 标签未闭合DOMParser 报错拒绝附 parsererror 原文
根元素不是 svg拒绝指出当前根元素名
缺 width/height 且缺 viewBox拒绝要求补尺寸属性
引用外部字体 / 图片 / use警告后仍可转换说明安全静态模式会丢弃外部资源
倍率越界或非整数拒绝给出 1~8 范围
输出超 16384px 或 4000 万像素拒绝给出最大可用倍率

12 行尺寸倍率对照表覆盖图标、横幅、封面等常见用途;「加载更多」追加的 12 行(48 × 48 → 96 × 96 × 192 × 192 等)按同一乘法现算,与首屏 12 行同源。

输入范围、边界与精度说明

每条非法路径的文案:输入框为空提示「SVG 代码不能为空:请粘贴以 <svg 开头的代码,或点『载入示例』」;语法错时附 DOMParser 的 parsererror 文本(含行列号)不吞错;根元素是 <html> 等时提示「根元素必须是 svg:当前是 xxx」;倍率填 0、9、2.5 时分别提示范围与非整数;两个数都超限的输出尺寸拒绝时给出「最大可用倍率 = floor(min(16384/w, 16384/h, sqrt(40000000/(w×h))))」的计算结果。下载失败不存在静默:画布为空时不触发下载。

精度与保真边界:栅格化在整数倍率下逐像素重采样,无累积误差;非整数倍率(本页不允许)会造成像素网格错位。文字渲染使用系统 sans-serif 回落字体,与设计软件里嵌入字体的效果可能有 1~2 像素级的字距差异;对字形有严格要求时先把文字转路径再转换。

尺寸推断顺序:width/height 属性 → viewBox 的宽高 → 拒绝。width 带单位(如 width="240px" 或 width="100%")时取数值部分;百分比没有内在尺寸,按无 width 处理走 viewBox。

常见误用:在 SVG 里写 <script> 期望转出来的 PNG 带交互——安全静态模式下脚本不执行,位图也不存在交互;另一个误用是拿本页放大已有 PNG,位图放大请用图片缩放类工具,本页的倍率只对矢量源有意义。

常见问题

为什么直接把网页里的 SVG 元素画进 canvas 会失败?

drawImage 的参数必须是位图来源,SVG DOM 元素没有内在位图尺寸,规范不允许直接绘制。标准做法就是本页的路径:序列化 → data URI → Image → drawImage。

转出来的 PNG 字体怎么不对?

SVG 在 img 里是安全静态模式,@font-face 引用的网络字体不会加载,只能回落到系统字体。要完全一致,先把文字转成路径(设计软件的「轮廓化」),再粘贴转换。

倍率设多大合适?

目标显示尺寸除以 SVG 原始尺寸:图标类至少 2 倍(高分屏),印刷或大屏用 4 倍。倍率越大文件越大,960 × 640 以上的 PNG 主要受内存限制而不是画质。

转出来是空白或缺图?

检查 SVG 里有没有外部引用:外部 image、use、字体在安全静态模式下全部被丢弃,本页会在转换前扫描并警告;把资源内联成 data URI 或转成 path 即可。

透明背景会保留吗?

会。PNG 支持透明通道,SVG 画布未覆盖的区域导出后是透明的;如果需要白底,在 SVG 里加一个铺满的背景矩形。

为什么 1200 × 630 的图最多只能 7 倍?

输出像素上限设了 4,000 万:1200 × 630 = 756,000 像素,× 7 = 37,044,000 在限内,× 8 = 48,384,000 已越界,且 9600 × 5040 的 PNG 多数场景用不上,超限只会白白耗内存。

上传的 .svg 文件怎么读进来的?

用 FileReader 读成文本后填入同一个输入框,后续流程与粘贴完全一致;文件不离开浏览器。

转换会上传我的 SVG 吗?

不会。解析用浏览器内置 DOMParser,渲染与导出全在本地 canvas 完成,无网络请求,可在开发者工具 Network 面板自查。

相关工具

SVG转PNG只解决「矢量固化为位图」一个方向,图格式相关的还有这些页面。