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
であれば、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 では問題があって。
試しにバージョンを落としてインストールしてみたり。
ダメ元で、最新版だけをアンインストールしてみる。
以下のような状態になった。
この状態にすれば、Ruby 1.9.x でも、rsvg2 が一応使えた、ように見えた。
ただ、最新版じゃないから、何かバグがあったりするのかもしれないけど…。そもそも、こんなインストール作業、許されるのかな…。初心者なので分かりません。
- rsvg2 2.2.0 は、cairo 1.12.8 以降を要求する。
- しかし、Ruby 1.9.x で利用できるのは、cairo 1.12.4 まで。
試しにバージョンを落としてインストールしてみたり。
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
結果は以下の通り。 描画できたっぽい感じ。
Ruby 1.9.x を使ってる場合は、ライブラリのインストールが面倒臭いという問題はあるものの。一応、DXRuby でも、この程度の記述で、svgファイルを描画できました。cairo と rsvg2、ありがたいなあ。
でもまあ、DXRuby でベクターデータを描画するメリットって、思いつかないのですけど。あらかじめビットマップ画像にしておいて、ソレを使うほうがいいよな…。
cairo の描画結果を、DXRuby を使うことで即座に表示・確認できる、といった使い方なら、これもアリなのかな…。
_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 endGhostscript_Tiger.svg は、 _File:Ghostscript Tiger.svg - Wikimedia Commons から入手。
結果は以下の通り。 描画できたっぽい感じ。
Ruby 1.9.x を使ってる場合は、ライブラリのインストールが面倒臭いという問題はあるものの。一応、DXRuby でも、この程度の記述で、svgファイルを描画できました。cairo と rsvg2、ありがたいなあ。
でもまあ、DXRuby でベクターデータを描画するメリットって、思いつかないのですけど。あらかじめビットマップ画像にしておいて、ソレを使うほうがいいよな…。
cairo の描画結果を、DXRuby を使うことで即座に表示・確認できる、といった使い方なら、これもアリなのかな…。
[ ツッコむ ]
以上です。