zapis zrzutu ekranu do BMP

Odpowiedz Nowy wątek
2011-08-20 11:00
0

Witam,

Chcę zapisać zrzut ekranu do BMP. Znalazłem do tego celu taką funkcję:

void screen(HWND okno, char* plik) 
{ 
HDC _dc = GetWindowDC(okno); 
RECT re; 
GetWindowRect(okno,&re); 
int w = re.right, h = re.bottom; 
HDC dc = CreateCompatibleDC(0); 
HBITMAP bm = CreateCompatibleBitmap(_dc,w,h); 
SelectObject(dc,bm); 
StretchBlt(dc,0,0,w,h,_dc,0,0,w,h,SRCCOPY); 
void* f = CreateFile(plik,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0); 
void* buf = new char[w*h*4]; 
GetObject(bm,84,buf); 
HDC ddd = GetDC(0); 
HDC dc2 = CreateCompatibleDC(ddd); 
tagBITMAPINFO bi; 
bi.bmiHeader.biSize = sizeof(bi.bmiHeader); 
bi.bmiHeader.biWidth = w; 
bi.bmiHeader.biHeight = h; 
bi.bmiHeader.biPlanes = 1; 
bi.bmiHeader.biBitCount = 32; 
bi.bmiHeader.biCompression = 0; 
bi.bmiHeader.biSizeImage = 0; 
CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0); 
GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS); 
 
BITMAPFILEHEADER bif; 
bif.bfType = MAKEWORD('B','M'); 
bif.bfSize = w*h*4+54; 
bif.bfOffBits = 54; 
 
BITMAPINFOHEADER bii; 
bii.biSize = 40; 
bii.biWidth = w; 
bii.biHeight = h; 
bii.biPlanes = 1; 
bii.biBitCount = 32; 
bii.biCompression = 0; 
bii.biSizeImage = w*h*4; 
 
DWORD r; 
WriteFile(f,&bif,sizeof(bif),&r,NULL); 
WriteFile(f,&bii,sizeof(bii),&r,NULL); 
WriteFile(f,buf,w*h*4,&r,NULL); 
CloseHandle(f);
} 
 

Jednak mimo że funkcja zapisuje do pliku dobrze, i z pomocą podglądu Windows mogę ten plik odczytać, to jednak nie mogę wczytać tego pliku za pomocą LoadImage(). Ma ktoś inną funkcję, która dobrze działa, albo może wie ktoś gdzie w tej funkcji jest błąd?
PS. Dodam, że kiedy wczytuję za pomocą LoadImage plik zrobiony w Paincie, to wszystko jest ok, więc nie jest to wina złego użycia LoadImage().

Pozostało 580 znaków

2011-08-20 12:46
0

a jaki błąd dostajesz z tego LoadImage?

Pozostało 580 znaków

2011-08-20 12:47
0

Właśnie nie wiem, Przekonwertowałem GetLastError() funkcją itoa() i wyszło że 0...

Pozostało 580 znaków

2011-08-20 20:38
0

pokaż kod z tym LoadLimage.

Pozostało 580 znaków

2011-08-23 11:07
0

Problem rozwiązany. Tak jak mówiłem, błąd był w funkcji screen().

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0