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

[WinApi c++] odczyt bmp z pliku

Ostatnio zmodyfikowano 2011-12-10 15:08
Autor Wiadomość
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ć?
P-45405
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.
P-45406
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:
C/C++
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 );
}
P-45408
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 ;)
P-45410
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
P-45413
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ę.
P-45414
pekfos
» 2011-12-10 15:08:53
brakuje tu ZeroMemory() skróci to kod i wyzeruje składowe o których ewentualnie zapomniałeś.
P-45423
« 1 »
  Strona 1 z 1