連載2 画像転送システム その9
初期状態で特定のコーデックを選択する場合はCOMPVARS構造体のfccHandlerメンバーに選択したいコーデックのFourCCをセットしてICCompressorChoose()を実行します。
さらに、特定のフォーマットに対応したコーデックのみを表示する為にBITMAPINFOHEADER構造体を使い、主にbiCompressionとbiBitCountで利用可能なコーデックを絞ります。但し、画像サイズは大きくすると表示されなくなるコーデックがありますので、実際に使う画像サイズを正直に設定するのではなく小さ目の適当なサイズにしておきましょう。
ICCompressorChoose()はコーデックを選択してOKボタンが押されると戻り値としてTRUEを返します。
エラーまたはキャンセルボタンが押されるとFALSEが返ります。TRUEが返った場合はCOMPVARS構造体にコーデックの情報が詰まっています。主に必要なのはFourCCを示すfccHandlerだけなので自前の変数へコピーしておきましょう。
ICCompressorChoose()はコーデックを選択した後すぐに圧縮処理が開始できるように色々な準備(メモリの確保など)をしてくれますが、結局それらは使わないのでICCompressorChoose()のあとはすぐにICCompressorFree()でリソース(メモリー)を開放しておきましょう。
BOOL CodecChoose( DWORD *lpdwFcc ) { COMPVARS cv; ZeroMemory( &cv, sizeof(cv) ); cv.cbSize = sizeof(COMPVARS); cv.dwFlags = ICMF_COMPVARS_VALID; cv.fccType = ICTYPE_VIDEO; cv.fccHandler = *lpdwFcc; BITMAPINFOHEADER bi; ZeroMemory( &bi, sizeof( bi)); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biBitCount = 32; //RGB32なら32、RGB24なら24を設定します bi.biPlanes = 1; bi.biCompression = BI_RGB; bi.biWidth = 320; // 画像サイズは適当に小さめにしておきます bi.biHeight = 240; bi.biSizeImage = bi.biWidth * bi.biHeight * bi.biBitCount / 8; HWND hWnd = NULL; // 親ウインドウのハンドル if (!ICCompressorChoose( hWnd, 0 | ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME, &bi, NULL, &cv, NULL )) { return FALSE; } *lpdwFcc = cv.fccHandler; ICCompressorFree( &cv ); return TRUE; } void main( void ) { // RGB32に対応しているコーデックの一覧を表示する、初期状態でAMV3コーデックを選択 DWORD dwFcc = FCC('AMV3'); if (CodecChoose( &dwFcc ) == TRUE) { // dwFccに選択されたコーデックのFourCCが格納されています。 // このFourCCを使ってAMV3以外の様々なコーデックで画像転送システムを実行できます。 }else{ // コーデックの選択はエラーまたはキャンセルされました。 } } |
次のようにBITMAPINFOHEADERを使わずにNULLを指定するとインストールされている全てのコーデックを表示する事ができます。
ICCompressorChoose( hWnd, 0 | ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME, NULL, NULL, &cv, NULL ) |
この場合、実際には使えないコーデックや、圧縮処理を持たない(復元専用の)コーデックなども表示されてしまうので不便ですね。
続く。
- 関連記事
trackback
コメントの投稿