我希望能够将SVG文档转换为黑白。我尝试使用以下Makefile脚本和'sed':
%.bw.svg: %.svg
sed '/stroke:none/!s/stroke:[^;\"]*/stroke:black/g' $< > $@
这适用于线等,但不适用于填充。基本上,如果描边不是透明的(none),那么我会将其转换为黑色。如果填充不是白色或透明的,我也想将其转换为黑色。
我想知道是否有更好的方法来做这样的事情,也许使用XSLT,但我没有经验。有人可以帮助吗?
我希望能够将SVG文档转换为黑白。我尝试使用以下Makefile脚本和'sed':
%.bw.svg: %.svg
sed '/stroke:none/!s/stroke:[^;\"]*/stroke:black/g' $< > $@
这适用于线等,但不适用于填充。基本上,如果描边不是透明的(none),那么我会将其转换为黑色。如果填充不是白色或透明的,我也想将其转换为黑色。
我想知道是否有更好的方法来做这样的事情,也许使用XSLT,但我没有经验。有人可以帮助吗?
我会尝试两种方法:
1- Inkscape似乎能够完成此操作 - Inkscape Convert
2- SVG支持SVG元素上的ColorProfile属性,可以引用ICC颜色配置文件。我会尝试在那里引用一个GrayScale颜色配置文件,看看会发生什么。看起来这里有一个可用的。
我的第一反应是,通过sed
等方式操纵XML(在本例中为SVG)可能会很危险,因为它不会正确转义XML字符或遵守字符编码。
话虽如此,您的数据集可能受到足够的限制和限制,以使这不成为特别问题。
考虑XPath解决方案(包括XSLT)听起来不错,因为您将能够精确地识别要更改的组件。这里可能会有XQuery的某些实现有用。
一个非常不同的选择是XMLStarlet - 用于处理脚本中的XML的命令行工具集。
最后,您可以使用编程工具集来完成此操作吗?在Java世界中,Batik将是我的首选。
我认为你需要一个完整的CSS解析器来处理所有SVG;但是对于“某些特定矢量编辑应用程序生成的SVG”,包含样式属性字符串编辑的XSLT(与您现在正在进行的方式相同,除了它将正确坚持样式并避免例如<text>)可能足够。
如果您编辑您的问题以解释填充颜色的策略如何失败,那将会很有用。