sample\iron\sample_camera_mf.hsp » Plain Format
;============================================================
; iron_camera_mf サンプル: pure Media Foundation Webcam Preview
;
; hspmfcam.dll (C++) → MF SourceReader → child window thread の
; 経路で Webcam をリアルタイム表示。OpenCV 不要、依存は hspmfcam.dll のみ。
;
; 特徴:
; - 内部 worker thread でフレーム取得 → child window に StretchDIBits
; - HSP main thread が止まっても (title bar drag 等) 止まらない
; - アスペクト比固定 ([A] キーで切り替え)
;
; 操作:
; [A] アスペクト比モード切替 (stretch / letterbox)
; [S] スナップショット保存 (snapshot.png)
; [J] JPEG で保存 (snapshot.jpg)
; [ESC] 終了
;============================================================
#include "hsp3_net_64.as"
#include "iron_camera_mf.hsp"
title "iron_camera_mf — Pure MF Webcam Preview"
; カメラ列挙
n_cams = iron_cam_count()
if n_cams = 0 {
dialog "Webcam が接続されていません。", 1
end
}
; 1 台目のカメラ名
iron_cam_name 0, cam_name
mes ""
; カメラ画面領域
prev_x = 0
prev_y = 0
prev_w = 800
prev_h = 540
screen 0, prev_w, prev_h + 100
font "MS Gothic", 14
title strf("iron_camera_mf — %d cam(s) / using #0: %s", n_cams, cam_name)
; カメラ起動
hcam = iron_cam_open(0, prev_x, prev_y, prev_w, prev_h)
if hcam < 0 {
dialog "カメラ 0 を開けませんでした。", 1
end
}
iron_cam_size hcam, cw, ch
iron_cam_set_aspect hcam, 1 ; letterbox
aspect_mode = 1
snap_msg_until = 0
*main_loop
stick k, $80 | $f
if k & $80 : goto *do_exit ; ESC
getkey k_a, 'A'
if k_a {
aspect_mode ^= 1
iron_cam_set_aspect hcam, aspect_mode
repeat 5 : await 30 : loop
}
getkey k_s, 'S'
if k_s {
iron_cam_save hcam, "snapshot.png"
snap_msg_until = gettime(7) + gettime(6) * 1000 + 1500
repeat 5 : await 30 : loop
}
getkey k_j, 'J'
if k_j {
iron_cam_save hcam, "snapshot.jpg"
snap_msg_until = gettime(7) + gettime(6) * 1000 + 1500
repeat 5 : await 30 : loop
}
; HSP 側 UI 描画 (child window はバックグラウンドで自動更新)
redraw 0
color 32, 32, 32 : boxf 0, prev_h, prev_w, prev_h + 100 : color 0, 0, 0
color 255, 255, 255
pos 10, prev_h + 8
if aspect_mode = 0 {
mode_label = "stretch"
} else {
mode_label = "letterbox"
}
mes strf("解像度: %d x %d モード: %s 状態 code: %d", cw, ch, mode_label, iron_cam_state(hcam))
pos 10, prev_h + 28
mes "[A] アスペクト比切替 [S] PNG保存 [J] JPG保存 [ESC] 終了"
pos 10, prev_h + 48
mes "(プレビューは独立 worker thread。ウィンドウのタイトルバーを掴んでも映像は止まりません)"
now_ms = gettime(7) + gettime(6) * 1000
if snap_msg_until > now_ms {
color 255, 255, 0
pos prev_w - 240, prev_h + 8
mes "snapshot 保存しました"
}
color 0, 0, 0
redraw 1
await 30
goto *main_loop
*do_exit
iron_cam_close hcam
end