Bonjour à tous...
Cela fait un bout de temps maintenant que je me débat avec ça. 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 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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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);
   
   ReleaseDC(hWndWindow,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;
}