MFC BitBlt和SetDIBits与SetBitmapBits

 谢文友649 发布于 2023-01-06 15:35

我有一个位图存储为BGRA字节数组.这是我用来绘制位图的代码:

CDC *dispDC = new CDC();
dispDC->CreateCompatibleDC(pDC);
CBitmap *dispBMP = new CBitmap();
dispBMP->CreateCompatibleBitmap(pDC, sourceImage->GetWidth(), sourceImage->GetHeight());
dispDC->SelectObject(this->dispBMP);

实际复制translatedImage数组中的像素时会发生以下情况:

dispBMP->SetBitmapBits(sourceImage->GetArea() * 4, translatedImage);

经过一些处理之后,我打电话pDC->StretchBltdispDC作为源CDC.这在本地登录时工作正常,因为显示也设置为32bpp.

一旦我使用远程桌面登录,显示屏将变为16bpp并且图像被破坏.罪魁祸首是SetBitmapBits; 即为了它的工作,我必须正确填写translatedImage我想要显示的16bpp版本.我没有自己这样做,而是搜索了文档,发现SetDIBits它听起来像我想要的那样:

SetDIBits函数使用在指定DIB中找到的颜色数据设置兼容位图(DDB)中的像素.

在我的例子中,DIB是32bpp RGBA数组,而DDB是dispBMP我创建的CreateCompatibleBitmap.

所以不是我的号召SetBitmapBits,这就是我所做的:

BITMAPINFO info;
ZeroMemory(&info, sizeof(BITMAPINFO));
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biBitCount = 32;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biCompression = BI_RGB;
info.bmiHeader.biSizeImage = sourceImage->GetArea()*4;
info.bmiHeader.biWidth = sourceImage->GetWidth();
info.bmiHeader.biHeight = sourceImage->GetHeight();
info.bmiHeader.biClrUsed = 0;

int r = SetDIBits(pDC->GetSafeHdc(), (HBITMAP)dispBMP,
                  0, sourceImage->GetHeight(), translatedImage, 
                  &info, DIB_PAL_COLORS);

然而,r总是零,当然,在窗口我只得到黑色.代码有什么问题?

1 个回答
  • 根据以下文件SetDIBits:

    当应用程序调用此函数时,不得将hbmp参数标识的位图选择到设备上下文中.

    在您的示例代码中,您在创建它之后将其选择到设备上下文中,因此可能SetDIBits是失败的原因.

    2023-01-06 15:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有