魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

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()
この時,表示される画像のサイズはオリジナルのサイズで使用される.しかし画像があまりにも大きい場合など,そのような表示が好ましくないことがある.そのような場合,次のようなの解決策がある.
  • スクロールバーを付けて表示される範囲を制限
  • 画像のサイズを変更
前者の場合,Gtk::ScrolledWindowを使用して解決できる.後者の場合,今から紹介する方法がある.

画像サイズ変更

次のコードは画像のサイズを倍にしたものを表示するプログラムのものである.

#!/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
#!/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()
合成した画像(Gdk::Pixbuf)はsave関数を使用することで保存することもできる.
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である.透明化の流れは次のような手順で行う.

  1. 透明化の設定
    1. [レイヤー(L)]
    2. [透明部分(A)]
    3. [アルファチャンネルを追加(H)]
  2. 背景の切り取り
背景の切り取りには選択を使用するGIMPの選択には矩形選択,楕円選択,自由選択,ファジー選択などがある.最初の3つの選択の機能は言葉から想像できるとして,ファジー選択についてだけ紹介する.ファジー選択ではクリックした位置のピクセル近似色領域を判断して選択領域が決定する.それゆえ,単色の背景などの場合これで選択して切り取りを行えば,比較的簡単に背景を透明にできるだろう.

こちらのサイトを参考に.

参考サイト

一覧