Получить изображение / растровое изображение из контекста устройства или графического объекта в gdiplus (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 +.

1

Решение

Вы можете нарисовать только 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);

или использовать CImage сохранить memdc в файл

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]