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()