AKAGI君の記事に触発されて。
画面キャプチャを取得するのには普通のPrintScreenを使ってペイントに貼り付けたりしていましたが、黙々と同じ作業をするのは大変なので
RPAのように一連の動作を自動化したいと思っていました。
旧VRMスクリプトでは「
ScreenShot」という関数があったのでスクリプトである程度自動化出来ましたが、VRMNXではグラフィック系が一新されたため、同命令が無くなってしまいました。
スクリプトもPythonになったので「
Pil」等のPythonでスクリーンキャプチャをするライブラリなども試そうとしましたが、例によってモジュール取り込み等が必要っぽく、デフォルトだと動かないのでもっと手軽な方法ないかなーと思っていたところ、既存のスクリーンショットツールをPythonで呼んでやればいいじゃん、と思いました。
で、作ったコードがこちらです。
#LAYOUT
import vrmapi
import subprocess
def vrmevent(obj,ev,param):
if ev == 'init':
# キー入力イベント登録
obj.SetEventKeyDown('D')
obj.SetEventKeyDown('R')
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'keydown':
if param['keycode'] == 'D':
# デスクトップをpngで保存
subprocess.Popen(r'C:\Tool\ws153a\WinShot.exe -B -D -X')
elif param['keycode'] == 'R':
# 短形のjpgで保存
subprocess.Popen(r'C:\Tool\ws153a\WinShot.exe -J -R -X')
今回はスクリーンキャプチャ定番ソフト「
Winshot」をコマンド引数を使って2通りの呼び出し方を実験しました。
パスは「Winshot」のフルパスを定義してください。
「Winshot」側の設定として、png保存する場合は事前に環境設定でbmpの拡張子をpngに変更してください。
「短形保存」は予め指定したデスクトップ座標をトリミングして保存してくれるため定点撮影に重宝します。
実行してみた上での注意事項としては2点。
1つは「キーを押した瞬間に撮影できるわけではない」という点。
これはVRMNXのPythonがWinshotを呼ぶ時に通常のアプリ実行プロセスを行っているためで、プログラム起動の分だけタイムラグが発生するためです。
自分の環境では大体0.5秒ぐらいの時間差がありました。
したがって、今のところ「センサーを踏んだ瞬間に撮影」みたいなことは出来ません。(無理矢理実現するならセンサーを踏んだ時に列車を止めて撮影後に元の速度に動かす「ザ・ワールド」的な実装ならワンチャンあるかも・・・(笑))
もう1つはWinshotの実行手順が「PythonからWinshotを起動」→「Winshotで撮影後にアプリを終了」となるため、Winshot終了前に次を撮影しようとすると多重起動エラーが出る点。
カメラ並みの高速連写は不可能で、大体2,3秒ぐらい間隔を空ける必要があります。
プロセス呼び出しの原理上これを縮めることは難しく、常時起動状態でコマンド入力に対応したアプリを見つけるしかなさそうです。
自分がやりたかったことはこれで出来そうなので、ひとまずは撮影を楽しみたいと思います。
他にも外部プログラムを呼び出す方式は色んな応用ができそうです。