我有一個MFC控件,我將一個句柄傳遞給位圖(HBITMAP)。在控件的OnPaint方法中,我使用BitBlt來渲染位圖。但是這個位圖被顛倒渲染。BitBlt繪製位圖顛倒
作爲一個測試,我從這個句柄創建了一個CBitmap對象,並將其寫入到一個文件中,並創建了一個正面朝上的位圖。那麼,我是否在對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'的方式有關,而不是您繪製它的方式。 –
這在創建位圖的代碼中幾乎肯定會出錯。請注意掃描線是顛倒存儲的。順便說一句,EnterCriticalSection是繪畫代碼中的一個原始紅旗,GDI基本上不是線程安全的。 –