c++ - 从设备上下文或 gdiplus (GDI+) 中的图形对象获取图像/位图

标签 c++ mfc gdi+ gdi

我正在寻找一种方法,让 GDI 代码从设备上下文中获取位图...

void CMFCDlg::OnPaint()
{
    CDC dc(this);   // Device Context for painting
    CBitmap backgroundBmp;

    // Get Client Area
    CRect clientRect;
    GetClientRect(&clientRect);

    // Create memory DC
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);

    // Create compatible bitmap
    backgroundBmp.CreateCompatibleBitmap(&memDC, clientRect.Width(), clientRect.Height());

    // Copy Blt Bits from DC to Bitmap
    CBitmap* pOldBmp = dc.SelectObject(&backgroundBmp);
    memDC.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &dc, 0, 0, SRCCOPY);
    dc.SelectObject(pOldBmp);

    // Release the memory DC
    memDC.DeleteDC();
}

...可以在 GDI+ 中完成以接收 GDI+ 图像或位图。

我正在寻找一些接近此草案的方法:

void CMFCDlg::OnPaint()
{
    CDC dc(this);   // Device Context for painting
    Bitmap backgroundBmp;

    // Get Client Area
    CRect clientRect;
    GetClientRect(&clientRect);

    // Get graphics object from device context
    Graphics gr(dc);

    // Somehow create a compatible GDI+ bitmap
    backgroundBmp = gr.??????
}

我只见过涉及 GDI 对象和资源的代码,这些代码随后会转换为 GDI+ 对象。但它们都不适合我,我觉得还有一种(简单的)其他方法可以通过更舒适的 GDI+ 环境来做到这一点。

最佳答案

您只能将 GDI+ 绘制到设备上下文。但您可以使用内存设备上下文,然后绘制到 dc 或保存到文件:

CClientDC dc(this);

CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc, 100, 100);
CBitmap *oldbitmap = (CBitmap*)memdc.SelectObject(&bitmap);

Gdiplus::Graphics graphics_memdc(memdc);
Gdiplus::Pen pen(Gdiplus::Color(255, 0, 128, 255), 5);
Gdiplus::Rect rect(10, 10, 80, 80);
graphics_memdc.DrawRectangle(&pen, rect);

现在绘制到dc

dc.BitBlt(0, 0, 100, 100, &memdc, 0, 0, SRCCOPY);
memdc.SelectObject(oldbitmap);

或使用CImagememdc保存到文件

CImage cimage;
cimage.Create(100, 100, 32);
HDC imageHDC = cimage.GetDC();
::BitBlt(imageHDC, 0, 0, 100, 100, memdc.GetSafeHdc(), 0, 0, SRCCOPY);
cimage.Save(L"c:\\test\\fileName.jpg", GUID_NULL);
cimage.ReleaseDC();

关于c++ - 从设备上下文或 gdiplus (GDI+) 中的图形对象获取图像/位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33045627/

相关文章:

C++ 新运算符作用域

c++ - 类图: Can I share a composition?

c++ - “CObject::CObject”:无法访问类 'CObject' 中声明的私有(private)成员

c# - 即使我将其丢弃,TextureBrush 也会导致内存泄漏

c# - 是否可以在 Windows docker 容器中运行的 dotnet 核心应用程序中使用 EPPlus?

c++ - 简单字符串代码中没有匹配 'operator=='

公共(public)成员的 C++ 替代方案

mfc - 需要向旧版 MFC 对话框应用程序添加锚定/停靠

c++ - 将 CString 转换为 float 数组

c++ - 将 hDC 转换为 4bpp 位图