2012-07-11 104 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