obj.getpixeldata, obj.putpixeldata
関数定義
obj.getpixeldata([type]) | |
現在のオブジェクトの画像データを RGBA 形式で保持するユーザーデータを返す。 この関数の戻り値は DLL に定義された関数に渡して使用する。 |
|
type | 省略時はオブジェクトの画像データ、画像の幅、画像の高さを返す。 文字列 "work" を与えると 現在のオブジェクトと同じサイズのワークバッファを返す。 |
戻り値 | data, w, h = obj.getpixeldata() work = obj.getpixeldata("work") |
ワークバッファの内容は RGBA の全要素がゼロ。 つまり完全に透明の黒で埋められている。 |
obj.putpixeldata(data) | |
オブジェクトの画像データを data で上書きする。 画像の幅と高さは現在のオブジェクトのまま。 |
|
data | 画像データを保持するユーザーデータ |
戻り値 | なし |
スクリプト例
require("test") -- スクリプトフォルダにある test.dll をロード
local data, w, h = obj.getpixeldata()
test.func(data, w, h) -- test.dll で追加された関数
obj.putpixeldata(data)
-- test.func 関数の戻り値が data なら以下のように書けるobj.putpixeldata(test.func(data, w, h))
画像データの内容
1 ピクセル 4 バイトで構成されており、
下位バイトから B, G, R, A となっています。
画像データの最初の 4 バイトは、
画像の左上(x=0, y=0)のピクセルに対応しています。
次の 4 バイトは(x=1, y=0)のピクセルです。
幅が 100 の画像のデータで(x=0, y=1)のピクセルに対応するのは、
先頭から 400~403 バイト目になります。
C言語側のコード例
int test_func(lua_State *L)
{
// 画像データ、幅、高さを取得
DWORD *data = (DWORD*)lua_touserdata(L, 1);
DWORD w = (DWORD)lua_tonumber(L, 2);
DWORD h = (DWORD)lua_tonumber(L, 3);
lua_settop(L, 1); // スタックトップ(戻り値)の値を data にする
// 画像データを 1 ピクセルずつ処理
for(DWORD i = 0; i < w*h; i++) {
// 画像データを RGBA に分解
BYTE r = (data[i] >> 16) & 0xFF;
BYTE g = (data[i] >> 8) & 0xFF;
BYTE b = data[i] & 0xFF;
BYTE a = (data[i] >> 24) & 0xFF;
// ここで何らかの処理
// 画像データに書き込む
data[i] = (r << 16) | (g << 8) | b | (a << 24);
}
return 1; // Lua 側での戻り値の個数を返す(data だけを返すので 1)
}
- 最終更新:2013-01-29 02:33:03