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