跳到主要内容
PulsarKit

SVG转PNG

直接在浏览器中把SVG文件渲染成PNG,可按任意倍数或精确像素尺寸输出。绘制之前,脚本和外部链接会先被移除。

把文件拖到这里

.svg · 最大10 MB

如何转换为PNG

  1. 1

    拖入SVG文件

    一次最多100个文件。处理之前,会先检查每个文件是不是真正的SVG标记。

  2. 2

    设置倍数或精确尺寸

    把图形本身的尺寸乘以0.5到10,或者直接输入需要的宽度,高度按宽高比自动计算。

  3. 3

    下载PNG

    一个文件直接得到PNG,多个文件打包成ZIP。结果卡片上显示实际得到的像素尺寸。

按倍数渲染,不是重新采样

SVG没有像素,它记录的是绘制图形的指令。所以按4×渲染出的PNG不是把小图硬放大:每条曲线都按更大的尺寸重新绘制,边缘依然清晰。这个工具正是利用了这一点:渲染前,根元素上的宽度和高度会改写成你要求的像素尺寸,浏览器直接按目标分辨率把矢量路径栅格化,而不是先画出一张小位图,再在画布上把它放大。默认倍数是2,针对最常见的情况:为普通显示屏绘制的标志,要在Retina显示屏上也显示清楚。有的平台要求固定的像素数,比如1024×1024的应用图标或1200×630的社交分享预览图,这时用精确像素模式。

为什么要移除脚本和外部链接

SVG是XML,而XML能装的不只是图形。别人给的文件里可能有<script>元素、onload这类事件处理属性、装着整个HTML文档的foreignObject,或者指向其他服务器上图片和字体的引用。不加防备地打开这种文件,会在你的标签页里运行别人的代码,或者悄悄告诉远程服务器你打开了它、在什么时间打开。这里的每个文件都先经过DOMPurify的SVG配置处理,再经过我们自己的第二遍清理:凡是不指向同一文件内锚点、也不是内嵌data: URI的href、xlink:href和CSS url(),全部移除。以data: URI内嵌的字体和图片会保留,正常渲染。移除的内容都会计数,所以图形有一部分变成空白时,你能知道原因。

透明和背景

PNG支持alpha通道,所以默认情况下,SVG没有绘制的区域保持透明。要放在彩色页头上的标志,需要的正是这样。如果目标位置不支持透明,可以选择白色或自定义颜色:先填充背景,再把图形画在上面,一遍完成,边缘不会出现光晕。

文件留在你的设备上

读取、清理、渲染和PNG编码都在这个浏览器标签页里完成。不上传任何内容,也不保存任何内容。正因为有清理这一步,在本地做这件事才是安全的:SVG接触到页面时,已经不能再运行代码,也不能再访问网络。

常见问题

为什么高倍数下PNG看起来模糊?

按理不会,因为矢量图是按目标尺寸重新渲染的,而不是拉伸。如果看起来确实发虚,SVG里很可能内嵌的是位图(data: URI图片),而不是真正的矢量路径。这种位图的分辨率是固定的,放大也不会增加细节。用编辑器打开源文件,看看图形是路径还是一张内嵌的图片。

SVG里的脚本会怎么处理?

渲染前会被移除,onload、onclick这类事件处理属性和所有foreignObject块也一并移除。文件里的任何内容都不会被执行。这不是可选项,也不是一个设置:这里没有任何一条代码路径会不经清理就渲染SVG。

为什么SVG里的外部图片没有显示?

所有指向http://、https://或协议相对地址//的引用都会被移除,因为去获取它们就等于告诉那台服务器你打开了这个文件。只有指向同一文档内id的引用和内嵌的data: URI会保留。如果结果里需要这些图片,先把它们以data: URI的形式嵌入SVG,再转换。

怎么得到精确的像素尺寸?

把输出尺寸切换到“精确像素”,输入宽度。高度留为0,就会按图形的宽高比计算,不会变形;如果你确实想拉伸到固定的框里,就输入高度。两边最大都是16384像素,这是浏览器画布的上限。

能保留透明背景吗?

能,默认就保留。没有绘制的区域在PNG里的alpha值为0。如果需要纯色底,在“背景”里选择白色或自定义颜色,因为一些旧工具和邮件客户端会把PNG的透明区域显示成黑色。

SVG没有viewBox怎么办?

这时由width和height属性决定固有尺寸。如果这两个属性也没有,就使用SVG规范的默认值300×150,再按倍数计算。这和浏览器给这个文件的尺寸相同,所以结果和你直接打开SVG看到的一致。

一次能转换多少个文件?

最多100个,每个10 MB,合计200 MB。它们共用一套设置,逐个渲染;一个文件失败不会取消其余文件,所有成功的结果打包成一个ZIP返回。

文件会上传到服务器吗?

不会。清理和渲染都在你的浏览器中运行。没有上传,没有排队,也不保存副本;关闭标签页就算清理完毕。

指南

相关工具