2017/02/11 (土)
PCカメラキャプチャー Ver.2 だよ!
フルスクリーンのモードについては、レターボックスも、縦横比固定で拡大するのも、特に問題も無くカンタンに実装出来ました。
とゆうわけで、スペースキーでフルスクリーン表示とウィンドウ表示をトグルするようにした他、右クリックメニューを付けて、モードの変更ができるようにしました。
このくらいできたら、単に画面にカメラの映像を出して、「おぉ!♪」とか言ってるくらいの、ワタシなんかの実用には十分なんじゃないですかね?
旧版のなでしこでは、枠なしのフルスクリーンも問題なく動くようなので、これで実行ファイル化しておこうっと。
超珍しく、実用の物を作った気がする(爆)
いや~、おかげさまでカメラでは、ずいぶん遊んで、まただいぶ賢くなったね☆
#----------------------------------------------------------------------- # なでしこでノート内蔵カメラをキャプチャ ver.2.00 #----------------------------------------------------------------------- #☆ver.1.00 #・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー) #・Enterキーでキャプチャ画像を保存(勝手にデスクトップに今の日時でファイル作ります) #----------------------------------------------------------------------- #☆ver.2.00 #・[F5]キーでキャプチャ動画を保存([Esc]キーか、マウスボタンを押すことで保存終了) #・[Space]キーで、フルスクリーン表示とウィンドウ表示切り替え。 #・右クリックメニューを追加。各機能の他、フルスクリーンモードが変えられます。 #----------------------------------------------------------------------- !母艦設計=「母艦の可視はオフ」 #-----宣言-------------------------------------------------- 枠無フルスクリーンとは整数=オフ #古いなでしこならオンで動きます(1.5332で確認) CW幅とは整数=640。CW高さとは整数=480。 CWハンドルとは整数=-1 #キャプチャーウィンドウのハンドル。 !WS_VISIBLEとは整数=$10000000 #(初期状態) !WS_CHILDとは整数=$40000000 #(子ウィンドウ) CWスタイルとは整数=WS_VISIBLE||WS_CHILD #キャプチャーウィンドウのスタイル カメラ接続状態とは整数=オフ。 フレームレートとは整数=60 #ミリ秒単位 フルスクリーン表示フラグとは整数=オフ。 フルスクリーンモードとは整数=1 #(0=デスクトップに合わせて引き延ばす、1=レターボックス、2=縦横比固定でズーム) #---GUI----- 処理用とはイメージ。その可視はオフ。 #----------------------------------------------------------- #-----母艦設計---------------------------------------------- #---ポップアップメニュー---- 右クリックメニューとはポップアップメニュー 右クリックメニューに『#親部品名,部品名,テキスト,ショートカット,オプション,イベント -,フルスクリーンメニュー,フルスクリーンモード,,, --,フルスクリーン0,ノーマル,,,0にフルスクリーンモード変更 --,フルスクリーン1,レターボックス(縦横比固定),,チェック,1にフルスクリーンモード変更 --,フルスクリーン2,ズーム(縦横比固定),,,2にフルスクリーンモード変更 -,ウィンドウメニュー,ウィンドウ表示,,,ウィンドウ表示 -,-,,,, -,静止画保存メニュー,スクリーンショット保存,,,静止画保存。 -,-,,,, -,動画保存メニュー,キャプチャ動画保存,,,動画保存。 -,動画保存コメント, (終了は[Esc]かマウスクリック),,, -,-,,,, -,ヘルプメニュー,操作説明,,,操作説明。 -,バージョンメニュー,バージョン情報,,,バージョン。 -,-,,,, -,メニュー閉,メニューを閉じる,,, -,-,,,, -,終了メニュー,終了,,,終了処理。 』をポップアップメニュー一括作成 *フルスクリーンモード変更(Aに) もし、A=1ならば、 フルスクリーンモード=1。 フルスクリーン0のチェックはオフ。フルスクリーン1のチェックはオン。フルスクリーン2のチェックはオフ。 違えば、もし、A=2ならば、 フルスクリーンモード=2。 フルスクリーン0のチェックはオフ。フルスクリーン1のチェックはオフ。フルスクリーン2のチェックはオン。 違えば、 フルスクリーンモード=0。 フルスクリーン0のチェックはオン。フルスクリーン1のチェックはオフ。フルスクリーン2のチェックはオフ。 フルスクリーン表示フラグ=オフ。 フルスクリーン表示。 *ウィンドウ表示 フルスクリーン表示フラグ=オン。 フルスクリーン表示。 #---母艦----- 母艦について スタイルは「枠固定」 オフに最大化ボタン有効変更。 オフに最小化ボタン有効変更。 タイトルは「PCカメラキャプチャー」 クライアント幅はCW幅。 クライアント高さはCW高さ。 ポップアップメニューは右クリックメニュー。 閉じた時は~ 終了処理。 キー押した時は~ もし、押された仮想キー=13ならば、静止画保存。 # Enter 違えば、もし、押された仮想キー=116ならば、動画保存。 # F5 違えば、もし、押された仮想キー=32ならば、フルスクリーン表示。 # Space 違えば、もし、押された仮想キー=112ならば、操作説明。 # F1 違えば、もし、押された仮想キー=113ならば、バージョン。 # F2 母艦を黒色で画面クリア。 母艦を中央移動。 #----------------------------------------------------------- #-----メイン------------------------------------------------ 母艦の可視はオン カメラ起動 #----------------------------------------------------------- *カメラ起動 キャプチャーウィンドウ作成("",CWスタイル,0,0,CW幅,CW高さ,母艦のハンドル,0) CWハンドルはそれ。1秒待つ。 5回 CWハンドルにカメラ接続。 1秒待つ。 もし、それがはいならば、カメラ接続状態はオン。抜ける。 もし、カメラ接続状態がオフならば、 CWハンドルをウィンドウ破棄。 「カメラに接続出来ませんでした」と言う。 終わる。 CWハンドルをフレームレートにプレビューレート設定。 CWハンドルをオンにプレビューモード設定。 *静止画保存 ファイル名は「{今日} {今}」を「yyyymmdd_hhnnss」に日時形式変換。 ファイル名は「{デスクトップ}{ファイル名}.png」 CWハンドルを処理用へ窓内側キャプチャ。 処理用をファイル名へ画像保存。 *動画保存 ファイル名は「{今日} {今}」を「yyyymmdd_hhnnss」に日時形式変換。 ファイル名は「{デスクトップ}{ファイル名}.avi」 CWハンドルをファイル名にキャプチャファイル設定。 CWハンドルをキャプチャ開始。 *フルスクリーン表示 もし、フルスクリーン表示フラグ=オフならば、 フルスクリーン表示フラグ=オン 母艦のクライアント幅はデスクトップW。母艦のクライアント高さはデスクトップH。 もし、枠無フルスクリーン=オンならば、 母艦のスタイルは「枠なし」 母艦の位置は「0,0」 違えば、 母艦を中央移動。 もし、フルスクリーンモード=1ならば、 CWハンドルに(母艦のクライアント幅-(母艦のクライアント高さ*CW幅/CW高さ))/2,0,(母艦のクライアント高さ*CW幅/CW高さ),母艦のクライアント高さを窓ハンドル位置サイズ設定。 違えば、もし、フルスクリーンモード=2ならば、 CWハンドルに0,(母艦のクライアント高さ-(母艦のクライアント幅*CW高さ/CW幅))/2,母艦のクライアント幅,(母艦のクライアント幅*CW高さ/CW幅)を窓ハンドル位置サイズ設定。 違えば、 CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。 母艦を最前面 違えば、 フルスクリーン表示フラグ=オフ 母艦のスタイルは「枠固定」 母艦のクライアント幅はCW幅。母艦のクライアント高さはCW高さ。 母艦を中央移動。 CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。 処理用を母艦のクライアント幅,母艦のクライアント高さで画像リサイズ。 CWハンドルをフルスクリーン表示フラグにスケーリングフラグ設定。 *終了処理 CWハンドルからカメラ切断。 CWハンドルをウィンドウ破棄。 終わる。 #----------------------------------------------------------- *操作説明 ダイアログタイトルは「操作説明」 「◆[Enter]キーでキャプチャ画面のスナップショットを保存。 ◆[F5]キーでキャプチャ動画を保存。 [Esc]キーか、マウスボタンを押すことで保存終了となります。 ※終了させない限り、録画し続けます。 ◆[Space]キーで、フルスクリーン表示。 フルスクリーン表示時に[Space]キーで、ウィンドウ表示に戻る。 ◎フルスクリーンモードは、右クリックメニューで変更できます。 ・ノーマル(デスクトップに合わせて映像を引き延ばします) ・レターボックス(縦横比固定。左右に黒枠が入ります) ・ズーム(縦横比固定。上下を切ってデスクトップ一杯に表示) ※設定ファイルは作ってないので、毎回初期値に戻ります。」と言う #------------------------------------------------------------ *バージョン ダイアログタイトルは「バージョン情報」 「{二重カッコ}PCカメラキャプチャー{二重カッコ閉じ}{改行} Version 2.00{改行}{改行} by 雪乃☆雫」と言う。 #----------------------------------------------------------- #-----ビデオキャプチャー------------------------------------ #https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx #---VFW定数----- !WM_CAP_DRIVER_CONNECTとは整数=$400+10 # キャプチャウィンドウをキャプチャドライバに接続します。 !WM_CAP_DRIVER_DISCONNECTとは整数=$400+11 # キャプチャウィンドウからキャプチャドライバを切断します。 !WM_CAP_SET_PREVIEWとは整数=$400+50 # プレビューモード(オン/オフ) !WM_CAP_SET_PREVIEWRATEとは整数=$400+52 # プレビューモードのフレーム表示レート(ミリ秒) !WM_CAP_SET_SCALEとは整数=$400+53 # 画像をキャプチャーウィンドウに合わせて拡縮(オン/オフ) !WM_CAP_SEQUENCEとは整数=$400+62 # ストリーミングビデオおよびオーディオキャプチャをファイルに開始します。 !WM_CAP_FILE_SET_CAPTURE_FILEとは整数=$400+20 # ビデオキャプチャに使用されるファイルの名前を指定します。 #----------------------------------------------------------- ●カメラ接続(ハンドルに{数値=0}Noの) メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0) # カメラが1台ならNoは0で省略可。 ●カメラ切断(ハンドルから) メッセージ送信(ハンドル,WM_CAP_DRIVER_DISCONNECT,0,0) ●プレビューレート設定(ハンドルをmsに) メッセージ送信(ハンドル,WM_CAP_SET_PREVIEWRATE,ms,0) # ms=ミリ秒単位 ●プレビューモード設定(ハンドルをfに) メッセージ送信(ハンドル,WM_CAP_SET_PREVIEW,f,0) # f=オン/オフ ●キャプチャ開始(ハンドルを) メッセージ送信(ハンドル,WM_CAP_SEQUENCE,0,0) ●キャプチャファイル設定(ハンドルをaviファイル名に) メッセージ送信(ハンドル,WM_CAP_FILE_SET_CAPTURE_FILE,0,aviファイル名) ●スケーリングフラグ設定(ハンドルをfに) メッセージ送信(ハンドル,WM_CAP_SET_SCALE,f,0) # f=オン/オフ #----------------------------------------------------------- #-----API--------------------------------------------------- #https://msdn.microsoft.com/ja-jp/library/cc428606.aspx ●キャプチャーウィンドウ作成(lpszWindowName,dwStyle,x,y,nWidth,nHeight,hWnd,nID) =DLL("avicap32.dll", "HWND capCreateCaptureWindowA( LPCSTR lpszWindowName, // ウィンドウ名 DWORD dwStyle, // ウィンドウスタイル int x, // X int y, // Y int nWidth, // W int nHeight, // H HWND hWnd, // 親ウィンドウのハンドル int nID // ウィンドウ識別子…ってなんすか; )") #----------------------------------------------------------- #https://msdn.microsoft.com/ja-jp/library/cc411022.aspx ●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll", "LRESULT SendMessageA( HWND hWnd, // 送信先ウィンドウのハンドル UINT Msg, // メッセージ SHORT wParam, // メッセージの最初のパラメータ LPCSTR lParam // メッセージの 2 番目のパラメータ )") #----------------------------------------------------------- #https://msdn.microsoft.com/ja-jp/library/cc410763.aspx ●ウィンドウ破棄(hWndを) =DLL("user32.dll", "BOOL DestroyWindow( HWND hWnd // 破棄するウィンドウのハンドル )") #----------------------------------------------------------- #https://msdn.microsoft.com/ja-jp/library/cc411206.aspx ●SetWindowPos(hWnd,hWndInsertAfter,X,Y,cx,cy,uFlags) =DLL("user32.dll", "BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル HWND hWndInsertAfter, // 配置順序のハンドル…? int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uFlags // ウィンドウ位置のオプション )") ●窓ハンドル位置サイズ設定(ハンドルにX,Y,W,Hを) SetWindowPos(ハンドル,0,X,Y,W,H,0) #-----------------------------------------------------------
トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170211
開いてびっくり!謎のコードがびっしりw
さすがです・・・!
自分で組んだコードでも、後から見返した時に何を書いているのかさっぱりなのに、人様が書いたコードとなるともうさっぱりですねw
ですが、なんとなく理解は...しているつもりですw
ところで、検出プログラムなんですが、なんとなくはできた・・・?のですが、その方法以外が思い浮かばないので、なんとも言えない状態です・・・w
さて、どうしませうか・・・
VFW関係のメッセージ送信を、全部関数にして書き換えましたw
もちろんナゾの呪文は使わず、例の数値を直接指定しても動くんだけど、まさにその、時間が経ってから見返したりするコトを考えると、この呪文で検索するとMSDNとかにたどり着けるので、結局のところ可視性が上がるのかなあと思い、基本英語は見てるだけでダメな人なんですが、使っとくことにしました;;;
顔検出なんて、その方法もどの方法も、考えたこともないもねー。すごいなあと感心するばかりですよ~。
是非頑張ってくださいぃ~☆