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

このWIKIを編集するにはパスワード入力が必要です

認証パスワード