2012-07-11 60 views
4

我正嘗試在從SVG到PNG的Rails應用中進行圖像轉換。由於Heroku目前無法升級即時通訊,因此ImageMagick對我而言並沒有解決問題。我正在測試一些在dev中使用RSVG2/Cairo的想法,但遇到了障礙。紅寶石,RSVG和PNG流

我可以很容易地轉換和保存SVG至PNG這樣的:

#svg_test.rb 
require 'debugger' 
require 'rubygems' 
require 'rsvg2' 

SRC = 'test.svg' 
DST = 'test.png' 

svg = RSVG::Handle.new_from_file(SRC) 
surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 800, 800) 
context = Cairo::Context.new(surface) 
context.render_rsvg_handle(svg) 
surface.write_to_png(DST) 

但這只是讓我寫PNG文件出來。在應用程序中,我需要能夠隨時生成這些內容,然後將它們作爲數據發送到客戶端瀏覽器。而我無法弄清楚如何做到這一點,或者即使它得到支持。我知道我可以至少調用surface.data獲取原始數據,但我對圖像格式瞭解不足,無法知道如何將其作爲PNG獲取。

謝謝

+0

我很好奇,如果這個摸索出適合你。我有類似的需求,並遇到與Heroku和ImageMagick困難。 – gerwitz 2015-11-22 11:16:06

回答

7

啊哈!我非常接近,事後很明顯。只需使用StringIO對象調用surface.write_to_png函數即可。這會填充字符串對象,然後您可以獲取字節。下面是我寫的完成的svg_to_png函數,以及一個調用它的示例控制器。希望這可以幫助別人。

ImageConvert功能:

def self.svg_to_png(svg) 
    svg = RSVG::Handle.new_from_data(svg) 
    surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, 800, 800) 
    context = Cairo::Context.new(surface) 
    context.render_rsvg_handle(svg) 
    b = StringIO.new 
    surface.write_to_png(b) 
    return b.string 
    end 

測試控制器:

def svg_img 
    path = File.expand_path('../../../public/images/test.svg', __FILE__) 
    f = File.open(path, 'r') 
    t = ImageConvert.svg_to_png(f.read) 
    send_data(t , :filename => 'test.png', :type=>'image/png') 
    end