在mingw工作,在内存中创建彩色DC的时间非常糟糕。例如,在下面的代码片段中,如下所示,“foo_scratch.bmp”是单色版本的 image(来自EMR_STRETCHDIBITS记录)。如果省略aDC并且srcDC直接使用CreateDC,则该文件具有彩色图像。
Gdiplus::Bitmap *pbmp = NULL;
BITMAPINFO *pbitmapinfo = (BITMAPINFO *)((char *)lpEMFR + pEmr->offBmiSrc);
void *pBitsInMem = (char *)lpEMFR + pEmr->offBitsSrc;
HBITMAP hbmsrc;
HDC aDC = CreateDC("DISPLAY", "", NULL, NULL);
HDC srcDC = CreateCompatibleDC(aDC);
hbmsrc = CreateDIBitmap(
srcDC,
&(pbitmapinfo->bmiHeader),
CBM_INIT,
pBitsInMem,
pbitmapinfo,
DIB_RGB_COLORS);
if(hbmsrc){
CLSID pngClsid;
GetEncoderClsid(L"image/bmp", &pngClsid);
pbmp = Gdiplus::Bitmap::FromHBITMAP(hbmsrc,NULL);
pbmp->Save(L"C:\\Temp\\foo_scratch.bmp",&pngClsid, NULL);
当需要将两个图像(hbmdst,hbmsrc)与bitblt操作放在一起时,这一切都会变得很明显。目前我所管理的最好的是单色。在最坏的情况下,图像是纯黑色。在这个片段中,ROP已被硬编码为SRCCOPY,而我仍然没有成功将图像从一个HBITMAP复制到另一个HBITMAP。很沮丧!
HDC dstDC = CreateCompatibleDC(aDC);
HBITMAP hbmdOld = (HBITMAP) SelectObject(dstDC, hbmdst);
HBITMAP hbmsOld = (HBITMAP) SelectObject(srcDC, hbmsrc);
GetObject(hbmsrc, sizeof(bm), &bm);
BitBlt(dstDC, 0, 0, bm.bmWidth, bm.bmHeight, srcDC, 0, 0, SRCCOPY);
SelectObject(srcDC, hbmsOld);
SelectObject(dstDC, hbmdOld);
(void) DeleteDC(dstDC);
pbmp = Gdiplus::Bitmap::FromHBITMAP(hbmdst,NULL);
pbmp->Save(L"C:\\Temp\\scratch.bmp",&pngClsid, NULL);
我做错了什么?
由于
答案 0 :(得分:1)
想出来 - 无论在何处创建位图,都必须使用与显示器(或其他设备)直接相关的DC,而不是从第一个DC导出的“兼容”DC。