0

mingw で作業していて、メモリ内にカラー DC を作成するのに苦労しました。たとえば、次のコード スニペットでは、「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);

これは、後で 2 つのイメージ (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);

私は何を間違っていますか?

ありがとう

4

1 に答える 1

1

それを理解しました-ビットマップが作成される場所はどこでも、最初のDCから派生した「互換性のある」DCではなく、ディスプレイ(または他のデバイス)に直接関連付けられたDCを使用する必要があります。

于 2012-04-19T15:31:23.910 に答える