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ピクチャとして取得します。

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

4 件のコメント:

匿名 さんのコメント...

PictureBoxに貼り付けた画像は問題無いが。
インボークメソッド取得した画像データが微妙に変だ:真っ白(R=255,G=255,B=255)のデータが(R=248,G=248,B=248)として取得した。

kanitawa さんのコメント...

当方の環境(Windows10+LabVIEW2019)では、インボークメソッドで取得した画像データをJPEG保存してもおっしゃられるような現象は起こりませんでした。ちゃんと(R=255,G=255,B=255)は(R=255,G=255,B=255)として取得・保存されています。

匿名 さんのコメント...

念のため、再度ScreenCapture.viをダウンロードして、新規PC(Win10)のLabview2022でこのSUBVIを取り込んで、SUBVIの出力に2Dピクチャをつなぐ簡単なプログラムを作った。

そして真っ白のイメージファイルを開き、プログラムを走らせてながら、ディスプレー上の色を調べたが、やはり2Dピクチャの色は248/248/248になっていました。
(色確認にはフリーソフトの「ちょっとこの色」を使った)

ただ、SUBVIを取り込む時、下記警告が出ましたが、新しいバージョンへ変更のため大丈夫だろと無視した:
- Expected Assembly "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", but found "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089."

- Expected Assembly "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", but found "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a."

しかしおしゃるようなJPEGファイルを保存すると問題なかったなら、やはりWindows環境に何らかの違いはあるかなと思ってしまう~
もうちょっと確認してみる

匿名 さんのコメント...

やっと原因わかりました、NetFrameと関係なかった。
PictureBoxのGetImageの入力側の24と0を削除すればちゃんと255まで出るようになった。