2008年1月24日木曜日

画面をキャプチャする(C#)

デスクトップ画面をキャプチャする。

キーボードなら[PrtSc]キーを押せば画面全体はキャプチャできる。
[Alt]キーと一緒に押せば、アクティブなウィンドウのみをキャプチャできる。

もっと細かくキャプチャしたいとなると・・・プログラムするしかない。
(フリーソフトを使えば?ってツッコミは無しで^^;)

.NET Frameworkには画面のキャプチャを容易にしてくれる、
"CopyFromScreen"というメソッドがある。


早速、使ってみる。

まずは、新規で"Windows フォーム アプリケーション"プロジェクトを作成する。

表示されたフォームに、"Button"と"PictureBox"を追加する。
この時、"pictureBox1"の"Size"を「400, 400」、"BorderStyle"を"FixedSingle"にしておく。












"button1"をダブルクリックして、メソッドを作成。

/*** Form1.cs ***/
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(200, 200);
using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(new Point(100, 100), new Point(0, 0), bmp.Size);
}

this.pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
this.pictureBox1.Image = bmp;
}

実行する。

"button1"をクリックすると、画面の左上の方がキャプチャされ、
"pictureBox1"に表示される。
















"pictureBox1"の左上1/4の所に表示された。

CopyFromScreen
通常、第一引数には、コピーの画像の左上隅の座標を与える。
第二引数には、コピーの画像の左上隅の座標を与える。
第三引数には、コピーするサイズを与える。
第一、二引数に与えた座標を開始点として、第三引数に与えたサイズだけコピー
される。


既にお分かりの人も多いと思うが、ソース内の

this.pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
で、"pictureBox1"内での表示方法を設定している。

表示方法は全部で5つある。
AutoSize
PictureBoxのサイズが、格納しているイメージと同じ大きさになる。

CenterImage
PictureBoxがイメージより大きい場合は、イメージは中央に表示される。
イメージがPictureBoxより大きい場合は、イメージはPictureBoxの中央に
配置され、外にはみ出した分はクリップされる。

Normal
PictureBoxの左上隅に配置される。イメージがPictureBoxより大きい場合は、イメージはクリップされる。

StretchImage
イメージのサイズが、PictureBoxのサイズに合うように調整される。

Zoom
イメージのサイズは、サイズ比率を維持したままで拡大または縮小される。
と、言うわけで、全部試してみる。

AutoSize


















CenterImage


















StretchImage


















Zoom


















残念ながら、上の画像からでは"StretchImage"と"Zoom"の違いがわからない
が、"pictureBox1"の"Size"を「300, 400」などにしてみるとわかると思う。
(作った後に気づいてしまった、申し訳ないです。)


C#を使って、簡単に画面をキャプチャすることができた。

この方法だと、座標指定を指定するため、ほとんどの場合に利用できそうだ。

例えば、前述の「アクティブなウィンドウのみをキャプチャする」の場合、
何らかの方法でアクティブなウィンドウの左上隅の座標とウィンドウの大きさを
取得すれば、"CopyFromScreen"メソッドが利用できる。


参照:
画面をキャプチャする: .NET Tips (VB.NET, C#, Visual Studio...)

0 件のコメント: