GSL Shell 学習:“IM.lua”モジュール自作

2016-03-27 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
7、2、0、0、1、 0、0、0、0、0(40)で、換算ポイント 88pt 。
「化学業界」「硝子業界」「FM COCOLO」「e-radio」、
「グルコサミン」「Python」「Firefox」bg値変動のみ。
「Perl」「C言語」「FM青森」全く変化無し。
・-・ - -・

さて、本文。

前(2016-03-26)の記事:「GSL Shell 学習:“cv2.lua”モジュール自作
に続いて、
IM ( An Imaging Toolkit )
本体の“im.dll”を包含したモジュールを作った。


今回は、“OpenCV”の場合とは異なり、

・関数名が些か長いので、<紙>流で短くした。
・引数の“char*”は、Lua の文字列で指定できるようにした。
・同様に“void*”等は、関数の戻り値の数を増やして対応した。

例えば、

  void* imFileOpen( const char* fname, void* error );

だと、

  local im = require'IM'
  local IN, err = im.imOpen( 'hoge.png' )

で使える。



と云うことで、作ったのは:
local IM = { }
local im = ffi.load( 'im' )

charA = |s| ffi.cast( 'char*', s )
voidA = |p| ffi.cast( 'void*', p )

ffi.cdef[[
void* imFileNew( const char* fname, const char* format, int* error );
void* imFileOpen( const char* fname, int* error );
void imFileClose( void* fp );
int imFileWriteImageInfo( void* fp, int xx, int yy, int mode, int type );
int imFileWriteImageData( void* fp, void* data );
int imFileReadImageInfo( void* fp, int i, int* xx, int* yy, int* mode, int* type);
int imFileReadImageData( void* fp, void* data, int z1, int z2 );
]]

function IM.imNew( Fname, fmt ) ----- 出力モードオープン
local error = ffi.new( 'int32_t[1]' )
local OT = im.imFileNew( charA(Fname), charA(fmt), error )
return OT, error[0]
end

function IM.imOpen( Fname ) ----- 入力モードオープン
local error = ffi.new( 'int32_t[1]' )
local IN = im.imFileOpen( charA(Fname), error )
return IN, error[0]
end

function IM.imClose( fp ) im.imFileClose( voidA(fp) ) end

function IM.imWriteInfo( OT, xx, yy, mode, type )
local Err = im.imFileWriteImageInfo( voidA(OT), xx, yy, mode, type )
return Err
end

function IM.imWriteData( OT, data )
local Err = im.imFileWriteImageData( voidA(OT), voidA(data) )
return Err
end

function IM.imReadInfo( IN )
local xx = ffi.new( 'int32_t[1]' )
local yy = ffi.new( 'int32_t[1]' )
local color_mode = ffi.new( 'int32_t[1]' )
local data_type = ffi.new( 'int32_t[1]' )
local Err = im.imFileReadImageInfo( voidA(IN), 0, xx, yy, color_mode, data_type )
return xx[0], yy[0], color_mode[0], data_type[0], Err
end

function IM.imReadData( IN, buf, z1, z2 )
local Err = im.imFileReadImageData( voidA(IN), voidA(buf), z1, z2 )
return Err
end

return IM
こんな感じです。



このモジュールの使用例は、
local im = require'IM'
local Fname = 'hogehoge.tif' -- GrayScale 画像
local IN, err = im.imOpen( Fname ) -- 入力モード オープン
local xx, yy, mode, type, err = im.imReadInfo( IN ) -- 画像情報 取得
print( xx, yy, mode, type, err ) -- 確認

local data = ffi.new( 'uint8_t[?]', xx*yy ) -- 読み込みバッファ確保

local err = im.imReadData( IN, data, 0, -1 ) -- 画像データ取得
print( data[0], data[xx-1], data[xx*yy-1] ) -- 確認
im.imClose( IN )
こんな感じでしょうか?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


160226
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク