【问题标题】:How to get a bitmap from a hdc?如何从 hdc 获取位图?
【发布时间】:2022-01-27 01:19:26
【问题描述】:

我可以像这样将hbitmap 加载到 hdc 中:

        Gdiplus::Color Color{ 255, 255, 255 };
        hBitmap = NULL;
        Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(L"home.png", false);
        if (bitmap)
        {
            bitmap->GetHBITMAP(Color, &hBitmap);
            delete bitmap;
        }

        BITMAP bm;
        GetObject(hBitmap, sizeof(bm), &bm);
        HDC hDCMem = CreateCompatibleDC(NULL);
        HBITMAP hBitmapOld = (HBITMAP)SelectObject(hDCMem, hBitmap);

我该如何做相反的事情,取回加载到特定 hdc 的位图?

我需要先检索hbitmap,然后从中检索bitmap?怎么样?

【问题讨论】:

标签: c++ winapi gdi+


【解决方案1】:

您可以使用GetCurrentObject() 访问当前选择的HBITMAP(和HPALETTE)到HDC

或者,您可以创建一个具有所需尺寸和颜色深度的新HBITMAPSelectObject() 将其放入新内存HDC,然后将BitBlt()/StretchBlt()HDC 放入其中。

无论哪种方式,一旦有了HBITMAP,就可以使用Bitmap(HBITMAP, HPALETTE) 构造函数或Bitmap::FromHBITMAP() 方法从中创建一个新的GDI+ Bitmap

【讨论】:

  • 您也可以SelectObject 一个不同的位图,这将返回现有位图(并取消它与 HDC 的链接,消除您可以对位图执行的大部分操作)
  • @BenVoigt 是的,我想到了这一点,但这是一个潜在的破坏性操作,具体取决于 HDC 的来源。您通常必须记住在使用完旧位图后恢复它,并希望您的代码在此之前不会崩溃。
  • 好吧,您可以(并且应该)以您找到它的方式选择原始位图。但是您可以在这样做之前从位图中读取。当然,这只是将竞态条件从“在读取过程中修改位图数据”变为“修改错误的位图”
  • 您知道是否有任何方法/提示可以减小存储在内存中的位图大小?
  • @Ruan 我知道的唯一方法是创建一个具有较低尺寸/颜色深度的新位图,或者启用压缩等,然后将像素从旧位图复制到新位图。或者,根本不使用位图,而是使用较小的格式,例如 JPG/GIF/等。
猜你喜欢
  • 2010-11-17
  • 2021-11-06
  • 2012-03-25
  • 2016-07-22
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多