スクリーンショット自動化ツール「BindScreen」を作りました
スクリーンショット自動化ツール「BindScreen」
スクリーンショットを自動でとって加工する「BindScreen」を作りました。 ツールとソースコードはGitHubからダウンロードすることができます。
BindScreen - Github drilldripper/BindScreen
使用例
次のスライドをこのツールで画像化してみたいと思います。*1
C++の歴史 江添亮 (このスライドはGFDL1.3で配布されています)
今回の設定は以下のようにしてみました。
キャプチャ間隔はスクリーンキャプチャを行う間隔です。またキー入力もこの間隔で行われます。
初期化時間はプログラムが実行が始まるまでの時間です。設定した時間の間にキャプチャする画面を前面に表示しておきます。今回はブラウザの要素をキャプチャしますが、多くのブラウザではF11を押すと全画面表示になるので活用するといいと思います。
今回は画像のトリミングを行わずに圧縮を行いたいので、「画像のトリミングを行う」のチェックを外し、「圧縮フォルダを出力する」にチェックを入れます。見開き方向の選択はトリミングを行わない場合はどちらを選んでも出力結果に影響はありません。またこのスライドは右キーで次ページに移動するので、"右キー"を選択して出力先フォルダを設定します。
設定が完了したら実行をクリックしましょう。スライドが終了すると自動的にスクリーンショットの撮影が止まります。
指定したフォルダを確認すると「spread_image」と「spread_complete.zip」が作成されています。試しにspread_imageを開くと以下のような画像が生成されています。
うまくいきました。
他にもソフトの表示結果のログを画像として記録する用途などで使えると思います。
技術的な話
画像処理
このツールはPythonを使って開発を行いました。画面のキャプチャにはPythonの標準的なツールであるPIL(Python Imaging Library)のforkであるPillowを使っています。PILは開発が停滞していてPython2.7までしか対応していませんが、Pillowは開発が継続的に行われていてPython3以降に対応しています。 また画像の分割や余白の除去もPillowで行っています。
画面キャプチャは変化が無くなった時点で自動的に終了しますが、これは前後の画像のMD5を計算してメッセージダイジェストが同じであれば終了する仕組みになっています。この方法では数ピクセルでも画像が異なっていれば違う画像として判定されます。もし画像の僅かな違いを許容したいのであれば、画像のヒストグラムを比較して閾値で判定を行う方法をとると良いかもしれません。
キーボード入力
キーボード入力はwin32APIであるSendKeysを使ってキーストロークを送信しています。GUIでは上下左右の方向キーのみ対応していますが、CUIでAPIを引数に与えれば任意の入力を行うことが出来ます。
このツールがWindows専用ツールになったのはSendKeysAPIを使用しているからです。 xautomationなどを使えばLinuxやMacに対応することができますが、依存ライブラリが増えてしまうので今回は使用しませんでした。
GUI
GUIの作成にはPyQt4を使いました。今回初めて使いましたが、さくっとGUIが出来てとても便利でした。PyQtはモジュールが疎結合に作られているので、ボトムアップ的で面白かったです。
このツールはもともとCUIとして作成したので、GUIは引数とオプションを決めてスクリプトに渡す設計にしています。このような作り方にするとCUIが独立して使えるので、バッチ処理ができるのでいい感じですね。
*1:テキストのスライドを画像にしたら逆に使いにくいと思いますが、一例ということで…