2010-02-04 42 views
2

我希望能够将SVG文档转换为黑白。我的尝试是使用'sed'的以下Makefile脚本:SVG黑白

%.bw.svg: %.svg 
    sed '/stroke:none/!s/stroke:[^;\"]*/stroke:black/g' $< > [email protected] 

这适用于行等,但不适用于填充。基本上如果中风不可见(无),那么我将它转换为黑色。我想为馅料做同样的事情,如果不是白色或不可见的,那么就会变成黑色。

我想知道以更好的方式做这样的事情是否太复杂,可能使用XSLT,但我没有经验。任何人都可以帮忙

+0

您的SVG会嵌入二进制图像吗? – 2010-02-04 21:15:09

+0

我甚至不知道你可以用SVG做到这一点:-) – 2010-02-04 21:18:30

回答

3

两个选项,我会尝试:

1 Inkscape中似乎是能够做到这一点 - Inkscape Convert
2- SVG支持可参考ICC色彩配置文件的SVG元素上ColorProfile属性。我会尝试在那里引用GrayScale颜色配置文件,看看会发生什么。看起来像有一个可用here

+0

很好找。我认为Inkscape称Python为引擎盖下的工作。我想知道它是否也有黑白版本。 – 2010-02-05 09:44:17

0

我的第一个想法是,通过sed等操作XML(在这种情况下,SVG)是危险的,因为它不会正确转义XML字符或尊重字符编码。

话虽如此,您的数据集可能会受到充分的约束和限制,这是不是一个特别的问题。

考虑到XPath解决方案(包括XSLT)听起来不错,因为您将能够精确识别要更改的组件。 XQuery的一些实现可能在这里有用。

一个非常不同的替代方案是XMLStarlet - 用于在脚本中处理XML的命令行工具集。

最后,您可以使用程序化工具集来执行此操作吗? Batik将是我的第一选择(在Java世界)。

+0

我在想一些简单的东西......不能在10行代码中完成这件事? – 2010-02-04 21:15:36

+0

我对问题域不够熟悉,无法给出这种指示 – 2010-02-04 21:16:28

0

我认为你需要一个完整的CSS解析器来完成SVG的所有工作;但对于“由某些特定向量编辑应用程序生成的SVG”,XSLT包含样式属性的字符串编辑(就像您现在所做的那样,除了它将正确地遵循样式并避免例如<文本>)可能就足够了。

如果您要编辑您的问题以解释您的策略对填充颜色的失败情况,这将非常有用。

0

首先:不要试着用sed这样做。编辑XML比这更复杂一点。您可以在图像上使用SVG filter effect。 ColorMatrix滤镜基元可以使图像去饱和。