2017-07-16 113 views
1

我一直在这个问题上停留了一段时间。基本上,我有一堆svg图像。 svg文件中的每个“孩子”都被标记了一些像素值。目前这个值的数量非常小,一切都被标记为rgb(0.0,0.0,0.0),rgb(1.0,1.0,1.0)... rgb(9.0,9.0,9.0),所以基本上我有10种不同的类型的像素。在不改变像素值的情况下将svg转换为png

现在,我想将这些图像转换为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文件(或甚至更好的L(y))上转换为rgb(y,y,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

我认为你需要更具体一些,实际上是展示一个文件,而不是抽象地谈论*“children”*,'L'和'x'以及*“像素类型”*,尤其是考虑到' svg'文件甚至没有像素。 –

+0

没有看到你的测试文件,我只能猜测你正在看到一个缩放效果,其中从SVG数据点插入PNG像素。 –

+0

公平点,我加了一个svg文件,和相应的png文件。 @MarkSetchell – TheRevanchist

回答

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使用特定颜色字母。

+0

在整个数据集上,我使用10种颜色(9种黑色阴影和一种白色背景)。在图片上,我上传了,应该有4种不同的颜色(一个白色和三个黑色,每个符号一个)。当然,这三个黑色区域对于人眼来说是难以区分的,但是如果以数组的形式打开该文件,它们会有不同的值。 我使用抗锯齿,但它并没有改变任何东西,我仍然得到比我应该更多的颜色。 – TheRevanchist

+0

控制-F 填充= “RGB(2.0,2.0,2.0)” 填充= “RGB(3.0,3.0,3.0)” 填充= “RGB(9.0,9.0,9.0)” ,你会发现其他三种颜色。 – TheRevanchist

+0

另外请注意,'rgb()'颜色中的值应该是整数。有些渲染器不支持像'2.0'这样的小数 - 例如。铬。 –