2010-02-04 99 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濾鏡基元可以使圖像去飽和。