Redimensionnement bitmap et mémoire occupée

mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023 - 25 avril 2009 à 09:40
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 25 avril 2009 à 15:50
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;
}

5 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
25 avril 2009 à 13:17
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
0
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
25 avril 2009 à 13:40
"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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
25 avril 2009 à 13:56
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
0
mogwai93 Messages postés 362 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 4 novembre 2023
25 avril 2009 à 14:31
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
25 avril 2009 à 15:50
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
0
Rejoignez-nous