#!ruby -Ku # -*- mode: ruby; coding: utf-8 -*- # Last updated: <2017/04/16 19:32:32 +0900> # # cairo(rcairo) + Ruby/Tk の描画テスト # # 参考ページ # Rubyist Magazine - cairo: 2 次元画像描画ライブラリ # http://magazine.rubyist.net/?0019-cairo # # 3階建ての2階角部屋 2nd : ruby/tk + cairoで高速化を目指す 3 # http://blog.livedoor.jp/gaziya/archives/54511355.html require 'cairo' require 'tk' require "tkextlib/tkimg/png" require 'stringio' w, h = 640, 480 # ---------------------------------------- # cairoによる描画 # サーフェイス作成 surface = Cairo::ImageSurface.new(Cairo::FORMAT_ARGB32, w, h) # コンテキスト作成。コレを使って描画していく context = Cairo::Context.new(surface) # 背景相当を描画。サーフェイス全体を塗り潰し context.set_source_rgba(0, 0, 0, 0) # r, g, b, a context.rectangle(0, 0, w, h) # 矩形を指定 context.fill # 塗り潰し # 赤丸を描画 context.set_source_rgb(1, 0, 0) # r, g, b radius = h / 3 context.arc(w / 2, h / 2, radius, 0, 2 * Math::PI) # 円を指定 context.fill # ---------------------------------------- # Tk関係の設定 # Tkでキャンバス作成 canvas = TkCanvas.new(:width => w, :height => h).pack # フルカラー画像を扱えるクラスを生成 img = TkPhotoImage.new(width: w, height: h) # cairoの描画結果をStringIOを使ってpng出力後、 # TkPhotoImage の data に渡す StringIO.open { |io| surface.write_to_png(io) img.data = Tk.BinaryString(io.string) } x, y = w / 2, h / 2 # 画像の中心が描画位置の基準になるらしい TkcImage.new(canvas, x, y, :image => img) # Tkのウインドウを表示 Tk.mainloop