Cum stiu cata memorie ocupa un CBitmap ?

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Cum stiu cata memorie ocupa un CBitmap ?

Post by mesajflaviu » 11 Jul 2013, 14:59

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 ?



User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum stiu cata memorie ocupa un CBitmap ?

Post by Marius Bancila » 12 Jul 2013, 14:16

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;
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum stiu cata memorie ocupa un CBitmap ?

Post by mesajflaviu » 18 Jul 2013, 10:01

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 ?

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Cum stiu cata memorie ocupa un CBitmap ?

Post by bu7ch3r » 19 Jul 2013, 10:30

mesajflaviu, eu ma astept ca o poza 50x200 sa aibe aceeasi dimensiune in memorie ca una de 200x50 sau 100x100. Nu ?
Cu stima,
Lupu Claudiu

mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Cum stiu cata memorie ocupa un CBitmap ?

Post by mesajflaviu » 19 Jul 2013, 15:07

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

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Cum stiu cata memorie ocupa un CBitmap ?

Post by Marius Bancila » 22 Jul 2013, 11:40

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.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

sabahat
Junior
Junior
Posts: 1
Joined: 06 Nov 2014, 15:16
Judet: Botoşani

Re: Cum stiu cata memorie ocupa un CBitmap ?

Post by sabahat » 06 Nov 2014, 15:17

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 ...
If you are looking for fast success in 700-501 exam exams then join today to explore complete ECCOUNCIL resources and pass Kyoto University on first try. A person can chose Youtube Best Wishes.

Post Reply