Bmp file depuis hdc en pur api (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 9 464 fois - Téléchargée 730 fois

Description

HdcToBmpFile(HDC hdc, char *pszflname) fait tout le travail.
Aucune dll externe necessaire.
CPP et EXE test(capture d'ecran) dans le zip.

Source / Exemple :


int __stdcall HdcToBmpFile(HDC hdc, char *pszflname)
{
  HDC memdc;
  HANDLE hfl;
  DWORD dwBytes, dwWidth, dwHeight, dwNumColors, dwBPP, ColorSize;
  void *pBits;
  HBITMAP hbmp;
  BITMAPFILEHEADER fileheader;
  BITMAPINFOHEADER infoheader;
  RGBQUAD colors[256];
  BITMAPINFO bmpinfo;
  HGDIOBJ hret;
  dwWidth = GetDeviceCaps(hdc, HORZRES);
  dwHeight = GetDeviceCaps(hdc, VERTRES);
  dwBPP = GetDeviceCaps(hdc, BITSPIXEL);
  if(dwBPP <= 8) dwNumColors = 256;
  else dwNumColors = 0;
  if(!(memdc = CreateCompatibleDC(hdc))) return 0;
  bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmpinfo.bmiHeader.biWidth = dwWidth;
  bmpinfo.bmiHeader.biHeight = dwHeight;
  bmpinfo.bmiHeader.biPlanes = 1;
  bmpinfo.bmiHeader.biBitCount = (WORD) dwBPP;
  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, dwWidth, dwHeight, hdc, 0, 0, SRCCOPY)) goto errato;
  if(dwNumColors) dwNumColors = GetDIBColorTable(memdc, 0, dwNumColors, colors);
  fileheader.bfType = 0x4D42;
  ColorSize = dwNumColors * sizeof(RGBQUAD);
  fileheader.bfSize = ((dwWidth*dwHeight*dwBPP) >> 3)+ColorSize+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
  fileheader.bfOffBits = ColorSize+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  infoheader.biSize = sizeof(BITMAPINFOHEADER);
  infoheader.biWidth = dwWidth;
  infoheader.biHeight = dwHeight;
  infoheader.biPlanes = 1;
  infoheader.biBitCount = (WORD) dwBPP;
  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, ColorSize, &dwBytes, 0);
  ColorSize = (dwWidth*dwHeight*dwBPP) >> 3;
  WriteFile(hfl, pBits, ColorSize, &dwBytes, 0);
  CloseHandle(hfl);
  DeleteObject(hbmp);
  DeleteDC(memdc);
  return 1;
errato:
  DeleteDC(memdc); return 0;
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

espritlune
Messages postés
3
Date d'inscription
vendredi 12 septembre 2008
Statut
Membre
Dernière intervention
21 mars 2009
-
Bonjour, Je suis tombé sur ce code qui me semble etre exactement ce que je cherche. Court et efficace, mais voila je ne suis pas tres doué et je commence le C... et pas vraiment le C++
- Mon premier problème pour compiler le Zip est de trouver les include a mettre. je pense les avoir trouvé mais je suis preneur pour pas en mettre deux tonne!
-Mon deuxieme probleme si on considere que mes include sont bonne est a la ligne 50 mon compilateur me dis que "pszflname pose un probleme... le quel... j'en ai aucune idée.
- et ma derniere question est que je ne n'ai pas trouvé la structure des type de variable car je ne cherche pas vraiment a cree un BMP mais d'utiliser directement les info (X,Y,R,G,B) pour une utilisation direct je suis sure que ce code a la solution mais mon niveau est trop faible alors si qqun veut bien m'en faire une petite explication de texte je suis preneur. k'ai deja cherché les fonction une a une dans msdn. j'avance mais un coup de pouce n'est pas de refus. Merci a tous!
forthomme
Messages postés
9
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
6 juillet 2006
-
Une excellente base qui a l'avantage de fonctionner sans MFC ou autre diablerie dépendante du compilateur...
bloobird0
Messages postés
30
Date d'inscription
vendredi 6 février 2004
Statut
Membre
Dernière intervention
23 octobre 2008
-
le GetWindowRect pour avoir un rect dont on tire la taille ne s'applique pas à mon cas car je ne veut sauvegarder que le contenu du dc qui ne fait qu'une petite partie de la fenêtre et non la fenêtre entière...

je continue à investiguer...
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16 -
Regarde ici si te convient mieux:
http://www.cppfrance.com/code.aspx?id=11133
bloobird0
Messages postés
30
Date d'inscription
vendredi 6 février 2004
Statut
Membre
Dernière intervention
23 octobre 2008
-
salut, pas mal du tout!

Le seul hic que je rencontre est que ca me sauve un bitmap ayant la taille de mon ecran et non la taille du hdc que je donne :-(

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.