begin process at 2012 02 13 02:52:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

redimensionnement bitmap et mémoire occupée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

redimensionnement bitmap et mémoire occupée

samedi 25 avril 2009 à 09:40:07 | redimensionnement bitmap et mémoire occupée

mogwai93

Bonjour

J'ai une image bmp que je redimensionne avec StretchBlt
pour qu'elle s'affiche dans la zone de mon choix

or au niveau du gestionnaire des taches, je vois que la zone mémoire occupée correspond
à la taille mémoire du hbitmap avant redimensionnement
(j'ai essayé avec un bmp de 3Mo car plus facilement visible au niveau de la mémoire occupée
donc image de départ : 1024x1024 : environ 3-4Mo
et image de destination : 300x300 : environ 3-400ko)

je voudrais savoir s'il est possible de n'avoir en mémoire occupée que la taille de l'image destination (les 400ko au lieu des 4 Mo)
si oui , comment faire

(le redimensionnement et l'affichage fonctionnent correctement)

Merci


voici mon code de redimensionnement (copié sur une source de ce site)
SIZE GetBmpSize(HBITMAP hBmp)
{
    // récupération des informations sur le bitmap
    BITMAP bmpInfo;
    GetObject(hBmp, sizeof(bmpInfo), &bmpInfo);

    // taille
    SIZE size;
    size.cx = bmpInfo.bmWidth;
    size.cy = bmpInfo.bmHeight;
    return size;
}

HBITMAP RedimBmp(HBITMAP hBmpSrc)
{
    // taille du bitmap initial
    SIZE sizeSrc = GetBmpSize(hBmpSrc);
    SIZE sizeDst;

    // taille du bitmap destination
    sizeDst.cx = 300;
    sizeDst.cy = 300;

    //création de DCs compatibles et du bitmap de destination
    HDC hdc = GetDC(NULL);
    HDC hDCSrc = CreateCompatibleDC(hdc);
    HDC hDCDst = CreateCompatibleDC(hdc);
    HBITMAP hBmpDst = CreateCompatibleBitmap(hdc, sizeDst.cx, sizeDst.cy);

    // sélection des bitmaps dans les DCs (avec sauvegarde des anciens)
    HBITMAP hOldBmpSrc = (HBITMAP)SelectObject(hDCSrc, hBmpSrc);
    HBITMAP hOldBmpDst = (HBITMAP)SelectObject(hDCDst, hBmpDst);

    // recopie
    SetStretchBltMode(hDCDst, HALFTONE);
    StretchBlt(hDCDst, 0, 0, sizeDst.cx, sizeDst.cy, hDCSrc,
            0, 0,
            sizeSrc.cx, sizeSrc.cy, SRCCOPY);

    // sélection des anciens bitmaps dans les DCS
    SelectObject(hDCSrc, hOldBmpSrc);
    SelectObject(hDCDst, hOldBmpDst);

    // destruction des DCs
    DeleteDC(hDCSrc);
    DeleteDC(hDCDst);
    ReleaseDC(NULL, hdc);

    // retour
    return hBmpDst;
}
samedi 25 avril 2009 à 13:17:27 | Re : redimensionnement bitmap et mémoire occupée

vecchio56

Administrateur CodeS-SourceS
Tu es sur de bien lire la mémoire occupée?
Parce que si tu appelles CreateCompatibleBitmap avec une taille de 300*300, la mémoire occupée correspondera à cette taille.
_____________________________________
Un éditeur de ressources gratuit pour Windows

samedi 25 avril 2009 à 13:40:50 | Re : redimensionnement bitmap et mémoire occupée

mogwai93

"Tu es sur de bien lire la mémoire occupée?"
--> je parle de la valeur indiquée dans le gestionnaire des tâches
est-elle correcte ?
Il semble que oui, car elle évolue (montée et descente) en fonction des allocations ou désallocations mémoire
que je fais
Il n'y a que cette partie où la quantité de mémoire ne bouge pas (alors qu'elle devrait descendre dans mon cas)

"Parce que si tu appelles CreateCompatibleBitmap avec une taille de 300*300, la mémoire occupée correspondera à cette taille."
--> je suis d'accord
le bitmap en sortie à bien 300*300 en dimension
mais il semble que le bitmap d'origine soit toujours en mémoire

samedi 25 avril 2009 à 13:56:33 | Re : redimensionnement bitmap et mémoire occupée

vecchio56

Administrateur CodeS-SourceS
Si tu ne la libères pas, c'est sûr que la bitmap d'origine restera en mémoire.
Si tu veux libérer la mémoire, tu appelles DeleteObject avec la bitmap en paramètre.

_____________________________________
Un éditeur de ressources gratuit pour Windows

samedi 25 avril 2009 à 14:31:15 | Re : redimensionnement bitmap et mémoire occupée

