我有一个MFC控件,我将句柄传递给位图(HBITMAP).在控件OnPaint方法中,我使用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);
}
Run Code Online (Sandbox Code Playgroud)
编辑*我假设因为我可以将位图以正确的方向保存到磁盘,问题是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;
}
Run Code Online (Sandbox Code Playgroud)
哦,我使用了临界区,因为我将hbitmap传递给属性中的控件,然后在OnPaint中访问它.如果这是一个潜在的问题,我将不得不重新考虑.谢谢
只需在 BITMAPINFOHEADER 结构的 biHeight 字段中使用负值。
bi.biHeight = -height; //this is the line that makes it draw upside down or not
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6098 次 |
| 最近记录: |