2012-04-18 28 views
0

在mingw中工作,在內存中創建彩色DC的時間很可怕。例如,在下面的代碼片段中,如所寫,「foo_scratch.bmp」是 圖像的單色版本(來自EMR_STRETCHDIBITS記錄)。如果省略aDC而srcDC直接使用CreateDC,則該文件具有彩色圖像。內存中的GDI + DC始終是單色的

 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)需要用塊傳送操作放在一起。目前我所管理的最好的是單色。最糟糕的是,圖像是純黑的。在這段代碼中,ROP已經被硬編碼到SRCCOPY,並且我還沒有成功地將圖像從一個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); 

我在做什麼錯了?

由於

回答

1

想通了 - 無論是創建的位圖必須使用直接與顯示器(或其它裝置)相關聯的DC,而不是「兼容」 DC從第一DC的。

相關問題