在不更改像素值的情况下将 svg 转换为 png

Converting svg to png without changing the pixel values

我被困在这个问题上有一段时间了。本质上,我有一堆 svg 图片。 svg 文件中的每个 'child' 都标有一些像素值。目前这个值的数量非常小,所有东西都被标记为 rgb(0.0, 0.0, 0.0), rgb(1.0, 1.0, 1.0) ... rgb(9.0, 9.0, 9.0),所以基本上我有 10 种不同的类型像素数。

现在,我想将这些图像转换成png格式,更重要的是我需要像素值的映射是1对1的。本质上,所有在 svg 文件中具有值 rgb(0.0, 0.0, 0.0) 的像素,在 png 文件中需要具有值 rgb(x,x,x)(或者更好的 L(x)); svg 文件上的 rgb(1.0, 1.0, 1.0) 需要转换为 png 文件上的 rgb(y,y,y)(或更好的 L(y))等等。这种一对一映射对我的应用程序来说是一个破坏因素,因为这基本上是我工作的基本事实。

只需在控制台中写入:

    convert test.svg test.png

没有给我想要的东西。检查值的直方图,似乎我有 248 个唯一值而不是 10 个,这对我来说不是很好(尽管其中绝大多数只有几个像素)。

有谁知道:

到目前为止,我已经尝试使用其他库,例如 Python 的 cairosvg,但效果似乎更差。是的,我知道 svg 和 png 是完全不同的格式。

为澄清起见,添加 svg 和 png 文件:

svg: https://drive.google.com/open?id=0B_vhcDz1zxeYeGVDSnhfeWplOWs

png: https://drive.google.com/open?id=0B_vhcDz1zxeYUnYzZUtIUmVqVWM

打开Python中的文件,似乎有248个独特的像素值,而应该只有4个(背景+三个符号)。

谢谢!

您的要求没有多大意义。据我所知,您的示例 SVG 文件只有两种颜色:黑色和白色 (rgb(255.0, 255.0, 255.0))。那么这 10 种颜色的创意从何而来?

此外,SVG 标准并未明确指定应如何将矢量形状转换为像素。 SVG 渲染器之间会有细微差别。

请记住,通过像素中间的矢量形状边缘将产生灰色像素。这称为抗锯齿。它旨在使边缘看起来更平滑。我想这就是为什么您看到的像素值比您预期的多得多。


也许您的意思是您想要一种禁用抗锯齿的方法?一些转换程序可能有执行此操作的选项。或者,您可以尝试将 shape-rendering 属性添加到文件的根 <svg> 标记中:

<ns0:svg ...(snip)... shape-rendering="crispEdges">

然而,某些 SVG 转换程序可能不支持此属性。但是如果你在大多数浏览器中尝试它,你会发现它有效。

关闭抗锯齿后生成的输出看起来不太好。但也许出于您的目的,您并不关心这些。


或者,您可能想知道如何将 SVG 转换为位图,同时将抗锯齿限制为 10 个特定的灰度级别? Imagemagick 让你做到这一点。我不是 Imagemagick 用户,但显然您可以通过使用 -map 参数传递调色板图像来告诉 imagemagick 使用特定的调色板。

3 年但没有很好的解决方案 gg:

我找到了 2 个不错的:

  1. 在ImageMagick命令行中可以使用:

    "转换 in.svg +抗锯齿 out.png"

但请注意,我的消息来源说“+”会停用 AA,而“-”会激活它。但是来源很旧,这看起来很奇怪。我无法尝试这个

  1. Inkscape 在更新中带来了一个很好的解决方案(我在版本 1.0.1 中尝试过): 在“导出 png”的高级设置中,您可以直接选择抗锯齿 "CAIRO_ANTIALIAS_NONE" 非常适合我