我有一个存储为 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->StretchBlt
与 dispDC
作为源 CDC 调用。这在本地登录时工作正常,因为显示也设置为 32bpp。使用远程桌面登录后,显示速度将变为 16bpp,并且图像已损坏。罪魁祸首是
SetBitmapBits
;即为了让它工作,我必须用我想要显示的 16bpp 版本正确填充 translatedImage
。我没有自己做,而是搜索了文档,发现 SetDIBits
听起来像我想要的:在我的例子中,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
始终为零,自然而然,我的窗口中只有黑色。代码有什么问题? 最佳答案
根据 documentation for SetDIBits
:
在您的示例代码中,您在创建后将其选择到设备上下文中,所以大概这就是 SetDIBits
失败的原因。
关于c++ - MFC BitBlt 和 SetDIBits 与 SetBitmapBits,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24548520/