Bonjour à tous,

J'ai un code qui me permet de faire un screenshoot de mon ecran, le problème est qu'il suavegarde l'image dans un fichier BMP en 32 bits alors que je le voudrais en 24 bits ...

voici le code :
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
int hwnd_to_bmp(HWND hwnd, char *pszflname)
{
  HDC memdc;
  HANDLE hfl;
  DWORD dwBytes, dwNumColors;
  void *pBits;
  HBITMAP hbmp;
  BITMAPFILEHEADER fileheader;
  BITMAPINFOHEADER infoheader;
  RGBQUAD colors[256];
  BITMAPINFO bmpinfo;
  HGDIOBJ hret;
  RECT rct;

  HDC hdc = GetDC(hwnd);

  GetWindowRect(hwnd, &rct);
  rct.bottom -= rct.top + 579;			
  rct.right -= rct.left + 774;			
  rct.top = GetDeviceCaps(hdc, BITSPIXEL);
  if(rct.top <= 8)
    dwNumColors = 256;
  else
    dwNumColors = 0;
  if(!(memdc = CreateCompatibleDC(hdc)))
    goto relHwndDc;

  bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmpinfo.bmiHeader.biWidth = rct.right;
  bmpinfo.bmiHeader.biHeight = rct.bottom;
  bmpinfo.bmiHeader.biPlanes = 1;
  bmpinfo.bmiHeader.biBitCount = (WORD) rct.top;
  bmpinfo.bmiHeader.biCompression = BI_RGB;
  bmpinfo.bmiHeader.biSizeImage = 0;
  bmpinfo.bmiHeader.biXPelsPerMeter = 0;
  bmpinfo.bmiHeader.biYPelsPerMeter = 0;
  bmpinfo.bmiHeader.biClrUsed = dwNumColors;
  bmpinfo.bmiHeader.biClrImportant = dwNumColors;
  hbmp = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);

  if(!hbmp) goto errato;
  hret = SelectObject(memdc, hbmp);
  if(!hret || (hret == HGDI_ERROR)) goto errato;

  if(!BitBlt(memdc, 0, 0, rct.right, rct.bottom, hdc, 558, 126, SRCCOPY)) goto errato;
  
  if(dwNumColors)
    dwNumColors = GetDIBColorTable(memdc, 0, dwNumColors, colors);

  fileheader.bfType = 0x4D42;
  rct.left = dwNumColors * sizeof(RGBQUAD);
  fileheader.bfSize = ((rct.right * rct.bottom * rct.top) >> 3) + rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
  fileheader.bfOffBits = rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  infoheader.biSize = sizeof(BITMAPINFOHEADER);
  infoheader.biWidth = rct.right;
  infoheader.biHeight = rct.bottom;
  infoheader.biPlanes = 1;
  infoheader.biBitCount = (WORD) rct.top;
  infoheader.biCompression = BI_RGB;
  infoheader.biSizeImage = infoheader.biClrImportant = 0;
  infoheader.biXPelsPerMeter = infoheader.biYPelsPerMeter = 0;
  infoheader.biClrUsed = dwNumColors;

  hfl = CreateFile(pszflname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

  if (hfl == INVALID_HANDLE_VALUE) {DeleteObject(hbmp); goto errato;}

  WriteFile(hfl, &fileheader, sizeof(BITMAPFILEHEADER), &dwBytes, 0);
  WriteFile(hfl, &infoheader, sizeof(BITMAPINFOHEADER), &dwBytes, 0);
  if(!dwNumColors)
    WriteFile(hfl, colors, rct.left, &dwBytes, 0);
  WriteFile(hfl, pBits, (rct.right * rct.bottom * rct.top) >> 3, &dwBytes, 0);
  CloseHandle(hfl);
  DeleteObject(hbmp);
  DeleteDC(memdc);
  return 1;

  errato:
  DeleteDC(memdc);
  relHwndDc:
  ReleaseDC(hwnd, hdc); return 0;
}
je pense que le probleme vient des lignes suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
rct.top = GetDeviceCaps(hdc, BITSPIXEL);
.....
bmpinfo.bmiHeader.biBitCount = (WORD) rct.top;
Je pense qu'il faudrait changer rct.top, puisque dans le code il prend la config de l'image avec GetDeviceCaps et y mettre la bonne valeur pour avoir un bmp en 24 bits.

Merci d'avance pour votre aide!!