mieki256's diary



2014/06/03(火) [n年前の日記]

#3 [ruby][dxruby] DXRuby と cairo と rsvg2 で svgを描画して表示してみたり

_Rubyist Magazine - cairo: 2 次元画像描画ライブラリ によると、rsvg2 ライブラリを使えば svgファイルを cairo で描画できるらしくて。

であれば、DXRuby上でも、cairo と rsvg2 を使って svgファイルを描画できるのかなと。早速実験。

しかし、Windows + Ruby 1.9.x で、rsvg2 を使おうとしたら、ハマってしまったり。以下のライブラリが必要なのだけど…。

_rsvg2 | RubyGems.org | your community gem host
_gdk_pixbuf2 | RubyGems.org | your community gem host
_glib2 | RubyGems.org | your community gem host

Ruby 2.x の場合。 :

Ruby 2.x は、以下の通りで、すんなりインストールできた。
gem install cairo --platform=x86-mingw32
gem install glib2
gem install gdk_pixbuf2
gem install rsvg2
> gem list | grep "cairo\|glib2\|gdk_pixbuf2\|rsvg2"

cairo (1.12.9 x86-mingw32)
gdk_pixbuf2 (2.2.0 x86-mingw32)
glib2 (2.2.0 x86-mingw32)
rsvg2 (2.2.0 x86-mingw32)

Ruby 1.9.x の場合。 :

Ruby 1.9.x では問題があって。
  • rsvg2 2.2.0 は、cairo 1.12.8 以降を要求する。
  • しかし、Ruby 1.9.x で利用できるのは、cairo 1.12.4 まで。
つまり、このままだと Ruby 1.9.x で rsvg2 は使えない。

試しにバージョンを落としてインストールしてみたり。
gem install cairo --version '=1.12.4'
gem install glib2 --version '=1.2.6'
gem install gdk_pixbuf2 --version '=1.2.6'
gem install rsvg2 --version '=1.2.6'
すると、途中で、glib2 と cairo の最新版を勝手にインストールされてしまった。

ダメ元で、最新版だけをアンインストールしてみる。
> gem uninstall glib2

Select gem to uninstall:
1. glib2-1.2.6-x86-mingw32
2. glib2-2.2.0-x86-mingw32
3. All versions

> 2

Successfully uninstalled glib2-2.2.0-x86-mingw32

> gem uninstall cairo

Select gem to uninstall:
1. cairo-1.12.4-x86-mingw32
2. cairo-1.12.9-x86-mingw32
3. All versions

> 2

Successfully uninstalled cairo-1.12.9-x86-mingw32

以下のような状態になった。
> gem list | grep "cairo\|glib2\|gdk_pixbuf2\|rsvg2"

cairo (1.12.4 x86-mingw32)
gdk_pixbuf2 (1.2.6 x86-mingw32)
glib2 (1.2.6 x86-mingw32)
rsvg2 (1.2.6 x86-mingw32)

この状態にすれば、Ruby 1.9.x でも、rsvg2 が一応使えた、ように見えた。

ただ、最新版じゃないから、何かバグがあったりするのかもしれないけど…。そもそも、こんなインストール作業、許されるのかな…。初心者なので分かりません。

実験に使ったソース。 :

以下のようなソースを書いた。

_svgdisp_width_dxruby.rb
require 'rsvg2'
require 'stringio'
require 'dxruby'

# SVGをrsvg2とcairoで描画してDXRubyのImageにする
#
class Svg2Image
  attr_accessor :handle
  attr_accessor :width
  attr_accessor :height
  attr_accessor :ratio
  attr_accessor :image

  def initialize(infile, ratio = 1.0)
    self.handle = RSVG::Handle.new_from_file(infile)
    make_image(ratio)
  end

  def make_image(ratio = 1.0)
    self.ratio = ratio.to_f
    self.width, self.height, = self.handle.dimensions.to_a
    self.width *= ratio
    self.height *= ratio

    Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32,
                            self.width, self.height) do |surface|
      context = Cairo::Context.new(surface)
      context.scale(self.ratio, self.ratio)
      context.render_rsvg_handle(self.handle)

      temp = StringIO.new("", "w+")
      surface.write_to_png(temp)
      temp.rewind
      self.image.dispose if self.image
      self.image = Image.loadFromFileInMemory(temp.read)
      temp.close
    end

  end
end

if $0 == __FILE__
  # ----------------------------------------
  # 動作テスト

  infile = "Ghostscript_Tiger.svg"

  scale = 0.5
  scale_add = 0.1
  svg = Svg2Image.new(infile, 0.5)

  font = Font.new(14)

  Window.bgcolor = [64, 64, 64]
  Window.loop do
    break if Input.keyPush?(K_ESCAPE)

    # Rキーで拡大縮小再描画
    if Input.keyDown?(K_R)
      svg.make_image(scale)
      scale_add *= -1 if scale <= 0.25 or scale >= 1.5
      scale += scale_add
    end

    Window.draw(0, 0, svg.image)

    s = "#{Window.real_fps.to_i} FPS  #{Window.getLoad.to_i} %"
    s += "  #{svg.image.width} x #{svg.image.height}"
    Window.drawFont(4, 4, s, font)
  end
end
Ghostscript_Tiger.svg は、 _File:Ghostscript Tiger.svg - Wikimedia Commons から入手。

結果は以下の通り。
svgdisp.png
描画できたっぽい感じ。

Ruby 1.9.x を使ってる場合は、ライブラリのインストールが面倒臭いという問題はあるものの。一応、DXRuby でも、この程度の記述で、svgファイルを描画できました。cairo と rsvg2、ありがたいなあ。

でもまあ、DXRuby でベクターデータを描画するメリットって、思いつかないのですけど。あらかじめビットマップ画像にしておいて、ソレを使うほうがいいよな…。

cairo の描画結果を、DXRuby を使うことで即座に表示・確認できる、といった使い方なら、これもアリなのかな…。

以上です。

過去ログ表示

Prev - 2014/06 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project