2017-07-16 111 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'這樣的小數 - 例如。鉻。 –