Ruby GTK+2 画像処理
投稿日: | |
---|---|
修正日: | |
タグ: |
本稿はRuby GTK+2の画像関係に関するメモである.
Ruby GTK+2で単に画像を使用する際Gtk::Imageクラスを使用する.
#!/usr/bin/ruby1.8
require 'gtk2'
win = Gtk::Window.new()
img = Gtk::Image.new("./img.png")
win.add(img)
win.show_all()
Gtk.main()
この時,表示される画像のサイズはオリジナルのサイズで使用される.しかし画像があまりにも大きい場合など,そのような表示が好ましくないことがある.そのような場合,次のようなの解決策がある.
- スクロールバーを付けて表示される範囲を制限
- 画像のサイズを変更
画像サイズ変更
次のコードは画像のサイズを倍にしたものを表示するプログラムのものである.
#!/usr/bin/ruby1.8
require 'gtk2'
win = Gtk::Window.new()
img = Gtk::Image.new()
src_pxb = Gdk::Pixbuf.new("./img.png")
dst_pxb = src_pxb.scale(src_pxb.width*2, src_pxb.height*2, Gdk::Pixbuf::INTERP_HYPER)
img.set_pixbuf(dst_pxb)
win.add(img)
win.show_all()
Gtk.main()
画像のサイズを変更する場合,Gdk::Pixbufを使用する.GtkではなくGdkであることに注意.scale関数など,Pixbufに関する詳細はここを参考にされたし.
scaleの第1引数は新しい画像の横幅,第2引数は新しい画像の高さ,第3引数は画像サイズの変更に伴う補完の方法を表す.第3引数はGdkInterpType型で,標準ではGdk::Pixbuf::INTERP_BILINEARである.GdkInterpType型の詳細はここを参照されたし.
画像合成
GTK+では2.8以降cairoを用いてwidgetの描画を行なっている.Ruby GTK2ではこれを使用することで複数の画像を合成することができる. 以下にサンプルコードを示す.
bg.png
img.png
合成した画像(Gdk::Pixbuf)はsave関数を使用することで保存することもできる.#!/usr/bin/ruby1.8 # -*- coding: utf-8 -*- require 'gtk2' require 'cairo' win = Gtk::Window.new() img = Gtk::Image.new() bg = Gdk::Pixbuf.new("./bg.png") pict0 = Gdk::Pixbuf.new("./img.png") pict1 = Gdk::Pixbuf.new("./img.png") pxm = Gdk::Pixmap.new(nil, bg.width, bg.height, 24) ctx = pxm.create_cairo_context # bg ctx.set_source_pixbuf(bg) ctx.paint # pict0 ctx.set_source_pixbuf(pict0, -20, -25) ctx.paint # pict1 ctx.set_source_pixbuf(pict1, 0, -5) ctx.paint pxb = Gdk::Pixbuf.from_drawable(Gdk::Colormap.system, pxm, 0, 0, bg.width, bg.height)img.set_pixbuf(pxb) win.add(img) win.show_all() Gtk.main()
pxb.save("output.png", "png")
透明化
paint関数は引数で透明度を指定できる. 以下はそのサンプルである.
#!/usr/bin/ruby1.8
require 'gtk2'
require 'cairo'
win = Gtk::Window.new()
img = Gtk::Image.new()
bg = Gdk::Pixbuf.new("./bg.png")
pict = Gdk::Pixbuf.new("./img.png")
pxm = Gdk::Pixmap.new(nil, bg.width, bg.height, 24)
ctx = pxm.create_cairo_context
ctx.set_source_pixbuf(bg, 0, 0)
ctx.paint()
ctx.set_source_pixbuf(pict, 0, 0)
ctx.paint(0.7)
pxb = Gdk::Pixbuf.from_drawable(Gdk::Colormap.system, pxm, 0, 0, pict.width, pict.height)
img.set_pixbuf(pxb)
win.add(img)
win.show_all()
Gtk.main()
与える引数が1に近いほど透明度が低く,0に近いほど透明度が高い.
gimpで背景を透明に
ここでは既存の画像の背景を透明にする方法としてGIMPを使った例を紹介する.本稿で使用するGIMPのバージョンは2.8.2である.透明化の流れは次のような手順で行う.
- 透明化の設定
- [レイヤー(L)]
- [透明部分(A)]
- [アルファチャンネルを追加(H)]
- 背景の切り取り
こちらのサイトを参考に.