将svg转换为png而不更改像素值

时间:2017-07-16 10:04:32

标签: python svg imagemagick png

我已经陷入这个问题一段时间了。基本上,我有一堆svg图像。 svg文件中的每个“子”都标有一些像素值。目前这个值的数量非常小,一切都被标记为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个(背景+三个符号)。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的要求没有多大意义。据我所见,您的示例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使用特定的颜色paletter。

答案 1 :(得分:0)

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

我发现了 2 个不错的:

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

    “转换 in.svg +antialias out.png”

但是要小心,我的消息来源说“+”会停用 AA,而“-”会激活它。但是来源很旧,这看起来很奇怪。我不能尝试这个

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