xevuel Temat założony przez niniejszego użytkownika |
[WinAPI, C++] Zrzut ekranu » 2011-08-20 11:19:35 Napisałem ten temat już tutaj, ale na tym forum szybciej dostaję odpowiedzi, więc piszę też tu. 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 obrazów 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(). PS2. o formacie BMP dopiero się uczę, więc nie za bardzo jeszcze wiem co zmienić... |
|
pekfos |
» 2011-08-20 11:22:05 Ta funkcja zapewne jest dobra. poczytaj w MSDN o LoadImage(). pewnie z nią masz problem. |
|
xevuel Temat założony przez niniejszego użytkownika |
» 2011-08-20 11:38:04
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().
|
Chciałem sprawdzić, co jest nie tak, więc zrobiłem eksperyment:
Zrobiłem BMP w Paincie, i załadowałem go LoadImage( 0, "plik.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); . Plik się wyświetlił. Potem skopiowałem plik stworzony przez program do tego samego katalogu. Zmieniłem nazwę na plik.bmp. I co? Nie wyświetla się... |
|
pekfos |
» 2011-08-20 11:51:35 to otwórz plik z programu w panintcie, "zapisz jako.." i spróbuj wczytać. jak się wyświetli znaczy że funkcja zapisująca jest schrzaniona. |
|
xevuel Temat założony przez niniejszego użytkownika |
» 2011-08-20 11:56:20 Niesamowite... Jak otwieram to za pomocą Painta, to wyświetla się pusty obraz... całe białe tło, nic poza tym. Mówiłem, że coś jest nie tak z tą funkcją...
aha, w IrfanView się wyświetla ok, tak jak w podglądzie... |
|
pekfos |
» 2011-08-20 12:24:50 bif.bfSize = w * h * 4 + 54; błąd. kolor w formacie bmp jest trzymany w 3 bajtach. 42 4D 86 00 00 00 00 00 00 00 36 00 00 00 28 00 00 00 05 00 00 00 05 00 00 00 01 00 18 00 00 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 00 FF FF FF 00 00 00 FF FF FF 00 00 00 FF FF FF 00 mała poprawna bitmapa. |
|
xevuel Temat założony przez niniejszego użytkownika |
» 2011-08-20 12:26:55 a jak naprawić? |
|
pekfos |
» 2011-08-20 12:28:05 ... Zamienić 4 na 3? |
|
« 1 » 2 3 4 5 |