Datei mit mehreren Bitmaps -> Ein Bitmap laden



  • Hi,
    ich möchte ein eigenes Dateiformat erstellen in dem mehrere Bitmaps und noch andere Informationen gespeichert werden können. Leider habe ich Bitmaps bisher nur per LoadImage geladen und weiß nicht wie man Bitmaps sozusagen von Hand lädt. Es wäre also nett wenn mir jemand sagen könnte wie ich ein komplettes Bitmap(geräteunabhänig) aus einer Datei lade, also auch mit Kopfinformationen.
    Danke schon im voraus.





  • Danke,
    ich hab mir die Links angeschaut. Beim Probieren bin ich nun aber leider an eine Stelle gekommen, an der ich nicht mehr weiter weiß. Ich poste mal den ganzen Code, er ist zwar ein bisschen flüchtig zusammengesetzt, dürfte aber nicht schwer zu verstehen sein.

    #include <windows.h>
    #include <cstdio>
    
    #define WINDOW_NAME "Test"
    #define CLASS_NAME	"MyWindowClass"
    
    HBITMAP		hBMP = NULL;
    
    HRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    HBITMAP LoadBitmap (char* szName);
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPI,
    					LPSTR lpCmdLine, int iCmdShow)
    {
    
    	WNDCLASSEX wc;
    
    	wc.cbClsExtra		= NULL;
    	wc.cbSize			= sizeof( WNDCLASSEX );
    	wc.cbWndExtra		= NULL;
    	wc.hbrBackground	= (HBRUSH)GetStockObject( WHITE_BRUSH );
    	wc.hCursor			= LoadCursor( 0, IDC_ARROW );
    	wc.hIcon			= LoadIcon( 0, IDI_WINLOGO );
    	wc.hIconSm			= NULL;
    	wc.hInstance		= hI;
    	wc.lpfnWndProc		= WndProc;
    	wc.lpszClassName	= CLASS_NAME;
    	wc.lpszMenuName		= NULL;
    	wc.style			= CS_VREDRAW|CS_HREDRAW;
    
    	RegisterClassEx( &wc );
    
    	HWND hWnd = CreateWindowEx( NULL, CLASS_NAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
    								CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    								NULL, NULL, hI, NULL );
    
    	ShowWindow( hWnd, iCmdShow );
    	UpdateWindow( hWnd );
    
    	MSG msg;
    
    	hBMP = LoadBitmap( "Bitmap.bmp" );
    	InvalidateRect( hWnd, NULL, true );
    
    	while (GetMessage( &msg, NULL, 0, 0 ))
    	{
    
    		TranslateMessage( &msg );
    		DispatchMessage( &msg );
    
    	} // while
    
    	UnregisterClass( CLASS_NAME, hI );
    
    	DeleteObject( hBMP );
    
    	return msg.wParam;
    
    } // WinMain
    
    HRESULT CALLBACK WndProc (HWND hWnd, UINT message,
    						  WPARAM wParam, LPARAM lParam)
    {
    
    	PAINTSTRUCT ps;
    	HDC			hDC = NULL;
    	HDC			hBmpDC = NULL;
    
    	switch (message)
    	{
    	case WM_DESTROY:
    		{
    			PostQuitMessage( 0 );
    
    			return 0;
    		} // case WM_DESTROY
    
    	case WM_PAINT:
    		{
    
    			hDC = BeginPaint( hWnd, &ps );
    
    			hBmpDC = CreateCompatibleDC( hDC );
    			SelectObject( hBmpDC, hBMP );
    			BitBlt( hDC, 0, 0, 200, 200, hBmpDC, 0, 0, SRCCOPY );
    			DeleteDC( hBmpDC );
    
    			EndPaint( hWnd, &ps );
    
    			return 0;
    
    		} // case WM_PAINT
    
    	} // switch
    
    	return DefWindowProc( hWnd, message, wParam, lParam );
    
    } // WndProc
    
    HBITMAP LoadBitmap (char* szName)
    {
    
    	/* Variablen zum Laden der Informationen */
    	FILE*				pFile			= NULL;
    	BITMAPFILEHEADER	bmfh;
    	BITMAPINFOHEADER	bmih;
    	RGBQUAD*			colors			= NULL;
    	int					size			= 0;
    	BYTE*				tempPixelData	= NULL;
    	HBITMAP				hBmp			= NULL;
    
    	/* Öffnen der Datei */
    	pFile = fopen( szName, "rb" );
    
    	/* Laden des Dateikopfs */
    	fread( &bmfh, sizeof( BITMAPFILEHEADER ), 1, pFile );
    
    	/* Laden der Kopfinformationen */
    	fread( &bmih, sizeof( BITMAPINFOHEADER ), 1, pFile );
    
    	/* Laden der Farbpalette */
    	if (bmih.biBitCount < 24)
    	{
    
    		size = 1 << bmih.biBitCount;
    		colors = new RGBQUAD[size];
    
    		if (colors == NULL)
    		{
    			fclose( pFile );
    			return 0;
    		} // if
    
    		fread( colors, sizeof( RGBQUAD ), size, pFile );
    
    	} // if
    
    	/* Laden der Pixeldaten */
    	size = bmfh.bfSize - bmfh.bfOffBits;
    	tempPixelData = new BYTE[size];
    	fread( tempPixelData, sizeof( BYTE ), size, pFile );
    
    	/* Schließen des Handles */
    	fclose( pFile );
    
    	/* Bitmap erstellen */
    	hBmp = CreateBitmap( bmih.biWidth, bmih.biHeight,
    						 bmih.biPlanes, bmih.biBitCount, tempPixelData );
    
    	/* Speicherfreigabe */
    	delete [] colors;
    	delete [] tempPixelData;
    
    	return hBmp;
    
    } // LoadBitmap
    

    Ich habe dieses Programm schon einmal mit der LoadImage Funktion getestet und es hat funktioniert. Wer weiß was hier falsch ist schreibe das bitte.


Anmelden zum Antworten