2011-06-04 35 views
3

我正在嘗試使用RMagick將SVG轉換爲不同大小的PNG。使用RMagick讀取圖像時的設置密度

當我在SVG中讀取Magick::Image.read('drawing.svg')並將其寫出到drawing.png(相當於從命令行運行convert drawing.svg drawing.png)時,其大小爲744x1052。

讓我們假設我希望PNG的大小是默認值的兩倍。你不能只讀取它,調整它的大小,然後寫出來,因爲第一次柵格化SVG,然後將該圖像縮放爲兩倍,從而失去了質量以及首先使用矢量圖形的全部好處。相反,如果我理解正確,則應該在讀取時設置圖像的密度。

image = Magick::Image.read('drawing.svg'){self.density = 144}.first 

image.density仍會報告密度「最高72x72」,如果我寫出來的圖像作爲前具有相同的大小,744x1052。讀取時如何指定密度似乎並不重要。 144,「144」,144.0,「144.0」,「144x144」和「144.0x144.0」,它總是回到「72x72」。

從命令行運行convert -density 144 drawing.svg drawing.png按預期工作,並生成一個比以前大兩倍的PNG,即2104x1488。

我使用OS X 10.6.7,ImageMagick 6.7.0-0(通過MacPorts安裝),RMagick 2.13.1和Ruby 1.9.2p180。當我將代碼放入Heroku上的一個Sinatra webapp的上下文中時,它具有相同的不正確行爲,所以這個問題似乎不在OS X或MacPorts中。

回答

4

密度是關於分辨率(即每英寸點數),而不是渲染大小。來自fine manual

圖像的垂直和水平分辨率(以像素爲單位)。默認值是「72x72」。

我認爲你正在尋找resizeresize!

更改接收器的大小設置爲指定尺寸。

您可以通過兩種方式指定新尺寸。要麼明確指定新的寬度和高度,要麼指定一個比例因子,一個代表百分比變化的數字。

那麼這將工作:

Magick::Image.read('drawing.svg').first.resize(2).write('drawing.png') 

或者這樣:

img = Magick::Image.read('drawing.svg').first 
img.resize!(2) 
img.write('drawing.png') 

我不知道爲什麼convert行爲與圖書館不同,有可能是在玩其他默認設置,在庫中有不同的默認值,或者-density可以設置密度。

如果resize是不是做的伎倆你(並根據您的意見,它正在發生爲時已晚要使用的),你可以嘗試設置在塊size parameter

img = Magick::Image.read('drawing.svg'){ |opts| opts.size = '2104x1488' }.first 

當然,你必須事先知道SVG有多大。您應該能夠爲幾何體指定類似200%x200%的東西,但read在我嘗試時總是會忽略Magick::Geometry上的標誌。

+1

如果我只是使用柵格轉換光柵,resize肯定會是我想要的。但是,如果我在閱讀SVG後調整大小,我就會放大柵格圖像,所以我會得到您期望的[惡意反鋸齒工件](http://i.imgur.com/vINJF.png)。 'convert'命令似乎首先將SVG柵格化爲一個更大的圖像,這會產生[正確平滑的線條](http://i.imgur.com/640WE.png)。 – hynkle 2011-06-04 18:31:09

+3

它不會讓我編輯我的評論,但我想提及[我在ImageMagick論壇中找到的一個線索](http://goo.gl/hVPt6),它表示'-density'的一個用法是指定矢量圖像的讀取密度。它顯然不像RMagick那樣具有與「轉換」相同的含義。 – hynkle 2011-06-04 18:39:06

+1

@ hynkle:看看我的更新。你應該能夠爲'opts.size'指定幾何百分比,但是我無法使它工作或產生錯誤消息,告訴我爲什麼它不起作用。這對我與ImageMagick的交互來說非常典型:如果你能使它工作,那麼可怕的界面就是很好的庫。 – 2011-06-04 19:19:31