Soyez le premier à donner votre avis sur cette source.
Vue 9 654 fois - Téléchargée 745 fois
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; }
- 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!
je continue à investiguer...
http://www.cppfrance.com/code.aspx?id=11133
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.