2015-10-09 5 views
1

Je suis à la recherche d'un moyen comment ce code GDI pour obtenir une image bitmap à partir d'un contexte de périphérique ...Obtenez une image/Bitmap dans un contexte de périphérique ou objet graphique dans 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(); 
} 

. ..peut être fait en GDI + pour recevoir une image GDI + ou Bitmap.

Je cherche une façon de le faire à proximité de ce projet:

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.?????? 
} 

Je n'ai vu le code impliquant des objets GDI et des ressources qui se converti plus tard GDI + objets. Mais aucun d'entre eux n'a encore fonctionné pour moi et je pense qu'il y a une autre façon (facile) de le faire avec l'environnement GDI + beaucoup plus confortable.

Répondre

3

Vous pouvez uniquement dessiner GDI + au contexte de périphérique. Mais vous pouvez utiliser le contexte de dispositif de mémoire, puis attirer dc ou enregistrer le fichier:

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

maintenant attirer dc

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

ou utiliser CImage pour sauver memdc dans un fichier

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

Cela semble bien fonctionner! Je viens de découvrir que cela ne fonctionnerait toujours pas si le contenu du contexte de l'appareil était dessiné en utilisant le rendu 32bpp. Mais j'ai demandé que dans une [question séparée] (http://stackoverflow.com/questions/33058788/how-to-get-a-32bpp-bitmap-image-from-a-gdi-device-context), merci pour la contribution. – Vinzenz