2015-10-09 5 views
1

Я ищу способ, как это GDI код, чтобы получить растровый из контекста устройства ...Получить изображение/Картинку из контекста устройства или графический объект в gdiplus (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 + Objects. Но ни один из них не работал для меня еще, и я чувствую, что есть (легкий) другой способ сделать это с гораздо более удобной средой GDI +.

ответ

3

Вы можете использовать GDI + только для контекста устройства. Но вы можете использовать контекст устройства памяти, а затем обратить в постоянный или сохранить файл:

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

Кажется, это работает хорошо! Я только что узнал, что это все равно не сработает, если содержимое контекста устройства было нарисовано с использованием 32bpp-рендеринга. Но я спросил, что [отдельный вопрос] (http://stackoverflow.com/questions/33058788/how-to-get-a-32bpp-bitmap-image-from-a-gdi-device-context), спасибо за вклад. – Vinzenz

 Смежные вопросы

  • Нет связанных вопросов^_^