Desenare + salvare imagine (MFC)

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
Dan027
Junior
Junior
Posts: 2
Joined: 29 Aug 2015, 15:08
Judet: Braşov

Desenare + salvare imagine (MFC)

Post by Dan027 » 30 Aug 2015, 15:35

Cum as putea sa desenez ceva (fara sa imi apara in fereastra) si sa salvez imaginea dupa?
Eu am gasit o solutie dar imi deseneaza si in fereastra aplicatiei, iar daca redimensionez aiurea fereastra nu ies ok imaginile, mie practic imi face un fel de print screen :?
Orice sugestii sunt binevenite! :biggrin:

void CPict::SaveImage(std::string *path)
{
CPaintDC dc(this); // device context for painting

CRect drawingArea;

GetClientRect(&drawingArea);

int height = drawingArea.Height();
int width = drawingArea.Width();

// ...
// - aici se deseneaza efectiv imaginea
// ...

//create a memory dc
CDC memDC;
memDC.CreateCompatibleDC(&dc);

//Create a memory bitmap
CBitmap newbmp;
newbmp.CreateCompatibleBitmap(&dc, width, height);

//select the bitmap in the memory dc
CBitmap *pOldBitmap = memDC.SelectObject(&newbmp);

//blit from screen into memory dc
memDC.BitBlt(0, 0, width, height, &dc, 0, 0, SRCCOPY);

//select old bitmap back into the memory dc
memDC.SelectObject(pOldBitmap);

//release the Display DC
ReleaseDC(&dc);

CImage img;
img.Attach((HBITMAP)newbmp.Detach());
std::string img = *path + ".png";

img.Save(img.c_str(), Gdiplus::ImageFormatPNG);
}



Viorel
Microsoft MVP
Microsoft MVP
Posts: 290
Joined: 13 Jul 2007, 12:26

Re: Desenare + salvare imagine (MFC)

Post by Viorel » 30 Aug 2015, 17:23

Cred că ar trebui să reorganizezi codul: să folosești CClientDC în loc de CPaintDC, să ștergi linia ReleaseDC, să ștergi linia BitBlt și să o înlocuiești cu fragmentul de desenare, dar să folosești memDC în loc de dc.

Dacă folosești GDI+, se mai poate încerca clasa Graphics creată cu Graphics::FromImage. Imaginea de tip Bitmap poate fi creată cu un constructor care acceptă dimensiunea și PixelFormat. Apoi folosești funcții de desenare oferite de clasa Graphics. Apoi execuți funcția Save a imaginii.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Desenare + salvare imagine (MFC)

Post by Ovidiu Cucu » 30 Aug 2015, 19:49

Daca inteleg eu bine, vrei sa desenezi o imgine intr-un memory DC si apoi sa o salvezi intr-un fisier.
Daca da si daca oricum folosesti clasa CImage, nu trebuie sa te mai chinui jongland direct cu functii GDI pentru a crea un memory DC cu bitmap-ul de rigoare selectat. CImage are deja metodele lui care fac acelasi lucru.
Exemplu:

Code: Select all

HRESULT CFoo::DrawAndSaveImage(LPCTSTR pszFileName)
{
    // NOTE: hard-coded values for demo purpose
    const int nWidth        = 300;                  // image width
    const int nHeight       = 150;                  // image height
    const int nBPP          = 32;                   // bits per pixel
    const COLORREF crBack   = RGB(128, 255, 255);   // background color

    CImage image;
    VERIFY(image.Create(nWidth, nHeight, nBPP));
    CDC* pDC = CDC::FromHandle(image.GetDC());
    ASSERT_VALID(pDC);
    const int nSavedDC = pDC->SaveDC();
    pDC->FillSolidRect(0, 0, nWidth, nHeight, crBack);
    // ...
    // draw here what your muscles want...
    // ...
    pDC->RestoreDC(nSavedDC);
    image.ReleaseDC();

    return image.Save(pszFileName);
}

Dan027
Junior
Junior
Posts: 2
Joined: 29 Aug 2015, 15:08
Judet: Braşov

Re: Desenare + salvare imagine (MFC)

Post by Dan027 » 03 Sep 2015, 14:58

Mersi, Ovidiu, este exact ceea ce cautam :D

Post Reply