WIL との連携 -- AScope(濃度波形)の表示

WIL (FVIL) と連携し、 PyFIE で読み込んだ画像に AScope (濃度波形)やグリッドをオーバーレイ表示するサンプルコードです。

本サンプルコードは WIL 3.1.0.x 64 bit がインストールされた Windows 環境のみで動作します。

本サンプルの実行には予め pythonnet をインストールしておく必要があります。 pip コマンドを使用する場合、次のようにインストールしてください。

pip install pythonnet==2.5.1

コード

import os
import sys

import clr
import pyfie

# WIL 3.1.0 のパスを追加
sys.path.append(os.path.expandvars("%WIL3_1_0X64%"))

# 必要なアセンブリを読み込む
clr.AddReference("System.Windows.Forms")
clr.AddReference("FVILforms")

# .NET の名前空間を Python パッケージとしてインポート
import fvalgcli
import FVIL
import System

def convert_image_from_pyfie_to_fvil(himg_pyfie):
    """PyFIE の画像オブジェクトを FVIL の CFviImage に変換する."""

    # PyFIEとFVILが使用する FIE の DLL が異なる場合に生じうる不都合を避けるため、
    # 一旦 fvalgcli の fnFIE_img_root_import_alloc() を経由する
    ch = himg_pyfie.ch
    adrs = System.Array.CreateInstance(System.IntPtr, himg_pyfie.ch)
    for ich in range(himg_pyfie.ch):
        if pyfie.F_IMG_BIN == himg_pyfie.f_type:
            binadrs = pyfie.UINT.PTR()
            bitpos = pyfie.INT()
            pyfie.fnFIE_img_get_ch_binadrs(himg_pyfie, ich, binadrs, bitpos)
            adrs[ich] = System.IntPtr.op_Explicit(binadrs.value)
        else:
            p = pyfie.fnFIE_img_get_ch_adrs(himg_pyfie, ich)
            adrs[ich] = System.IntPtr.op_Explicit(p.value)

    step = fvalgcli.SIZE_T(himg_pyfie.step)
    img_fvalgcli = fvalgcli.api.fnFIE_img_root_import_alloc(
        adrs, ch, himg_pyfie.f_type, step, himg_pyfie.width, himg_pyfie.height)
    if img_fvalgcli == fvalgcli.FHANDLE.Zero:
        raise FVIL.CFviException(
            FVIL.ErrorCode.FAILED_TO_ALLOCATE,
            "fvalgcli.api.fnFIE_img_root_import_alloc failed")

    # fvalgcli の画像を FVIL の画像に変換
    img_fvil_attached = FVIL.Data.CFviImage(img_fvalgcli, True)
    img_fvil = img_fvil_attached.Clone()

    # メモリの解放
    img_fvalgcli.Dispose()
    img_fvil_attached.Dispose()

    return img_fvil


def show_image_view(img_fvil):
    """FVIL の画像を表示するフォームを表示する。

    右クリックメニューから Ascope 表示とグリッド表示のオンオフができる。"""

    # 画像ビューの設定
    view = FVIL.Forms.CFviImageView()
    view.Dock = System.Windows.Forms.DockStyle.Fill
    view.EnableMouseGrip = True
    view.Image = img_fvil

    # 右クリックメニュー用のハンドラ
    def toggle_ascope(sender, args):
        new_state = not view.Display.OverlayAscope.Enable
        view.Display.OverlayAscope.Enable = new_state
        view.Display.OverlayAscope.Active = new_state
        view.Refresh()

    def toggle_grid(sender, args):
        new_state = not view.Display.OverlayGrid.Enable
        view.Display.OverlayGrid.Enable = new_state
        view.Refresh()

    # 右クリックメニューの設定
    context_menu = System.Windows.Forms.ContextMenu()
    menu_ascope = System.Windows.Forms.MenuItem("Toggle Ascope")
    menu_ascope.Click += toggle_ascope
    context_menu.MenuItems.Add(menu_ascope)
    menu_grid = System.Windows.Forms.MenuItem("Toggle Grid")
    menu_grid.Click += toggle_grid
    context_menu.MenuItems.Add(menu_grid)

    # フォームの設定
    form = System.Windows.Forms.Form()
    form.Controls.Add(view)
    form.ContextMenu = context_menu
    # 表示サイズを大きめに
    form.Width *= 2
    form.Height *= 2

    form.Activate()
    view.FitImageSize()
    form.Text = "Image view"

    # フォームを表示
    form.ShowDialog()


if __name__ == "__main__":
    # FVIL ライブラリの初期化
    FVIL._SetUp.InitVisionLibrary()

    # 表示したい画像をファイルから読み込み
    himg = pyfie.imread("floppy1.png")

    # PyFIE 画像を FVIL 画像に変換
    img_fvil = convert_image_from_pyfie_to_fvil(himg)

    # 画像ビューを表示
    show_image_view(img_fvil)

    # メモリの解放
    img_fvil.Dispose()

処理結果例

入力画像

../../_images/floppy1.png

スクリーンショット

../../_images/fvil_screenshot.png

ダウンロード