Bonjour,

Voilà, j'essai de sauvegarder une BMP. J'ai trouvé ce code qui fonctionne dans la majorité des cas, mais sur certain PC, il ne marche pas.
Apparement, c'est GetDIBits qui ne fonctionne pas tout le temps. J'ai beau chercher, je n'arrive pas à trouver d'où peut venir le problème.

Est-ce que quelqu'un à déjà eu le problème ou avez-vous des pistes de réflexions ?

Voici le code qui me pose problème.

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
 
bool CPrinterRPG::SaveBitmap(HDC hDC,HBITMAP hBitmap,CString szPath)
{
  FILE * fp= NULL;
  fp = fopen(szPath.GetBuffer(1),"wb");
  if(fp == NULL)
      return false;
 
  BITMAP Bm;
  BITMAPINFO BitInfo;
  ZeroMemory(&BitInfo, sizeof(BITMAPINFO));
  BitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  BitInfo.bmiHeader.biBitCount = 0;
 
  if(!::GetDIBits(hDC, hBitmap, 0, 0, NULL, &BitInfo, DIB_RGB_COLORS))
      return (false);
 
  Bm.bmHeight = BitInfo.bmiHeader.biHeight;
  Bm.bmWidth  = BitInfo.bmiHeader.biWidth;
 
  BITMAPFILEHEADER    BmHdr;
 
  BmHdr.bfType        = 0x4d42;   // 'BM' WINDOWS_BITMAP_SIGNATURE
  BmHdr.bfSize        = (((3 * Bm.bmWidth + 3) & ~3) * Bm.bmHeight) 
                        + sizeof(BITMAPFILEHEADER) 
                        + sizeof(BITMAPINFOHEADER);
  BmHdr.bfReserved1   = BmHdr.bfReserved2 = 0;
  BmHdr.bfOffBits     = (DWORD) sizeof(BITMAPFILEHEADER) 
                        + sizeof(BITMAPINFOHEADER);
 
  BitInfo.bmiHeader.biCompression = 0;
 
  // Writing Bitmap File Header ////
  fwrite(&BmHdr,sizeof(BITMAPFILEHEADER),1,fp);
 
  fwrite(&BitInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
 
  BYTE *pData = new BYTE[BitInfo.bmiHeader.biSizeImage + 5];
  if(!::GetDIBits(hDC, hBitmap, 0, Bm.bmHeight, 
               pData, &BitInfo, DIB_RGB_COLORS))
      return (false);
 
  if(pData != NULL)
      fwrite(pData,1,BitInfo.bmiHeader.biSizeImage,fp);
 
  fclose(fp);
  delete (pData);
 
  return (true);
}
Merci d'avance