今回の課題は非圧縮のAVIファイルとのBitmapファイルのやり取りだ。
AForge.NETを利用する、http://www.aforgenet.com/、このブログを書いている時点で最新バージョンは2.2.5である。
準備
- 上記のサイトの"download"からzipファイルをダウンロード
- 適当なフォルダ(自分のVisual StudioのProjectフォルダ)に解凍
- Visual Studioを開き、使用するプロジェクトを作成
- Solution Explorerで、プロジェクトを右クリックし、"Add" -> "Reference..."を選択
- Browseボタンを押し、先ほど解凍したAForge.NETの"Release"フォルダから、"AForge.Video.VFW.dll"を追加、"AForge.Video"も自動で追加されるはず
- 使用するClassで"using AForge.Video.VFW"、"using System.Drawing"ディレクティブを追加
AVIファイルを開いて、各フレームデータを取得する
うっかりこのまま実行して、フレーム数の多い高解像度のAVIなぞ放り込むと、間違いなくメモリ不足で即死するので注意。
AVIReader AVIReader = new AVIReader();
AVIReader.Open(stringAVIfilename);
int AVIWidth = AVIReader.Width;
int AVIHeight = AVIReader.Height;
float AVIFPS = AVIReader.FrameRate;
int TotalNumOfFrames = AVIReader.Length;
Bitmap[] bitmapFrames = new Bitmap[ TotalNumOfFrames ];
int countFrame = 0;
while (countFrame < TotalNumOfFrames)
{
bitmapFrames[countFrame] = AVIReader.GetNextFrame();
countFrame++;
}
AVIReader.Close();
各メソッド、プロパティは以下の通り。
- AVIReader(): コンストラクタ
Lengthを超えてアクセスしようとするとぬるぽになる。
また見てのとおりOpen()、Close()やGetNextFrame()でコケてもエラーを吐かないので、ちゃんと例外処理をすること。
AVIファイルを作成して、Bitmapをフレームデータとして書き出す
こちらもうっかりこのまま実行して、あまりでかい画像を何フレームも書き込もうと、HDDを喰うので注意。
Bitmap bitmapAVI = new Bitmap(stringBMPFilename);
AVIWriter AVIWriter = new AVIWriter();
AVIWriter.FrameRate = 60;
AVIWriter.Codec = "DIB ";
AVIWriter.Open(stringAVIFilename, bitmapAVI.Width, bitmapAVI.Height);
int countFrame = 0;
static int NumOfFrames = 1000;
while (countFrame < NumOfFrames)
{
AVIWriter.AddFrame(bitmapAVI);
countFrame++;
}
AVIWriter.Close();
各メソッド、プロパティは以下の通り。
- AVIWriter(): コンストラクタ
- void Open(string filename, int width, int height): 幅width、高さheightのfilenameのAVIを作成する(開く)
- void Close(): AVIファイルを閉じる
- void AddFrame(Bitmap bitmap): 現在のフレームデータとしてbitmapを追加する
- int FrameRate: AVIのフレームレート(単位fps)、AVIを開く前に設定
- string Codec: AVIのCODEC種、"DIB "(最後のwhite spaceに注意)で非圧縮、AVIを開く前に設定
これも見てのとおりOpen()、Close()やAddFrame()でコケてもエラーを吐かないので、ちゃんと例外処理をすること。