【问题标题】:GDI+ DC in memory always monochrome内存中的 GDI+ DC 始终为单色
【发布时间】:2012-04-19 23:31:23
【问题描述】:

在 mingw 工作,在内存中创建彩色 DC 时遇到了很糟糕的事情。例如,在下面的代码 sn-p 中,“foo_scratch.bmp”是 图像(来自 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 操作放在一起时,这一切都会出现。目前我所管理的最好的是单色。在最坏的情况下,图像是纯黑色的。在这个 sn-p 中,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);

我做错了什么?

谢谢

【问题讨论】:

    标签: c++ windows gdi+


    【解决方案1】:

    想通了 - 无论在何处创建位图,都必须使用与显示器(或其他设备)直接关联的 DC,而不是从第一个 DC 派生的“兼容”DC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 2018-01-15
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多