首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitBlt绘制倒置的位图

BitBlt绘制倒置的位图
EN

Stack Overflow用户
提问于 2012-01-27 01:48:45
回答 4查看 6.9K关注 0票数 4

我有一个MFC控件,我向它传递一个位图的句柄(HBITMAP)。在控件的OnPaint方法中,我使用BitBlt来呈现位图。但是位图是颠倒呈现的。

作为测试,我从这个句柄创建了一个CBitmap对象,并将其写到一个文件中,它创建了一个正面朝上的位图。那么,我对BitBlt的调用做错了什么吗?

我已经在下面的OnPaint上发布了我的代码。我确实尝试过将设备上下文的映射模式更改为MM_LOENGLISH,并且能够让位图正面朝上呈现,但它非常粗糙。当我离开MM_TEXT的映射模式时,图像的质量是完美的,但正如我所说的,它是颠倒的。我没有太多的工作与位图,be etc...so我可能会错过一些容易的东西。如有其他建议,我们将不胜感激。对于一些背景,我从摄像机驱动程序中抓取一个字节*并创建HBITMAP来渲染视频。我怎样才能让它正确地渲染??非常感谢

代码语言:javascript
复制
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的代码。

代码语言:javascript
复制
 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中访问它。如果这是一个潜在的问题,我将不得不重新考虑。谢谢

EN

回答 4

Stack Overflow用户

发布于 2012-01-27 03:00:14

Windows位图首先存储在底行中。世界上其他地方的大多数人都是先做营收的,所以我想这就是你从相机里得到的东西。

可以在BITMAPINFOHEADER结构中使用负高度来颠倒正常顺序。

票数 7
EN

Stack Overflow用户

发布于 2013-01-04 11:03:26

只需在BITMAPINFOHEADER结构的biHeight字段中使用负值。

代码语言:javascript
复制
bi.biHeight = -height;  //this is the line that makes it draw upside down or not
票数 7
EN

Stack Overflow用户

发布于 2012-01-27 03:02:37

MM_TEXT中,y轴指向下方,而在其他贴图模式中,y轴指向上方。尝试MM_ISOTROPIC映射模式。要进行更精确的控制,可能需要在CDC上设置视口和窗口偏移以及范围。

位图可以倒置存储,这是由BITMAPINFOHEADER结构中的负高度指示的,但这应该不是问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9022784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档