begin process at 2012 02 10 11:55:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Bitmap


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Bitmap

mercredi 14 avril 2004 à 14:02:09 | Bitmap

sebastienbro

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 [Mail] [Web] -- */
mercredi 14 avril 2004 à 19:58:12 | Re : Bitmap

ymca2003


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);
mercredi 14 avril 2004 à 21:38:38 | Re : Bitmap

sebastienbro

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 [Mail] [Web] -- */


Cette discussion est classée dans : bmiheader, bitmap, pbmi, pbih, sizeof


Répondre à ce message

Sujets en rapport avec ce message

Récupération des pixels d'une fenêtre cachée [ par sebcmoa ] Bonjour, Je vous expose mon problème : - J'utilise la fonction glReadPixels sur une fenêtre invisible. Cela me retourne bien les données...mais problè Image Bitmap langage C [ par buguetj ] Bonjour, je suis actuellement en train de faire des manipulation sur des fichiers bitmap en langage C. J'utilise les api fournies par windows. Je cher Convertir image jpeg en niveaux de gris [ par nicop93 ] Bonjour, je réalise une application mobile pour un smartphone (windows mobile 6) qui va devoir lire des code-barres. J'utilise des boites de dialogue bonjour j'ai un problème dans un code ping implémenter avec le c++, que je n'arrive pas à résoudre. s'il vous plait aider moi. Merci d'avance. [ par talelham ] bonjour j'ai un problème dans un code ping implémenter avec le c++, que je n'arrive pas à résoudre. s'il vous plait aider moi. Merci d'avance. voilà Problème avec la fonction fseek [ par Vikeo ] Bonjour à tous, Je me résouds à poster ce message car je ne trouve décidemment pas la solution à mon problème, je vous explique : Lorsque l'on souha crypter avec AES une image de type bitmap en utilsant le language c [ par ami2008 ] Salut,je veux quelqu'un m'aider à chercher un code ou le principe pour crypter avec AES une image de type BITMAP en utilisant le language c... ecrire mdp sesion telnet [ par Max77240 ] Bonjour à tous, Je travail avec visualc++ 2008 et les windows form. Sur ma form, j'ai un bouton permettant d'ouvrir une session telnet sur un switch, récupérer le contenu d'un fichier bitmap dans une matrice [ par ibrsoft ] salut tous je veux récupérer le contenu d'un fichier bitmap dans une matrice comment je doit procéder exemple: le fichier 1.bmp représente le chiffre


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,026 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales