GoogleAnalytics

SyntaxHighlighter

2010年11月15日月曜日

LabVIEWでスクリーンキャプチャを撮ってみた

先日、同僚から
「Windows環境で、アクティブウィンドウ以外の任意領域のヒストグラムを取るアプリってある?」
と聞かれました。

「探せばあるんじゃないの?」
「さんざん探したけど、どういうワードで検索すればイイかもわかんなかった」

用途を聞いてみると、PCにCCDカメラを接続してて、
ライブビューはカメラ付属のソフトウェアで出来るんだけど、
そのソフトにライブヒストグラム機能が付いてない、ということらしい。

そのPCには、CCDカメラで撮影した画像ファイルの解析のために、
LabVIEWがインストールされているので、
「LabVIEWから直接CCDカメラをコントロールして、
ライブビュー撮ればイイんじゃね?」

とは言ったものの、なんかしっくりきません。

LabVIEWからスクリーンキャプチャを取得して、それを2Dピクチャに出来れば、
あとはどうにでも解析できるはずです。

というわけでテストしてみました。

さらっと調べた限りでは、LabVIEW自体にスクリーンキャプチャを撮る機能はないみたいです。

外部アプリにキャプチャさせた画像をクリップボードに貼りつけて、
それをLabVIEWから取得しようかと思いましたが、クリップボードの
画像ファイルをLabVIEWで取得するのも一筋縄ではいかなさそうです。
G Toolboxを使えば出来るんですが、スマートじゃないですねw)

仕方ないので、LabVIEWから .NET Framework を呼んでやってみました。

.NET Framework には 「System.Drawing.Graphics.CopyFromScreen()」という
欲しい機能そのものなメソッドがありますので、これを使うことにします。

とりあえず、以下のようなVIを作ってみました(ダウンロード)。

(VIスニペットにしようと思ったんですが、.NETコンテナのリファレンスが外れるのでヤメました)

上の部分は、プライマリモニタの画素サイズを取得して、フルスクリーンサイズのBitmapを作成し、
その表示用PictureBoxのサイズ設定を行っています。

下の左側で、そのBitmapからGraphicsを作成し、CopyFromScreenメソッドで
Bitmapにスクリーンキャプチャして、PictureBoxに貼りつけています。

右下の部分で、PictureBoxのインボークメソッドで画像データを取得し、
ピクスマップに変換して2Dピクチャに表示しています。

whileループで廻しているので、リアルタイムにキャプチャし表示し続けます。


一応、サブVI化したものも作りました(ScreenCapture.vi)。

機能的グローバル関数として作成してあり、
最初に「Mode = Init」で呼び出して、プライマリモニタ画素数のBitmapを作成して保持し、
以降は「Mode = Get」で呼び出して、スクリーンキャプチャを2Dピクチャとして取得します。

フルスクリーンをキャプチャさせると、えらいメモリ喰うは遅くてカクカクだわ、で
使いにくいので、必要領域だけキャプチャさせるように作り直して使うのが
イイんじゃないでしょうか。

0 件のコメント: