我已经陷入这个问题一段时间了。基本上,我有一堆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个(背景+三个符号)。
谢谢!
答案 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 个不错的:
在 ImageMagick 命令行中,您可以使用:
“转换 in.svg +antialias out.png”
但是要小心,我的消息来源说“+”会停用 AA,而“-”会激活它。但是来源很旧,这看起来很奇怪。我不能尝试这个
"CAIRO_ANTIALIAS_NONE"
非常适合我