Page 1 of 1

Cum stiu cata memorie ocupa un CBitmap ?

Posted: 11 Jul 2013, 14:59
by mesajflaviu
Am codul urmator:

Code: Select all

	if(m_Bitmap.GetSafeHandle())
		m_Bitmap.DeleteObject();
	HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, lpszPathName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	m_Bitmap.Attach(hBitmap);
unde m_Bitmap este:

Code: Select all

protected:
	CBitmap m_Bitmap;
as putea stii cata memorie ocupa m_Bitmap ?
Am observat ceva: cand incarc bitmap-uri "nesimtit" de mari (9000X9000), desenarea la zoom-uri mari nu se mai face in mod stretch COLORONCOLOR, doar in mod HALFTONE, iar in acest mod desenarea e mai lenta ...

Dimensiunea bitmap-ului o pot afla simplu:

Code: Select all

	BITMAP bm;
	m_Bitmap.GetBitmap(&bm);
iar bm.bmWidth si bm.bmHeight imi spun cat are bitmap-ul, dar nu stiu daca asta ar fi un criteriu bun, plus ca un bitmap poate fi ingust (adica 1200X9000), etc. ...
se poate stii cata memorie ocupa un bitmap, ca apoi sa iau decizii cum fac desenarea ?

Re: Cum stiu cata memorie ocupa un CBitmap ?

Posted: 12 Jul 2013, 14:16
by Marius Bancila
Ca sa-ti raspund pe scurt, m_bitmap ocupa sizeof(m_bitmap) bytes.

Cred ca pe tine te intereseaza cata memorie ocupa datele imaginii reprezentate de m_bitmap-ul sau hbitmap-ul tau. Uita-te la BITMAPINFOHEADER. Uite si aici un exemplu aici.

Code: Select all

GetObject(hbmScreen,sizeof(BITMAP),&bmpScreen);
     
    BITMAPFILEHEADER   bmfHeader;    
    BITMAPINFOHEADER   bi;
     
    bi.biSize = sizeof(BITMAPINFOHEADER);    
    bi.biWidth = bmpScreen.bmWidth;    
    bi.biHeight = bmpScreen.bmHeight;  
    bi.biPlanes = 1;    
    bi.biBitCount = 32;    
    bi.biCompression = BI_RGB;    
    bi.biSizeImage = 0;  
    bi.biXPelsPerMeter = 0;    
    bi.biYPelsPerMeter = 0;    
    bi.biClrUsed = 0;    
    bi.biClrImportant = 0;

    DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

Re: Cum stiu cata memorie ocupa un CBitmap ?

Posted: 18 Jul 2013, 10:01
by mesajflaviu
Multumesc mult pentru raspuns. [Ca paranteza, nu este functional al doilea link] Functioneaza exemplul din post, insa as avea o mica inrebare: dwBmpSize contine numarul de bytes ocupat de hbmpScreen ?

Re: Cum stiu cata memorie ocupa un CBitmap ?

Posted: 19 Jul 2013, 10:30
by bu7ch3r
mesajflaviu, eu ma astept ca o poza 50x200 sa aibe aceeasi dimensiune in memorie ca una de 200x50 sau 100x100. Nu ?

Re: Cum stiu cata memorie ocupa un CBitmap ?

Posted: 19 Jul 2013, 15:07
by mesajflaviu
bu7ch3r wrote:mesajflaviu, eu ma astept ca o poza 50x200 sa aibe aceeasi dimensiune in memorie ca una de 200x50 sau 100x100. Nu ?
Nu stiu ce sa zic ... pentru ca o poza alb / negru, pe 8 biti, ocupa mai putina memorie decat o poza cu aceeasi dimensiune, dar color si pe 32 biti ...

Re: Cum stiu cata memorie ocupa un CBitmap ?

Posted: 22 Jul 2013, 11:40
by Marius Bancila
bu7ch3r wrote:mesajflaviu, eu ma astept ca o poza 50x200 sa aibe aceeasi dimensiune in memorie ca una de 200x50 sau 100x100. Nu ?
Tu poti sa te astepti dar nu inseamna ca si e asa :). Uite aici un articol Top-Down vs. Bottom-Up DIBs care explica modul de aranjare a bitmapurilor poate exista padding, ceea ce inseamna ca doua imagini de dimensiuni diferite (chiar daca cu acelasi numar de pixeli efectivi si acelasi numar de biti per pixel) pot necesita cantitati de memorie diferite.

Re: Cum stiu cata memorie ocupa un CBitmap ?

Posted: 06 Nov 2014, 15:17
by sabahat
Am vrut sa atasez de lista dropdown un tooltip control, pentru asta mi-ar fi trebuit o clasa de sine statatoare CMyListBox ... si poate si as fi pus pe acolo si alte lucruri ... sa vad ce pot face ...