ビットマップ(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でそれにアクセスするので、私は、クリティカルセクションを使用していました。それが潜在的な問題なら、私はそれを再考する必要があります。ありがとう
'_handleBMP'を作成する方法とは、描画する方法よりも多くのことが関係しています。 –
これは、ビットマップを作成したコードで間違っていました。スキャンラインは上下逆に格納されていることに注意してください。 Btw、EnterCriticalSectionは描画コードの生の赤いフラグであり、GDIは基本的にスレッドセーフではありません。 –