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()
処理結果例¶
入力画像
スクリーンショット