mogwai93
Messages postés362Date d'inscriptionmardi 31 décembre 2002StatutMembreDernière intervention 4 novembre 2023
-
25 avril 2009 à 09:40
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 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);
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
mogwai93
Messages postés362Date d'inscriptionmardi 31 décembre 2002StatutMembreDerniè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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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"....