mogwai93

ok, il manquait dans le code ci-dessus

mais le résultat est toujours le même :

    MessageBox(hwnd, "début", "info",64);                              
    hBitmap=(HBITMAP)LoadImage(GetModuleHandle(NULL), LPCTSTR(4000), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR|LR_DEFAULTSIZE);
    MessageBox(hwnd, "bitmap chargé", "info",64);                              
    DeleteObject (hBitmap);
    MessageBox(hwnd, "bitmap libéré", "info",64);
    if (hBitmap)
    {
          MessageBox (hwnd, "bitmap toujours en mémoire, "info", 64);
          hBitmap = RedimBmp(hBitmap);
    }
    else MessageBox (hwnd, "bitmap n'est pas en mémoire, "info", 64);
    MessageBox(hwnd, "fin", "info",64);


mon bitmap est bien chargé en mémoire :
à la 2eme messagebox, j'ai 3Mo de +  (ok)
à la 3ème, donc après le DeleteObject, je suis sensé me retrouver avec 3Mo de moins : eh bien non

pourtant le deleteobject a bien fait quelque chose, puisque hBitmap est égal à NULL juste après


samedi 25 avril 2009 à 15:50:49 | Re : redimensionnement bitmap et mémoire occupée

vecchio56

Administrateur CodeS-SourceS
DeleteObject prend des arguments par valeur, il ne peut donc pas modifier la valeur de la bitmap que tu lui passes en paramètres.
Donc déja ton test if(bitmap) n'est pas correct.

Par contre j'ai essayé ton programme et ce qui me semble bizarre c'est que je ne vois aucune variation d'utilisation de la mémoire suite au LoadImage() (et donc pas de diminution ensuite non plus...).
Par contre dans l'onglet "Performances" ou on voit l'utilisation globale de la mémoire, on voit bien que la mémoire augmente avec LoadImage et diminue avec DeleteObject.
Dans l'onglet "Processus", juste après le LoadImage j'ai une grande valeur dans "Util. max. mém.", mais toujours la même petite valeur dans "Util. mémoire"....

_____________________________________
Un éditeur de ressources gratuit pour Windows



Cette discussion est classée dans : hdc, size, bitmap, hbitmap, sizedst


Répondre à ce message

Sujets en rapport avec ce message

redimentionnement d'image, aidez-moi svp [ par sousou_one ] salut à tous,je veux construire une bitmap par copie d'une région d'une bitmap source, je dois prendre les nouvelles dimensions en sélectionnant la ré Probleme capture d'ecran [ par SnOOpss ] Bonjour j'ai un probleme pour faire des capture d'ecran !! Voila quelques truc ke j'ai essayé. HBITMAP capturehdc(HDC hdcScreen,int longueur,int larg [api]Plusieurs images dans un dcMem, ou plusieurs dcMem [ par hoGan ] Bonjour à tous,j'aimerais pouvoir afficher plusieurs images l'une à la suite de l'autre en cliquant plusieurs fois sur un bouton. Voici la façon dont pr d'objet GDI qui augmente, help [ par gege1024 ] CPaintDC hdc(this);HBITMAP bit;BITMAP bitmap;CRect rect;GetClientRect(&rect);  bit= (HBITMAP) LoadImage (NULL,fic_img_abs,IMAGE_BITMAP,0,0,LR_DEFAULTS HDC d'une BITMAP ? [ par unrealgun ] Bonjour, depuis quelques jours je cherche comment obtenir le HDC d'une bitmap. je sais pas si c'est possible. J'ai essayé GetDC(hbmp) puis GetPixel po Récupération des pixels d'un DC [ par hilairenicolas ] Bonjour,Je dispose d'un DC où je voudrais récuperer le tableau de byte correspondant aux pixels qui le composent.Je me suis fortement inspiré de la so redimensionnement image et qualité [ par mogwai93 ] Bonjour j'utilise la fonction ci-dessous  (copiee sur ce forum) pour redimensionner des bitmaps sauf que dans le cas de la reduction, l'image est de Bitmap et MFC [ par torNADoS ] Salut,je voudrais savoir comment puis je acceder au bits d'une image bitmap sous MFCsuuposons que j ai HBITMAP hBitmap//handlerCBitmap m_bmpBitmap//Im Probléme de compilation [ par makina0711 ] Bonjour a tous j'ai cette source pour ouvrire mon bmp mais a cette ligne il y a une ereure: DrawState(hdc,NULL,NULL,(long)hBmp,NULL,10,10,0,0,DST_BI affichage de jpeg avec API windows ? [ par Batman60 ] salut à tousest-il possible d'ouvrir et d'afficher un fichier jpeg à l'aide des fonctions de windowspour l'instant j'utilise le code ci-dessous pour b


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,883 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales