SVG 转为黑白

4 投票
4 回答
9602 浏览
提问于 2025-04-15 18:54

我想把SVG文档转换成黑白的。我的尝试是用下面这个Makefile脚本,里面用了'sed':

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

这个方法对线条等效果不错,但对填充颜色就不行。基本上,如果线条不是透明的(也就是没有设置为'none'),我就把它转换成黑色。我也想对填充颜色做同样的处理,如果填充颜色不是白色或者透明的,那就转换成黑色。

我在想,是否有更好的方法来实现这个功能,比如用XSLT,但我没有这方面的经验。有没有人能帮帮我呢?

4 个回答

0

我首先想到的是,用 sed 之类的工具来处理 XML(在这个例子中是 SVG)可能会有点危险,因为这些工具可能无法正确处理 XML 字符,或者不尊重字符编码。

不过,考虑到你的数据集可能比较简单和有限,这样的问题可能就不太严重了。

考虑使用 XPath 解决方案(包括 XSLT)听起来不错,因为这样你可以准确找到想要修改的部分。这里可能会用到某些 XQuery 的实现。

还有一个完全不同的选择是 XMLStarlet,这是一个用于在脚本中处理 XML 的命令行工具集。

最后,你能否使用一些编程工具来完成这个任务?在 Java 领域,我会首先选择 Batik

0

我觉得你需要一个完整的CSS解析器来处理所有的SVG。不过,如果是“某个特定矢量编辑软件生成的SVG”,那么用XSLT来编辑样式属性的字符串(就像你现在做的那样,只不过要正确处理样式,避免像<text>这样的情况)可能就足够了。

如果你能修改一下你的问题,解释一下你的方法在填充颜色方面是怎么失败的,那会很有帮助。

5

我会尝试两个方法:

1- Inkscape 这个软件好像可以做到这一点 - Inkscape 转换
2- SVG 文件可以使用一个叫做 ColorProfile 的属性,这个属性可以指向一个 ICC 色彩配置文件。我会试着在这里引用一个灰度色彩配置文件,看看会发生什么。看起来这里有一个可用的 链接

撰写回答