ディスプレイをキャプチャーする

今回は企画ものの第一弾ということで、小紅の代表作のひとつ「ディスプレイキャプチャー あれ」の仕組みを簡単に説明しちゃいます。

0.プログラムの流れ
「ディスプレイキャプチャー あれ」でディスプレイの画像をAVIで保存するための流れは大体以下のようになっています。
1.画像を保存していくAVIファイルを作成する
_2.ディスプレイの状態を取得する
↑繰り返し
_3.取得した画像をAVIファイルに追加する
4.AVIファイルを閉じて追加できないようにする
では、それぞれの段階について説明していきます。

1.画像を保存していくAVIファイルを作成する
小紅はAVIファイルを作るためにEasyAVIという、自作のクラスを使用しています。
このクラスの入ったヘッダファイルは「ディスプレイキャプチャー あれ」に、おまけとして収録してあるので使用してみてください。
なお、このクラスの中身に関する説明は面倒くさいので割愛します。
このクラスを使用するには、まず
#include "EasyAVI.h"
と、所定のヘッダファイルをインクルードする必要があります。
ちなみにこのヘッダファイルではコメントを使って
#pragma comment(lib,"Vfw32.lib")
と、"Vfw32.lib"をリンクしている行がありますが、コンパイラによってはこの命令が使用できませんので、ここの行でエラーが出る場合はこの行を消し、手動でリンクを設定してください。

次にEasyAVIクラスを用いて画像保存用のAVIファイルを作る方法です。
ファイルを作りたい部分で
//EasyAVI *_easyavi;
//HDC _hMemDC;
//これらは後でも使用するので、
//グローバル変数としてあらかじめ宣言しておくのがいいです。


_easyavi = new EasyAVI();

//録画開始
_hMemDC = _easyavi->Start(
NULL,
,
高さ,
ファイル名,
スケール,
レート
);

if(_hMemDC==NULL){
//失敗したときの処理を行う
delete _easyavi;
}
超簡単ですね。

2.ディスプレイの状態を取得する
3.取得した画像をAVIファイルに追加する
この2つは一続きの処理なので、一緒に説明します。
ソースは以下のようになります。

HDC hDC;
int s;

//ディスプレイのデバイスコンテキストハンドルを取得
if((hDC=GetDC(NULL))==NULL)return;

if((s=SetStretchBltMode(hDC,HALFTONE))==0){
//伸縮モードの設定に失敗したときの処理を書きます
ReleaseDC(NULL,hDC);
return;
}

if(!StretchBlt(
_hMemDC,
0,
0,
AVIの幅,
AVIの高さ,,
hDC,
取得範囲の左上のX座標,
取得範囲の左上のY座標,
取得範囲の幅,
取得範囲の高さ,
SRCCOPY

)){

//HDCの貼り付けに失敗したときの処理を書きます
SetStretchBltMode(hDC,s);
ReleaseDC(NULL,hDC);
return;

}
SetStretchBltMode(hDC,s);
ReleaseDC(NULL,hDC);

//_hMemDCの中身をAVIファイルに追加します
_easyavi->Save();

ちなみにソース中の_hMemDCと_easyaviは 1. で使用したものと同じグローバル変数です。

この処理は定期的に行うわけですから、タイマーイベントを使用するのがよいかもしれません。

4.AVIファイルを閉じて追加できないようにする
EasyAVIクラスを使用している場合は
delete _easyavi;
と、メモリを開放すれば勝手に閉じるように作ってあるので安心です。

以上が大まかな説明です。
でもこのままでは「マウスのキャプチャーが出来ない」、「取得フレームが飛び飛びになる」等の問題が発生するのでもう少し細かい処理も入れているのですが、そのあたりは各人で処理してください。

もどる