begin process at 2012 02 08 21:08:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > BMP FILE DEPUIS HDC EN PUR API (WIN32)

BMP FILE DEPUIS HDC EN PUR API (WIN32)


 Information sur la source

Note :
8 / 10 - par 7 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :bitmap, bmp, hdc, capture, écran Niveau :Débutant Date de création :27/07/2003 Date de mise à jour :27/07/2003 14:06:55 Vu / téléchargé :7 574 / 627

Auteur : BruNews

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 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

  • 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;
  • }
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;
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64)
Source avec Zip Source avec une capture FIND TEXT (WIN64)
Source avec Zip DELETE DIRECTORY (WIN64)
Source avec Zip ENUM DIRECTORY (WIN64)
Source avec Zip TEMPLATES C/C++ POUR VS 2010

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [C, WIN32/LINUX] LIB POUR TRAVAILLER DES IMAGES BITMAPS par katsankat
Source avec Zip CAPTURE D'ÉCRAN/RÉDUCTION DES COULEURS/ENREGISTREMENT BITMAP... par cali70
Source avec Zip Source avec une capture MULTI DESKTOPS par AndreJAO
Source avec Zip Source avec une capture Source .NET (Dotnet) CAPTURE DE L'IMAGE DE LA WEBCAM par florian15
Source avec Zip Source avec une capture IMPRIMEUR D'IMAGES BMP (API) par racpp

Commentaires et avis

Commentaire de BlackWizzard le 28/07/2003 20:46:21 administrateur CS

genial :)

Commentaire de JCpp le 31/08/2003 17:42:58

Oui, vraiment génial.
Le BMP prend beaucoup de place, je voudrai diminuer le nombre de couleur où la résolution, où carrément passer en JPG, GIF, TGA, etc.

J'ai modifié cette ligne :
if(dwBPP &lt;= 8) dwNumColors = 256; else dwNumColors = 0;

par dwNumColors = 16; or dwNumColors = 8;
Et je ne constate aucun changement

J'ai essayé aussi essayé de remplacer :
infoheader.biCompression = BI_RGB;
avec BI_RGB, BI_RLE8, BI_RLE4, BI_BITFIELDS
Et je constate que ça ne fonctionne pas

bmfh.bfType = 0x4d42;
Je pence que c'est pour indiquer un fichier BMP,
donc peut ton diminuer la résolution par là ?  

Bref, je cherche un moyen pour avoir un petit fichier
Merci,

Commentaire de BruNews le 31/08/2003 17:54:41 administrateur CS

C'est a toi d'effectuer la compression RLE et ensuite tu renseignes le champ.

Commentaire de olecossois le 10/08/2004 00:18:44

Trop fort, je prends, je cherche ça depuis un moment, et je ne trouvais rien, merci vraiment ça marche bien.

Commentaire de entracyte le 06/11/2004 00:07:28

Bonjour, j'utilise ta source pour faire un prog a la vnc mais en programmation hybride, vb sert au transfert, et une dll cpp sert a la recupération puis a l'encodage en jpg de l'image. Mais pour optimiser la bande passante, j'aimerai decouper mon bmp du debut en une centaine de petite images et faire un test par rapport aux ancienne images pour savoir si elles ont changé !
Il me faudra donc decouper puis ensuite recoller l'image, mais mes connaissances sur les images sont surtout en basic et pas en cpp, ça me bloque, alors si quelqu'un a une solution simple,  qui recupere par exemple qu'une petite partie de l'ecran ce serai deja pas mal.
Merci d'avance et si ça vous embete trop, vous faites pas chier !

Commentaire de entracyte le 06/11/2004 00:16:34

Bon,je crois que je vais l'ouvrir, puis recupere certaine partie, puis reconstruire les headers, etc...

Commentaire de bloobird0 le 02/06/2005 16:25:59

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 :-(

Commentaire de BruNews le 02/06/2005 16:38:06 administrateur CS

Regarde ici si te convient mieux:
http://www.cppfrance.com/code.aspx?id=11133

Commentaire de bloobird0 le 02/06/2005 17:00:09

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...

Commentaire de forthomme le 26/09/2007 12:56:45 9/10

Une excellente base qui a l'avantage de fonctionner sans MFC ou autre diablerie dépendante du compilateur...

Commentaire de espritlune le 26/09/2008 01:13:15 9/10

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!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Modification de fichier BMP [ par titio ] Bonjour,Je souhaite afficher des images bmp, tout en ayant la possibilit&#233; de modifier ce fichier. Pour cela, je le charge en memoire, et souhaite Hwnd [ par T_Mehdi ] salut a tous .bon j'ai realiser une fonction qui permet douvrir des fichier bmp et les affichier sur un hwnd preci.le prob est que quand je reduit ou Pixel vide [ par sabran ] Salut, Je veux lire la valeur RGB d'un pixel avec GetDIBits. J'ai pris un code que j'ai vu plusieurs fois sur le forum. Tout marche sauf quand je veux Redimensionnement image Borland C++ [ par jfouquet ] Bonjour, Je travaille actuellement sous Borland C++ 5. Je suis amen&#233; &#224; afficher une image (jpeg,bmp,ico&#133;) dans un TImage bon &#231;a need help_API - debutant. [ par JimyRyan ] j'ai cree un progamme qui affiche une image (stoquee dans un fichier .bmp), et une phrase (lu a partir d'un fichier TXT), j'ai deux problemes : une fo Mes bitmap se barrent [ par oceax ] Salut !Voila j'ai fais une boite de dialogue en Win32 et j'ai ins&#233;r&#233; une bmp &#224; l'aide de LoadBitmap() et pis DrawState(). Ma bitmap s'a Convertion d'un bitmap 8 bits en un bitmal 24 bits [ par SauCisS ] Bonjour, J'ai parcouru ce forum pour chercher ma r&#233;ponse, mais sans succ&#232;s. Alors voici mon probl&#232;me : Comment &#224; partir d'une redimentionnement d'image, aidez-moi svp [ par sousou_one ] salut &#224; tous,je veux construire une bitmap par copie d'une r&#233;gion d'une bitmap source, je dois prendre les nouvelles dimensions en s&#233;le Capture écran dans le menu contextuel [ par lunnatick ] Bonjour &#224; tous, je recherche un logiciel de capture d&#146;&#233;cran (gratuit de pr&#233;f&#233;rence) qui ajoute dans le menu contextuel de Win HBTMAP de l'écran [ par clem0338 ] Bonjour, J'essaie de r&#233;cup&#233;rer un Handle du bitmap de l'&#233;cran HDC hDC = GetDC( 0 ); // DC de l'&#233;cran HBITMAP hBm; GetObject( hD


Nos sponsors


Sondage...

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 : 1,638 sec (4)

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