robaczek122 Temat założony przez niniejszego użytkownika |
[WinApi c++] odczyt bmp z pliku » 2011-12-10 12:40:53 Mam dwa pliki BMP http://www.filedropper.com/jeden - pierwszy, bezpośrednio zapisany przez program, nie otwiera się funkcją LoadImage, http://www.filedropper.com/dwa - drugi, zapisany przez program, otworzony w paincie, zapisany pod nową nazwą i po takim cyklu otwiera się funkcją LoadImage.
Samo zmienienie nazwy pliku pierwszego nie powoduje, że daje się on otworzyć funkcją.
Nie wiem dlaczego jest taka różnica, skoro po zapisaniu przez painta plik ma taką samą wielkość i na pierwszy rzut oka wydaje się taki sam (podgląd w notatniku).
Ktoś ma jakiś pomysł dlaczego tak może się dziać? |
|
xevuel |
» 2011-12-10 12:45:54 Podglądasz BMP w notatniku? o_O
Podaj kod, który zapisuje bitmapę. Prawdopodobnie zapisujesz zły nagłówek. |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2011-12-10 12:55:00 Zgadza się, podglądam w notatniku... A no faktycznie jest trochę inny nagłówek: funkcja: void screen_api( 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 ); }
|
|
xevuel |
» 2011-12-10 12:58:03 Szukaj: "zrzut ekranu BMP"
2 wynik od góy: http://cpp0x.pl/forum/temat/?id=4975
Btw, kod dawaj w [cpp]...[/cpp]
PS. Podana w tym linku funkcja nie jest doskonała - przy próbie zapisu jeden po drugim ponad 100 plików niektóre pliki mogą być całe czarne. Po drugie, w funkcji nie jest zwalniana pamięć, ale to już twoje zadanie ;) |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2011-12-10 13:12:26 Czytałem tamten temat, szkoda, że autor nie wrzucił na końcu swojego rozwiązania ;P |
|
xevuel |
» 2011-12-10 13:17:55 noo... szkoda, ale nie udało mi się go do tego namówić :P
Jak przeczytasz tamten link , to będziesz wiedział, jak napisać tą funkcję. |
|
pekfos |
» 2011-12-10 15:08:53 brakuje tu ZeroMemory() skróci to kod i wyzeruje składowe o których ewentualnie zapomniałeś. |
|
« 1 » |