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;
}