5

RailsアプリでSVGからPNGへの画像変換を試みています。Heroku が現時点で IM をアップグレードできない/アップグレードしたくないため、ImageMagick はうまくいきませんでした。開発で RSVG2 / Cairo を使用するいくつかのアイデアをテストしていますが、障害が発生しています。

次のように、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 として取得する方法を知るには、画像形式について十分に知りません。

ありがとう

4

1 に答える 1

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
于 2012-07-11T16:39:17.500 に答える