Bonsoir, ou bonjour à tous...
Cette nuit, un problème m'empêche de trouver le sommeil. Il s'agit d'un petit bout de code destiné à prendre un screenshot et à l'enregistrer au format jpg sur le disque grace à la lib FreeImage.
Le code fonctionne trés bien (il vient d'ailleur d'une source du site) mais pour les besoins de mon programme je dois boucler l'opération indéfiniment. Et là aprés 10 secondes de while(1), le programme gonfle en ram pour arriver à dépasser le Go et finir par occuper toute la mémoire... Je libère pourtant la mémoire au niveau des HDC, HBITMAP et variables FreeImage mais le problème persiste.
Je ne connais pas bien le principe des DC win32, etc.. C'est sans doute une erreur bête, mais je ne vois pas...
Si vous voulez jeter un oeil au vilain code...
merci d'avance.
PS : pour transformer un HBITMAP en variable FreeImage (FIBITMAP), je me suis servi de cet exemple que j'ai épurer (peut être trop!)
http://freeimage.sourceforge.net/faq.html
#include <windows.h>
#include "FreeImage.h"
void takeScreenShot(const char *path)
{
// Récupération des dimensions du bureau :
int ScreenX = GetSystemMetrics(SM_CXSCREEN);
int ScreenY = GetSystemMetrics(SM_CYSCREEN);
// Récupération du HWND et du HDC du bureau :
HWND hWndWindow = GetDesktopWindow();
HDC hDcWindow = GetWindowDC(hWndWindow);
// Récupération du nombre de couleurs :
int nColors = GetDeviceCaps(hDcWindow, BITSPIXEL);
// Création d'un contexte mémoire
HDC m_hDcBitmap = CreateCompatibleDC(hDcWindow);
// On crée un bitmap en mémoire ayant les dimensions du bureau
HBITMAP hbmp = CreateCompatibleBitmap(hDcWindow, ScreenX, ScreenY);
// On sélectionne ce bitmap dans le contexte mémoire :
SelectObject(m_hDcBitmap, hbmp);
// copie du contexte écran vers le contexte mémoire :
BitBlt(m_hDcBitmap, 0, 0, ScreenX, ScreenY, hDcWindow, 0, 0, SRCCOPY);
DeleteDC(hDcWindow);
// Initialisation du FIBITMAP :
FreeImage_Initialise(true);
FIBITMAP *dib = FreeImage_Allocate(ScreenX, ScreenY, nColors);
// Copie du Hbitmap dans FIBITMAP :
GetDIBits(m_hDcBitmap, hbmp, 0, ScreenY ,FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);
DeleteObject(hbmp);
DeleteDC(m_hDcBitmap);
// conversion 24 (ou 8 Grayscale) obligatoire pour conversion JPEG
dib = FreeImage_ConvertTo24Bits(dib);
FreeImage_Save(FIF_JPEG, dib, path, 75);
FreeImage_Unload(dib);
FreeImage_DeInitialise();
}
int main()
{
while (1)takeScreenShot("test.jpg");
return 0;
}