2012-01-26 24 views
3

ビットマップ(HBITMAP)にハンドルを渡すMFCコントロールがあります。 OnPaintコントロールのコントロールで、私はビットマップをレンダリングするためにBitBltを使用しています。しかし、ビットマップは逆さまにレンダリングされています。私は、このハンドルからCBitmapオブジェクトを作成し、ファイルにそれを書き出し、それが右側アップしたビットマップを作成したテストとしてBitBlt描画ビットマップを逆さにして

。だから私はBitBltへの呼び出しで何か間違っているのですか?

下記のOnPaintからコードを投稿しました。私は、私のデバイスコンテキストのマッピングモードをMM_LOENGLISHに変更しようとしましたが、ビットマップを右上にレンダリングすることができましたが、非常に粒状でした。 MM_TEXTでマッピングモードを終了すると、イメージの品質は完璧ですが、私が言ったように、それは逆さまです。私はビットマップ、blittingなどではあまり働いていないので、簡単に何かを逃してしまうかもしれません。他の提案は高く評価されます。いくつかの背景については、私はビデオカメラドライバからBYTE *を取得し、ビデオをレンダリングするためにHBITMAPを作成しています。 これを正しくレンダリングするにはどうすればよいですか?多くのおかげで

void BitmapControl::OnPaint() 
{ 
EnterCriticalSection (&CriticalSection); 

if (_handleBMP) 
{ 

    CPaintDC dc(this); 
    //dc.SetMapMode(MM_LOENGLISH); 
    CDC dcMem; 
    dcMem.CreateCompatibleDC(&dc); 

    CRect rect; 
    GetClientRect(&rect); 
    dc.DPtoLP(&rect); 


    CBitmap* pBmpOld = dcMem.SelectObject(CBitmap::FromHandle(_handleBMP)); 
    BitBlt(dc,rect.left,rect.top,rect.Width(),rect.Height(),dcMem,rect.left,rect.top,SRCCOPY); //works with MM_TEXT but upsidedown 
    //BitBlt(dc,0,rect.bottom,rect.Width(),-rect.Height(),dcMem,0,0,SRCCOPY); //works with MM_LOENGLISH 
    dcMem.SelectObject(pBmpOld); 
    DeleteDC(dc); 
    DeleteDC(dcMem); 
    DeleteObject(_handleBMP); 
    DeleteObject(pBmpOld); 
    _handleBMP = NULL; 

} 
LeaveCriticalSection (&CriticalSection); 
} 

編集* 私は問題はビットブリットであったことを正しい向きでディスクにビットマップを救うことができるので、私は仮定しました。ここでは、私がHBITMAPを生成するために使用するコードを示します。

HBITMAP BitmapWriter::CreateBitmapFromFrame(BYTE* frame) 
{ 
BITMAPFILEHEADER* bmfh; 
bmfh = (BITMAPFILEHEADER*)frame; 

BITMAPINFOHEADER* bmih = &_bmi; 

BITMAPINFO* bmpInfo = (BITMAPINFO*)bmih; 

HBITMAP hbmp = CreateDIBSection(_hdc,bmpInfo,DIB_RGB_COLORS,NULL,NULL,0); 
SetBitmapBits(hbmp,_bmi.biSizeImage,frame); 


return hbmp; 
} 

ああ、私はプロパティで制御にHBITMAPを渡し、その後のOnPaintでそれにアクセスするので、私は、クリティカルセクションを使用していました。それが潜在的な問題なら、私はそれを再考する必要があります。ありがとう

+0

'_handleBMP'を作成する方法とは、描画する方法よりも多くのことが関係しています。 –

+2

これは、ビットマップを作成したコードで間違っていました。スキャンラインは上下逆に格納されていることに注意してください。 Btw、EnterCriticalSectionは描画コードの生の赤いフラグであり、GDIは基本的にスレッドセーフではありません。 –

答えて

5

Windowsビットマップは、最初に下の行と一緒に格納されます。世界の残りの部分のほとんどがトップラインで動作するので、カメラから取得したものと推定されます。

あなたは、通常の順序を逆にするBITMAPINFOHEADER構造に負の高さを使用することができます。他のマッピングモードでは、アップポイントながらMM_TEXT Y軸

+0

BITMAPINFOHEADERオブジェクトのbiHeightプロパティを480から-480に変更しましたが、これは効果がなく、逆さまになっています。 – mash

+0

@mash、ビットマップが作成された場所でこの変更を行うことを理解していただければ幸いです生データから。申し訳ありませんが私は明確でない場合。 –

+0

はい私はそれを遅く設定していると思います。私はDirectShowグラフから生データを取得しています。グラフはソースフィルタとサンプルグラバーで構成され、サンプルグラバーは生データをサブスクライバにパ​​ブリッシュします。その1つはレンダラーです。私は何とか私のソースフィルタのプロパティを設定する必要があると思いますか?私はまだこれを行う方法がわかりません – mash

1

は、下向き。マッピングモードでMM_ISOTROPICを試してください。より正確な制御を行うには、ビューポートとウィンドウオフセットとエクステントをCDCに設定する必要があります。

ビットマップはBITMAPINFOHEADER構造に負の高さによって示されている、逆さまに格納することができるが、これは問題にはなりません。

+0

あなたはいつも構造の高さを否定することができ、マッピングモードを変更せずに他の方法を描くことができます。 –

1

私はこの作業をしているようです。私はマッピングモードをMM_LOENGLISHに変更しました。これは私に粒子の粗い画像を与えたが、これは以下の

dc.SetStretchBltMode(COLORONCOLOR)を加えることにより補正した前に私が言ったように、

私は実際には理由を把握するために読んだのビットを行う必要がある...しかし、ここに私のレンダリングコードは今です。

void BitmapControl::OnPaint() 
{ 
EnterCriticalSection (&CriticalSection); 

if (_handleBMP) 
{ 

    CPaintDC dc(this); 
    //dc.SetMapMode(MM_ISOTROPIC); 
    dc.SetMapMode(MM_LOENGLISH); 
    CDC dcMem; 
    dcMem.CreateCompatibleDC(&dc); 

    CRect rect; 
    GetClientRect(&rect); 
    dc.DPtoLP(&rect); 

    CBitmap* pBmpOld = dcMem.SelectObject(CBitmap::FromHandle(_handleBMP)); 

    //tst 
    dc.SetStretchBltMode(COLORONCOLOR); 

    //BitBlt(dc,rect.left,-0,rect.Width(),rect.Height(),dcMem,rect.left,rect.top,SRCCOPY); //works with MM_TEXT but upsidedown 
    BitBlt(dc,0,rect.bottom,rect.Width(),-rect.Height(),dcMem,0,0,SRCCOPY); //works with MM_LOENGLISH 
    dcMem.SelectObject(pBmpOld); 
    DeleteDC(dc); 
    DeleteDC(dcMem); 
    DeleteObject(_handleBMP); 
    DeleteObject(pBmpOld); 
    _handleBMP = NULL; 

} 
LeaveCriticalSection (&CriticalSection); 
} 
3

ただ、BITMAPINFOHEADER構造体ののbiHeightフィールドに負の値を使用します。

bi.biHeight = -height; //this is the line that makes it draw upside down or not 
関連する問題