Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI, C++] Zrzut ekranu

Ostatnio zmodyfikowano 2011-08-22 10:23
Autor Wiadomość
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ę:

C/C++
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ć...
P-39495
pekfos
» 2011-08-20 11:22:05
Ta funkcja zapewne jest dobra. poczytaj w MSDN o LoadImage(). pewnie z nią masz problem.
P-39497
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ę...
P-39498
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.
P-39499
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...
P-39500
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.
P-39501
xevuel
Temat założony przez niniejszego użytkownika
» 2011-08-20 12:26:55
a jak naprawić?
P-39502
pekfos
» 2011-08-20 12:28:05
...
Zamienić 4 na 3?
P-39503
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona