目次

1. TEO Module

ruby-teo のクラスや定数,関数的メソッドなどはすべて TEO Module に含ま れています. include TEO とするか TEO::hogehoge と Module 名を指定して使ってくださ い.

2. 定数

TEO_UNSIGNED, TEO_SIGNED, TEO_FLOAT に対応する定数として それぞれ TEO::UNSIGNED, TEO::SIGNED, TEO::FLOAT が用意されています.

3. File class

libteo の TEO_FILE 構造体に対応するクラスです.

3.1. オブジェクトの生成

#open(filename)

teoファイルをオープンする.

TeoOpenFile()に対応しています.
#create(filename,File)
#create(filename,Image)

teoファイルを新規に作る.

TeoCreateSimilarFile()に対応しています.
#create(filename,width=0,height=0,xoffset=0,yoffset=0,type=UNSIGNED,bit=8,plane=1,frame=1)
TeoCreateFile()に対応しています.
#new(...)
引数の型に応じて #open, #create を呼び出します.

3.2. オブジェクトの解放とファイルのクローズ

File class のオブジェクトが GC によって解放されるときにTeoCloseFile() を呼び出します.そのためオブジェクトに対して明示的に終了処理を行う必要 はありません.

File class で作成したファイルを別のオブジェクトで呼み込みたい場合など 明示的に終了処理を行いたい場合は #close method を呼び出してください.

また,#closed? method により終了処理を行っているかどうかを確認すること ができます.

3.3. libteo の関数と一対一に対応するメソッド

libteo の関数のうち第一引数が TEOFILE * である関数に対応して method が 定義されています. method名は対応する関数名の先頭の Teo を取り,単語の区切りの大文字を小 文字にして変りにアンダースコアで区切ります. また関数の第一引数(TEOFILE*)はmethod のレシーバになるので指定しません.

このようなmethod には以下のようなものがあります.

#read_frame
TeoReadFrame とは違い Image オブジェクトを生成して返します.
#write_frame(Image)
#width
#height
#xoffset
#yoffset
#xstart
#xend
#ystart
#yend
#pixel_type
#pixel_bit
#plane
#frame
#fsize
#current
#set_abs_frame(frame)
#set_rel_frame(frame)
#check_frame(frame)

3.4. method の別名

いくつかのmethod には ruby らしくするために別名が定義されています.

#current=(frame)
#set_abs_frame の別名
#add_current(frame)
#set_rel_frame の別名

3.5. 新しく追加した method

#xrange
#yrange
#prange
それぞれ x座標,y座標, plane の指定できる範囲を Range オブジェ
クトで返します.
#[f]

現在のフレームをセットしてから #read_frame で読み込みます.

#[f] = image

現在のフレームをセットしてから #write_frame で書き込みます.

3.6. イテレータブロックを受け付ける method

#each {|image|...}
現在のフレームから最終フレームまでの画像を image にセットし,
ブロックを呼び出します.
#each_to(last) {|image|...}
現在のフレームからlastフレームまでの画像を image にセットし,
ブロックを呼び出します.
#step(first,last,step) {|image|...}
firstフレームからlastフレームまでstepフレーム毎に画像を image 
にセットし,ブロックを呼び出します.

3.7. Enumerable から incldue される method

File class は Enumerable Module を include しているので,Enumerable で 定義されている method を使うことができます. その中で意味のある method を紹介します.

#collect {|image|...}
各フレームに対してブロックを評価し,結果を配列で返します.
#each_with_index {|image,index|...}
画像とフレーム番号をイテレータ変数としてブロックを呼び出します.
#find {|image|...}
各フレームに対してブロックを評価し,値が真になった最初の画像を返し
ます.
#find_all {|image|...}
各フレームに対してブロックを評価し,値が真であった画像全てを含む配
列を返します.
#reverse
全てのフレームを逆順に並べた配列を返します.
#to_a
全てのフレームを含む配列を返します.

4. Image class

libteo の TEOIMAGE 構造体を扱うためのクラスです. この class は仮想クラスとなっており Image class のオブジェクトが生成さ れることはありません. 実際には Image class の各ピクセル型用に特化した subclass のオブジェク トが生成されます.

各ピクセル用の subclass には以下のようなものがあります.

Image.BIT Image.UINT8 Image.SINT8 Image.UINT16 Image.SINT16 Image.UINT32 Image.SINT32 Image.FLOAT32 Image.FLOAT64

これらの subclass のインタフェイスはすべて共通であり普段 subclass を意 識することはありません.

4.1. オブジェクトの生成

#alloc(Image)
#alloc(File)

TeoAllocSimilarImage() を呼び出し,指定した Image, File と同じ サイズのオブジェクトを生成します. 生成する画像の型によって適切なサブクラスのオブジェクトを生成し ます.

#alloc(width,height,xoffset,yoffset,bit,type,plane)

TeoAllocImage()を呼び出し,指定したサイズ,型のオブジェクトを 生成します. 生成する画像の型によって適切なサブクラスのオブジェクトを生成し ます.

Image::<TYPE>.alloc(width,height,xoffset,yoffset,plane)

それぞれの subclass のオブジェクトを生成します.

#new

#alloc の別名です.

4.2. オブジェクトの解放

使わなくなった Image オブジェクトは GC によって解放されます. 明示的に解放する必要はありません.

4.3. libteo の関数と一対一に対応するメソッド

