Hwnd to bmp file (2) (win32)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 321 fois - Téléchargée 33 fois

Contenu du snippet

Code de la fonction rectifie.
C'etait un 1er jet sans aucun soucis d'amelioration.
Exemple a ne jamais suivre, bouhhhhh.

Source / Exemple :


int __stdcall HwndToBmpFile(HWND hwnd, char *pszflname)
{
  HDC memdc, hdc;
  HANDLE hfl;
  DWORD dwBytes, dwNumColors;
  void *pBits;
  HBITMAP hbmp;
  BITMAPFILEHEADER fileheader;
  RGBQUAD colors[256];
  BITMAPINFO bmpinfo;
  HGDIOBJ hret;
  RECT rct;
  hdc = GetWindowDC(hwnd);
  if(!hdc) return 0;
  GetWindowRect(hwnd, &rct);
  rct.bottom -= rct.top;
  rct.right -= rct.left;
  rct.top = GetDeviceCaps(hdc, BITSPIXEL);
  if(rct.top <= 8) dwNumColors = 256;
  else dwNumColors = 0;
  if(!(memdc = CreateCompatibleDC(hdc))) goto relHwndDc;
  bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmpinfo.bmiHeader.biWidth = rct.right;
  bmpinfo.bmiHeader.biHeight = rct.bottom;
  bmpinfo.bmiHeader.biPlanes = 1;
  bmpinfo.bmiHeader.biBitCount = (WORD) rct.top;
  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, rct.right, rct.bottom, hdc, 0, 0, SRCCOPY)) goto errato;
  if(dwNumColors) dwNumColors = GetDIBColorTable(memdc, 0, dwNumColors, colors);
  fileheader.bfType = 0x4D42;
  rct.left = dwNumColors * sizeof(RGBQUAD);
  fileheader.bfSize = ((rct.right * rct.bottom * rct.top) >> 3) + rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
  fileheader.bfOffBits = rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  bmpinfo.bmiHeader.biClrImportant = 0;
  bmpinfo.bmiHeader.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, &bmpinfo.bmiHeader, sizeof(BITMAPINFOHEADER), &dwBytes, 0);
  if(!dwNumColors) WriteFile(hfl, colors, rct.left, &dwBytes, 0);
  WriteFile(hfl, pBits, (rct.right * rct.bottom * rct.top) >> 3, &dwBytes, 0);
  CloseHandle(hfl);
  DeleteObject(hbmp);
  DeleteDC(memdc);
  return 1;
errato:
  DeleteDC(memdc);
relHwndDc:
  ReleaseDC(hwnd, hdc); return 0;
}

A voir également

Ajouter un commentaire

Commentaires

samuelbrie
Messages postés
35
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
20 avril 2005
-
Tu ne dois pas donner le bon handle
martinbrochet
Messages postés
33
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
25 mai 2005
-
en ce qui me concerne n'arrivant pas à capturer une image depuis un stream video j'ai decide d'utiliser ton code de capture d'ecran oui c'est pas tres propre mais bon le probleme c'est que je récupère une image noire

une idée pourquoi ??
samuelbrie
Messages postés
35
Date d'inscription
lundi 4 octobre 2004
Statut
Membre
Dernière intervention
20 avril 2005
-
Merci beaucoup pour ton aide, j'ai réussit avec ton code. Je suis désolé de t'avoir dérangé, mais tu m'as sauvé mon projet

Allez en plus je te mets un 10/10

Mon code
PImageb = (unsigned char*) malloc((rct.right * rct.bottom * rct.top) >> 3);
if(Fichier.Open("c:\\toto.bmp",CFile::modeWrite|CFile::modeCreate))
{ Fichier.Write(&fileheader,sizeof(BITMAPFILEHEADER));
Fichier.Write(&bmpinfo.bmiHeader,sizeof(BITMAPINFOHEADER));
PImageb=(unsigned char)pBits;
Fichier.Write(PImageb,(rct.right * rct.bottom * rct.top) >> 3);
Fichier.Close();
}
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Passe en message prive une adresse mail, je t'envoie un mini prog de test qui modifie les valeurs de pBits, tu verras qu'on y accede come on veut. Je les replace direct dans pBits mais on pourrait aussi bien les mettre dans un autre tableau, serait idem. J'enregistre donc une image modifiee.
Apres ça faudra t'arranger car j'ai vraiment peu de temps dispo en ce moment.

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.