Bmp file depuis hdc en pur api (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 9 837 fois - Téléchargée 754 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
26 sept. 2008 à 01:13
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
26 sept. 2007 à 12:56
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
2 juin 2005 à 17:00
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 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
2 juin 2005 à 16:38
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
2 juin 2005 à 16:25
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 :-(
Afficher les 11 commentaires

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.