我有一个MFC控件,其中我传递了一个位图的句柄(HBITMAP)。在控件的OnPaint方法中,我使用BitBlt来渲染位图。但是位图被倒置渲染。
作为测试,我从这个句柄创建了一个CBitmap对象,并将其写入文件,它创建了一个正确的位图。那么我的BitBlt调用是否有问题?
下面是我的OnPaint代码。我尝试将设备上下文的映射模式更改为MM_LOENGLISH,并且能够使位图正常渲染,但它很粗糙。当我将映射模式保留为MM_TEXT时,图像质量完美,但正如我所说,它是倒置的。我没有与位图、Blitting等工作过,因此可能会漏掉一些简单的东西。欢迎提出其他建议。背景是我正在从视频相机驱动程序中获取BYTE*并创建HBITMAP以渲染视频。
如何使其正确渲染?谢谢。
作为测试,我从这个句柄创建了一个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);
}
编辑* 我曾认为,我可以将位图以正确的方向保存到磁盘中,因此问题出在bitblt上。以下是我生成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
的方式有关,而不是您绘制它的方式有关。 - Adrian McCarthy