Bitmap

Messages postés
246
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
5 août 2004
- - Dernière réponse : sebastienbro
Messages postés
246
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
5 août 2004
- 14 avril 2004 à 21:38
Bonjour à tous !

Voilà, en fait, je cherche à enregistrer un bitmap à partir d'un HDC ! En fait ça n'est pas pour l'enregistrer mais pour le compresser!

Voici donc mon code qui marche très bien, sauf à un endroit, à savoir la fonction GetDIBits. J'ai lu dans MSDN que pour que cette fonction réussise, il faut que le HBITMAP ne soit associé à aucun object : problème ! Comment faire pour désassocié ce HBITMAP ?

Voici mon code :

Code:


int WINAPI AddUserWithHDC(char *UserName, HDC hdc, int Width, int Height) 
{ 

   HBITMAP hbmp; 
   BITMAP bmp; 
   PBITMAPINFO pbmi; 
   PBITMAPINFOHEADER pbih; 
   BITMAPFILEHEADER hdr; 
   LPBYTE buffer = NULL; 
   WORD cClrBits; 
   HDC hdc2; 

   FILE *test; 

   LPBYTE bitmap = NULL; 
       if ((UserName NULL) || (hdc NULL) || (hFile == NULL)) 
      return INVALID_PARAM_OR_FILE_NOT_OPEN; 

   if ((Width != 64) || (Height != 64)) 
      return INVALID_PARAM; 

   if (avatar_offset(UserName) > 0) 
      return USER_ALREADY_EXISTS; 

    
   if (! (hbmp = CreateCompatibleBitmap(hdc, Width, Width))) 
      return UNKNOW_ERROR; 

   if (! GetObject(hbmp, sizeof(BITMAP), &bmp)) 
   { 

      DeleteObject(hbmp); 
      return UNKNOW_ERROR; 

   } 

   hdc2 = CreateCompatibleDC(hdc); 

   DeleteDC(hdc); 
    
   cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel); 
    if (cClrBits == 1) 
        cClrBits = 1; 
    else if (cClrBits <= 4) 
        cClrBits = 4; 
    else if (cClrBits <= 8) 
        cClrBits = 8; 
    else if (cClrBits <= 16) 
        cClrBits = 16; 
    else if (cClrBits <= 24) 
        cClrBits = 24; 
    else cClrBits = 32; 
    
   if (cClrBits != 24) 
         pbmi = (PBITMAPINFO) malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits)); 

     else 
         pbmi = (PBITMAPINFO) malloc(sizeof(BITMAPINFOHEADER)); 

   pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    pbmi->bmiHeader.biWidth = bmp.bmWidth; 
    pbmi->bmiHeader.biHeight = bmp.bmHeight; 
    pbmi->bmiHeader.biPlanes = bmp.bmPlanes; 
    pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel; 
   pbmi->bmiHeader.biXPelsPerMeter = 0; 
   pbmi->bmiHeader.biYPelsPerMeter = 0; 

    if (cClrBits < 24) 
        pbmi->bmiHeader.biClrUsed = (1<<cClrBits); 

    pbmi->bmiHeader.biCompression = BI_RGB; 

    /*pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) /8 
                                  * pbmi->bmiHeader.biHeight * cClrBits; */ 

   GetDIBits(hdc2, hbmp, 0, 64, NULL, pbmi, DIB_RGB_COLORS); 

    pbmi->bmiHeader.biClrImportant = 0; 
   pbmi->bmiHeader.biClrUsed = 0; 

   pbih = (PBITMAPINFOHEADER) pbmi;    
   buffer = (LPBYTE) malloc(pbih->biSizeImage); 
    
   if (! buffer) 
   { 

      DeleteObject(hbmp); 
      return UNKNOW_ERROR; 

   } 

   problème ici! 
            if (! GetDIBits(hdc2, hbmp, 0, (WORD) pbih->biHeight, (void *)buffer, pbmi, 
        DIB_RGB_COLORS))) 
    { 
        DeleteObject(hbmp); 
      return UNKNOW_ERROR; 
    } 

   hdr.bfType = 0x4d42; 
    hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + 
                 pbih->biSize + (pbih->biClrUsed * sizeof(RGBQUAD)) + pbih->biSizeImage); 
    hdr.bfReserved1 = 0; 
    hdr.bfReserved2 = 0; 

    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + 
                    pbih->biSize + pbih->biClrUsed 
                    * sizeof (RGBQUAD); 

   bitmap = (LPBYTE) malloc(sizeof(BITMAPFILEHEADER) + (sizeof(BITMAPINFOHEADER) 
                  + pbih->biClrUsed * sizeof (RGBQUAD)) + pbih->biSizeImage); 

   memcpy((void *)bitmap, (void *)&hdr, sizeof(BITMAPFILEHEADER)); 

   memcpy((void *)(bitmap + sizeof(BITMAPFILEHEADER)), (void *) pbih, (sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD)) ); 

   memcpy((void *)(bitmap + hdr.bfOffBits), (void *) buffer, pbih->biSizeImage); 

   free(buffer); 
   free(bitmap); 

   DeleteObject(hbmp); 
      
   return NO_ERROR; 

} 



En fait, la fonction GetDIBits marche, mais elle retourne dans le buffer que des 0 et aucune image !

S'il vous plait aidez moi parceque j'ai essayé pas mal de chose mais rien y fait !

Merci d'avance !

Bye

Seb

\* -- Seb [[mailto:seb_winux@hotmail.com Mail]] [Web] -- */
Afficher la suite 

2 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
0
Merci
ton pb vient de la récupération du HBITMAP :
if (! (hbmp = CreateCompatibleBitmap(hdc, Width, Width)))
return UNKNOW_ERROR;

ca ce fait que créer un bitmap vide.

ce qu'il fauf faire :
HDC hBmpDC = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, width, height);
HBITMP hOldBmp = SelectObject(hMemDC, hBmp);
BitBlt(hBmpDC, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
SelectObject(hBmpDC, hOldBmp);
DeleteDC(hBmpDC);
Commenter la réponse de ymca2003
Messages postés
246
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
5 août 2004
0
Merci
Oh merci beaucoup !!! Ca marche maintenant !

Je croyait à tord que CreateCompatibleBitmap créait un bitmap qui correspondait au bitmap qui était sur le HDC !

Merci encore !

Bye

\* -- Seb [[mailto:seb_winux@hotmail.com Mail]] [Web] -- */
Commenter la réponse de sebastienbro