我有一个位图存储为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
; 即为了它的工作,我必须正确填写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
总是零,当然,在窗口我只得到黑色.代码有什么问题?
根据以下文件SetDIBits
:
当应用程序调用此函数时,不得将hbmp参数标识的位图选择到设备上下文中.
在您的示例代码中,您在创建它之后将其选择到设备上下文中,因此可能SetDIBits
是失败的原因.