サンプル / 画像描画


ここでは主に下記についての説明を行っています。

  • 関数呼び出しにおけるポインタ型引数の指定

  • 関数呼び出しにおける構造体型引数の指定


ここで例として用いる fnFIE_draw_point() 関数は、 下記のように 第 2 引数(val)として算術型 DOUBLE のポインタ(配列)を、 第 3 引数(pnt)として構造体 DPNT_T を要求します。

INT FVALGAPI fnFIE_draw_point(
    FHANDLE hImg,
    DOUBLE * val,
    DPNT_T pnt
);

この関数の使用例は下記のようになります。

C 言語
DOUBLE val[3];
DPNT_T pnt;
INT width, height;

fnFIE_img_get_params(img, NULL, NULL, NULL, &width, &height);

val[0] = 32;
val[1] = 64;
val[2] = 96;

pnt.x = width / 2;
pnt.y = height / 2;

fnFIE_draw_point(img, val, pnt);
Python
val = pyfie.DOUBLE.ARRAY(3)

val[0] = 32
val[1] = 64
val[2] = 96

pnt = pyfie.DPNT_T()
pnt.x = img.width / 2
pnt.y = img.height / 2

pyfie.fnFIE_draw_point(img, val, pnt)
  • 変数 img はチャネル数 3 で確保済の画像オブジェクト(FHANDLE) であるものとします


この例では、 ポインタ型引数に対して "PyFIE 配列" のインスタンスを、 構造体型引数に対して "PyFIE 構造体" のインスタンスをそれぞれ作成して指定を行っています。

これに対して PyFIE では ポインタ型引数 や 構造体型引数 に対し、 Python 組み込みのリスト型(list)や タプル型(tuple)を渡すことが可能であり、 これらを使用することで関数呼び出しの記述が簡素化されます。

ポインタ型引数にリスト型やタプル型を渡す場合は、 内部で一時的な C 互換メモリブロックが確保され要素の値が設定された後、 関数に渡されることになります。 そのためポインタ型引数を介して関数から値を受け取るような場合にはリスト型やタプル型を使用することはできませんが(使用しても関数から値を受け取ることができません)、 関数に値を渡すのみ(つまり入力引数)の場合には使用することが可能です。

構造体型引数にリスト型やタプル型を渡す場合は、 要素の値が構造体のメンバに対する値の並びとなるように指定を行います。

これらを利用すると 上記 PyFIE のサンプルコードは、 下記のように 1 行で書くことができます。

Python
pyfie.fnFIE_draw_point(img, (32, 64, 96), (img.width/2, img.height/2))

また構造体型引数の指定には Python 組み込みのマッピング型(dict) を使用することもできます。 この場合、 構造体のメンバ名をマッピング型のキーとして指定することになるため 明示的な記述となります。

下記は構造体型引数に対してマッピング型を用いて指定を行う例です。 また、 ポインタ型引数に対してはリスト内包表記を使用して指定を行っています。

C 言語
DOUBLE * val;
DPNT_T pnt;
INT ch, width, height, i;

fnFIE_img_get_params(img, &ch, NULL, NULL, &width, &height);

val = (DOUBLE *)fnOAL_malloc(sizeof(DOUBLE) * ch);

for( i = 0; i < ch; i ++ ){
    val[i] = 32 * (i + i);
}

pnt.x = width / 2;
pnt.y = height / 2;

fnFIE_draw_point(img, val, pnt);

fnOAL_free(val);
Python
pyfie.fnFIE_draw_point(
    img,
    [ 32 * (i + 1) for i in range(img.ch) ],
    { "x":img.width/2, "y":img.height/2 })
  • 変数 img は確保済の画像オブジェクト(FHANDLE) であるものとします


ここでは PyFIE 関数を呼び出す際に、 "ポインタ型" 及び "構造体型" 引数に対して オブジェクトを指定するいくつかの方法を紹介しました。

ここで紹介した 2 つの型も含め、 この他にも PyFIE 関数の引数には様々なオブジェクトを指定することが可能です。 詳細は PyFIE 関数の引数変換規則 を参照ください。