libteo の関数のうち第一引数が TEOIMAGE * である関数に対応して method が 定義されています. method名は対応する関数名の先頭の Teo を取り,単語の区切りの大文字を小 文字にして変りにアンダースコアで区切ります. また関数の第一引数(TEOFILE*)はmethod のレシーバになるので指定しません.

このようなmethod には以下のようなものがあります.

#width
#height
#xoffset
#yoffset
#xstart
#xend
#ystart
#yend
#pixel_type
#pixel_bit
#plane
#fsize
#get_pixel(x,y,p)
#put_pixel(x,y,p,val)

オブジェクトの型で画素の型を判断することができるので, Teo{Get,Put}Pixel とは異り,画素の型を指定する必要はありません.また, 二値画像に対しても #{get,put}_pixel でアクセスすることができます.

4.4. 新しく追加した method

より ruby 的な操作のために幾つかのmethod が新しく定義されています.

#xrange
#yrange
#prange

それぞれ x座標,y座標, plane の指定できる範囲を Range オブジェ クトで返します.

#[x,y]
#[x,y,p]

基本的には #get_pixel と同じですが,以下の2点が異ります.

#[x, y] = val
#[x,y,p,val] =

基本的には #put_pixel と同じですが,以下の2点が異ります.

#to_<TYPE>
#change_type(<TYPE>)

画素の型を変換した画像を返します.

4.5. イテレータブロックを受け付ける method

#each_pixel {|pixel|...}
#each_pixel!(srcimage) {|pixel,srcpixel|...}
#each_value {|pixel|...}
#each_value!(srcimage) {|pixel,srcpixel|...}

画像をラスタスキャンし各画素を pixel にセットし,ブロックを呼 び出します. また,! が付いたほうは srcimage の各画素を srcpixel にセットし てブロックを呼び出し,ブロックの値をレシーバの画素に代入します. srcimage を省略した場合は レシーバが srcimage になります.

_pixel は各ピクセル,_value は各ピクセルの各プレーンに対して処 理を行います.

#each_pixel_with_index {|pixel,x,y|...}
#each_pixel_with_index! {|pixel,x,y|...}
#each_value_with_index {|pixel,x,y,p|...}
#each_value_with_index! {|pixel,x,y,p|...}

これらのmethod はインデックスをともなってmethod を呼び出します.

4.6. その他の method

#copy(src_x,src_y,width,height,dst_x,dst_y)

レシーバの画像の (src_x, src_y) から width x height の領域をコ ピーした画像を返します. このとき,画像の左上のオフセットを dst_x,dst_y にします. すべての引数は省略できます. src_x, src_y を省略するとレシーバの左上(startx, starty)からコ ピーします. width, height を省略するとレシーバの左下までコピーします. dst_x, dst_y を省略すると src_x src_y と同じになります. すべての引数を省略するとレシーバ全体をコピーします.

#copy!(srcimage, src_x,src_y,width,height,dst_x,dst_y)

srcimage の (src_x, src_y) から width x height の領域をレシー バの (dst_x,dst_y) の位置に上書きします. この関数はレシーバのサイズや型などを変更しません. 指定領域のみを上書きし,その他の領域はそのままになります. srcimage 以外の引数は省略できます. src_x, src_y を省略すると srcimage の左上(startx, starty)から コピーします. width, height を省略するとsrcimage の左下までコピーします. dst_x, dst_y を省略すると src_x src_y と同じになります. すべての引数を省略すると srcimage 全体をコピーします.

#add(opimage)
#+(opimage)

レシーバと opimage の各画素を足した画像を返します. + は add の別名です.

#sub(opimage)
#-(opimage)

レシーバから opimage の各画素を引いた画像を返します. - は add の別名です.

#abssub(opimage)

レシーバと opimage の各画素の絶対差をとった画像を返します.

#add!(opimage)
#sub!(opimage)
#abssub!(opimage)

それぞれ #add, #sub, #abssub の結果をレシーバに破壊的に代入し ます.

※これらの #add, #sub, #abssub, #add!, #sub!, #abssub! はレシーバの画 素の型を変更しません.演算結果がおさまらない場合は何がおきるか予想でき ません.

5. libteo 互換 API

TEO Module には,libteo 互換 API として,Reference Manual of TEO library(labdoc libteo)の3章の一般向け関数群のうち TeoGetUserExtension(), TeoFreeImage(), TeoFp(), TeoExtc(), TeoExtv(), TeoData(), TeoGetBit(), TeoPutBit() を除く関数を用意しています.

libteo 互換 API の関数名は,libteo の関数の Teo のかわりに TEO:: を付け た名前になります.例えば, libteo の TeoOpenFile は TEO::OpenFile にな ります.

libteo 互換 API は,TEO::GetPixel(), TEO::PutPixel() 以外は引数,返り 値ともに同じ意味になります. TEO::GetPixel(), TEO::PutPixel() は,画素の型を自動で判断するので指定 する必要がありません.また,TeoGetBit(), TeoPutBit() を TEO::GetPixel(), TEO::PutPixel() として使うことができます.

libteo
TEO_UINT8 value;
TEOIMAGE *image;
int x,y,p;
...
value = TeoGetPixel(x,y,p,TEO_UINT8);
ruby-teo
image = TEO::AllocImage(10,10,0,0,TEO::UNSIGNED, 8, 1)
value = TEO::GetPixel(1,1,1)