« メディアタイプの色深度の確認コードメモ | メイン | 更新タイミングはいつ? »
2005年09月28日
吉里吉里 ムービー拡張日誌2:: 自前でBMP
Tweet @jin1016をフォローtTJSNI_BaseLayer::GetMainImage()->GetBitmap()->GetBitmapDC()でHDCが取得できない時は、次のようにして作ることにした。
tTVPBitmap *bmp = Layer::GetMainImage()->GetBitmap();
HDC ref = GetDC(0);
HBITMAP myDIB = CreateDIBitmap( ref, bmp->GetBITMAPINFOHEADER(), CBM_INIT, bmp->GetBits(), bmp->GetBITMAPINFO(), bmp->Is8bit() ? DIB_PAL_COLORS : DIB_RGB_COLORS );
HDC hdc = CreateCompatibleDC( NULL );
HGDIOBJ hOldBmp = SelectObject( hdc, myDIB );
VideoOverlay->SetMixingBitmap( hdc, &dest, alpha );
SelectObject( hdc, hOldBmp );
DeleteObject( myDIB );
デバイス依存ビットマップ(DDB)を作成していので、色深度は画面モードと同じになってしまう。
CreateDIBSectionで作ることも考えたが、わざわざ画像をコピーするのが面倒なので、CreateDIBitmapにした。
最終的に描画される色深度は画面モードと同じになってしまうわけだが、VMRで拡縮された時、32bppで処理されてから16bppになるのと、初めから16bppで処理された場合とでは、初めから16bppの方が少し画質が悪くなりそうだ。
誤差などを考慮すると丸め処理などは出来るだけ後でやった方がいい。
ただ、この場合に認識できるぐらい画質が劣化するのかどうかは知らない。
そこで、VMRが接続されている時に使われているメディアタイプの色深度を確認してみた。
まず、画面モードを32bitにして実行し、確認。
16bitカラー……って、えっ? 16bitカラーで接続されてるの?
デコーダーの優先メディアタイプは16bitカラーなのだろうか?
なら、別に画面モードと同じになってもいいや。
投稿者 Takenori : 2005年09月28日 18:29
comments powered by Disqus