gpt4 book ai didi

c++ - BitBlt 倒置绘制位图

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:00 25 4
gpt4 key购买 nike

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

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

我已经在下面发布了来自 OnPaint 的代码。我确实尝试将我的设备上下文的映射模式更改为 MM_LOENGLISH,并且能够让位图呈现为右侧向上,但它非常粗糙。当我将映射模式保留为 MM_TEXT 时,图像的质量是完美的,但正如我所说,它是颠倒的。我在位图、 block 传输等方面的工作不多……所以我可能会遗漏一些简单的东西。任何其他建议将不胜感激。对于某些背景,我从摄像机驱动程序中获取 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 中访问它。如果这是一个潜在的问题,我将不得不重新考虑。谢谢

最佳答案

Windows 位图存储时底线在前。世界上大多数其他国家/地区的工作人员都将收入放在首位,因此我认为这就是您从相机中获得的信息。

您可以在 BITMAPINFOHEADER 结构中使用负高度来反转正常顺序。

关于c++ - BitBlt 倒置绘制位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com