我有一个MFC控件,我向它传递一个位图的句柄(HBITMAP)。在控件的OnPaint方法中,我使用BitBlt来呈现位图。但是位图是颠倒呈现的。
作为测试,我从这个句柄创建了一个CBitmap对象,并将其写到一个文件中,它创建了一个正面朝上的位图。那么,我对BitBlt的调用做错了什么吗?
我已经在下面的OnPaint上发布了我的代码。我确实尝试过将设备上下文的映射模式更改为MM_LOENGLISH,并且能够让位图正面朝上呈现,但它非常粗糙。当我离开MM_TEXT的映射模式时,图像的质量是完美的,但正如我所说的,它是颠倒的。我没有太多的工作与位图,be etc...so我可能会错过一些容易的东西。如有其他建议,我们将不胜感激。对于一些背景,我从摄像机驱动程序中抓取一个字节*并创建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中访问它。如果这是一个潜在的问题,我将不得不重新考虑。谢谢
发布于 2012-01-27 03:00:14
Windows位图首先存储在底行中。世界上其他地方的大多数人都是先做营收的,所以我想这就是你从相机里得到的东西。
可以在BITMAPINFOHEADER结构中使用负高度来颠倒正常顺序。
发布于 2013-01-04 11:03:26
只需在BITMAPINFOHEADER结构的biHeight字段中使用负值。
bi.biHeight = -height; //this is the line that makes it draw upside down or not发布于 2012-01-27 03:02:37
在MM_TEXT中,y轴指向下方,而在其他贴图模式中,y轴指向上方。尝试MM_ISOTROPIC映射模式。要进行更精确的控制,可能需要在CDC上设置视口和窗口偏移以及范围。
位图可以倒置存储,这是由BITMAPINFOHEADER结构中的负高度指示的,但这应该不是问题。
https://stackoverflow.com/questions/9022784
复制相似问题