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

Get an Image/Bitmap from a device context or graphics object in gdiplus (GDI+)

本文关键字:对象 图形 获取 位图 图像 上下文 gdiplus GDI+      更新时间:2023-10-16

我正在寻找一种方法,这个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或保存到file:

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();