Bitamp einlesen und ausgeben.



  • Hi, ich möchte grerne ein Bitmap einlesen, und danach in meinem Window ausgeben.

    Hat jemand ein Tutorial dazu, oder einen Quelltext der gut kommentiert ist 😉



  • Ich kann ja mal eben basteln 😉 ...

    Kurz zum Ablauf:
    1. Bitmap laden
    2. Speicherkontext erstellen, geladene Bitmap einsetzen
    3. Speicherkontext auf den Bildschirm kopieren
    4. Speicher wieder freigeben (GDI-Clean-Up)

    Voila ➡

    // Bitmap-Datei: "C:\demo.bmp" laden und in Handle 'hbmpSource' speichern:
    HBITMAP hbmpSource = LoadImage(NULL, TEXT("C:\\demo.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_DEFAULTCOLOR);
    // Definition 1: 'hWnd' sei das Fenster auf deren Client-Bereich die Bitmap ausgegeben werden soll.
    // Definition 2: 'hDC' sei der Geräte-Kontext dieses Fensters; Initialisierung entweder via GetDC(Ex) oder BeginPaint.
    /*
     * Speicherkontext für geladene Bitmap erstellen, damit auch
     * noch weitere Zeichenaktionen (auf die Bitmap) möglich sind;
     * Bitmap in den Speicherkontext einsetzen und Speicherkontext
     * auf (Monitor-)Geräte-Kontext blitten (=kopieren).
     */
    HDC hdcMemory = CreateCompatibleDC(hDC); // Speicherkontext initialisieren
    // Geladene Bitmap in den Speicherkontext einsetzen und vorherige Bitmap sichern:
    HBITMAP hbmpPrevBits = reinterpret_cast<HBITMAP>(SelectObject(hdcMemory, hbmpSource));
    
    // Hinweis: Mit der Funktion BitBlt lässt sich die Größe der Bitmap nicht ändern, StretchBlt
    //          kann die Größe jedoch ändern (9. und 10. Parameter).
    RECT   rcClient; // für den Client-Bereich
    BITMAP bmInfo;   // für die Bitmap-Informationen (wie Größe, etc. ...)
    GetClientRect(hWnd, &rcClient); // <- Client-Bereich des Fensters ermitteln (=> Zielbereich)
    GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);
    StretchBlt(hDC, 0, 0, rcClient.right, rcClient.bottom, hdcMemory, 0, 0, bmInfo.bmWidth, bmInfo.bmHeight, SRCCOPY);
    // Hinweis: Beim Verwenden von BitBlt kann man sich die vorletzten beiden Parameter sparen.
    // GDI-Objekte wieder freigeben:
    SelectObject(hdcMemory, hbmpPrevBits); // <- Alte Bitmap wieder in den Speicherkontext einsetzen
    DeleteObject(hbmpSource); // <- Geladene Bitmap löschen
    // oder etwas kompakter (entspricht aber den beiden oberen Funktionsaufrufen und ist deshalb auskommentiert):
    // DeleteObject(SelectObject(hdcMemory, hbmpPrevBits));
    DeleteDC(hdcMemory); // <- Speicherkontext löschen
    // Hinweis: Den Aufruf von ReleaseDC bzw. EndPaint nicht vergessen!
    

    Hoffe das ist verständlich 😉 .

    PS: ➡ ⚠ Ist aber nicht getestet...

    EDIT: Vertipper :p ...



  • Hi, Vielen Dank (Wäre was für die FAQ).

    Habe aber noch eine Frage

    GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);

    Was sind alles Objekte ??

    int
    char

    usw. auch oder nut HBITMAP und BITMAP ???



  • BlackScreen schrieb:

    Hi, Vielen Dank (Wäre was für die FAQ).

    Hm jo stimmt, glaube das wurde schon oft gefragt...

    BlackScreen schrieb:

    Habe aber noch eine Frage

    GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);

    Was sind alles Objekte ??

    int
    char

    usw. auch oder nut HBITMAP und BITMAP ???

    Objekte sind (in diesem Sinne hier) 'logische GDI Objekte'; dazu gehören also nicht
    die Standarddatentypen wie int oder char. Beispiele wären also HBITMAP, HFONT, HPEN usw.
    ⚠ BITMAP (ohne 'H' 🕶 ) ist eine Struktur, also definiert mit dem
    Schlüsselwort struct.



  • Aber, dann wäre ja

    BITMAP bmInfo;

    kein Objekt.

    Wiso dann

    GetObject(hbmpSource, sizeof(BITMAP), &bmInfo);

    Bin ein bisschen verwirrt 😕



  • Na der erste Parameter von GetObject ist doch ein Objekt (Typ: HBITMAP); die Informationen
    dieses Objekts werden in der Strukturvariable bmInfo (Typ: BITMAP) gespeichert.

    GetObject ermittelt diese Informationen.



  • Hi, Wiso Funkationiert dass nicht 😡

    int LoadBitmapEx(char *BitmapSrc,int x,int y,HINSTANCE hInst,HWND hWnd)
    {
    	HBITMAP hbmpPicture;
    	HDC dcScreen;
    	HDC dcPicture;
    	BITMAP bmInfo;
    
    	hbmpPicture = LoadBitmap(hInst,BitmapSrc);
    
    	GetObject(hbmpPicture,sizeof(BITMAP),&bmInfo);
    	dcScreen = GetDC(hWnd);
        dcPicture = CreateCompatibleDC(dcScreen);
    
    	SelectObject(dcPicture,hbmpPicture);
    
    	BitBlt(dcScreen,0,0,x,y,dcPicture,0,0,SRCCOPY);
    
    	ReleaseDC(hWnd,dcScreen);
    
    	return(0);
    
    }
    

    Ich bekomme einfach kein Bild zu sehen 😞



  • Niemand Online ??

    Mir kommt es vor als ob das Board ausgestorben ist 🙄



  • Wo send denn hier die klugen läute abgeblieben.

    Müssen die alle schon arebeiten 😡

    Kann doch nicht sein Dass keiner ahnung hat !!!!!



  • probier mal das, keine ahnung ob das funktionit ist ein alter quelltext von mir

    void DrawBitmap(HDC hDC, HBITMAP hBitmap, int x, int y) {
       HDC hMemoryDC = CreateCompatibleDC(NULL);
       HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap);
    
       BITMAP BitmapInfo;
       GetObject(hBitmap, sizeof(BitmapInfo), &BitmapInfo);
    
       BitBlt(hDC, x, y, BitmapInfo.bmWidth, BitmapInfo.bmHeight, hMemoryDC, 0, 0, SRCCOPY);
    
       SelectObject(hMemoryDC, hOldBitmap);
       DeleteDC(hMemoryDC);
    }
    
    case WM_PAINT:
    {
         PAINTSTRUCT PaintStruct;
         HDC hDC = BeginPaint(hWindow, &PaintStruct);
         DrawBitmap(hDC, hBitmap, 0, 0);
         EndPaint(hWindow, &PaintStruct);
    }
    break;
    


  • Hier fehlt ein MAKEINTRESOURCE:

    hbmpPicture = LoadBitmap(hInst,BitmapSrc);
    

    ➡

    hbmpPicture = LoadBitmap(hInst,MAKEINTRESOURCE(BitmapSrc));
    

    PS: Du musst geladene Bitmaps auch wieder löschen bzw einen Speicherkontext wieder entfernen (siehe Beispielcode von mit, oben).



  • H, Danke aber ich möchte gerne wissen was an meinem Script falsch ist langsam werd ich wütend 😡 😡 😡 😡 😡 😡 😡 😡 😡 😡



  • Sry, hab gar nich geshen dass es noch ne 2. Seite hat Sry.



  • Funktioniert immer noch nicht ich bin echt am verzweifeln !!!!!!!!!!!!!!!!!!!!!!!!

    int LoadBitmapEx(char *BitmapSrc,int x,int y,HINSTANCE hInst,HWND hWnd)
    {
    	HBITMAP hbmpPicture;
    	HDC dcScreen;
    	HDC dcPicture;
    	BITMAP bmInfo;
    
    	hbmpPicture = LoadBitmap(hInst,MAKEINTRESOURCE(BitmapSrc));
    
    	GetObject(hbmpPicture,sizeof(BITMAP),&bmInfo);
    
    	dcScreen = GetDC(hWnd);
        dcPicture = CreateCompatibleDC(dcScreen);
    
    	SelectObject(dcPicture,hbmpPicture);
    
    	BitBlt(dcScreen,x,y,171,171,dcPicture,0,0,SRCCOPY);
    
    	DeleteDC(dcPicture);
    	DeleteObject(hbmpPicture);
    	ReleaseDC(hWnd,dcScreen);
    
    	return(0);
    
    }
    


  • Wie/Wo rufst du denn die Funktion auf ?
    Zeig mal den Codeabschnitt...

    PS: Das GetObject ist hier natürlich überflüssig... :p



  • Also die Funktion ist kacke. In WM_PAINT würdest du jedes mal das Bitmap neuladen und woanders zeichnet man nicht.



  • //--------------------------------------------------------------------------------------------------------
    
    	RegisterClassEx(&windowinfo);
    
    	HWND mainWnd = CreateWindowEx(NULL,"Fish","Passoword Fish",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,400,400,NULL,NULL,hinst,NULL);
    	HWND button     = CreateWindowEx(NULL,"Button","Ping", WS_CHILD | BS_PUSHBUTTON,10,10,150,50,mainWnd,NULL,hinst,NULL);
    
    	LoadBitmapEx("c:\\windows.bmp",10,10,hinst,mainWnd);
    
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return(0);
    


  • BlackScreen kann es sein das du ein 14 jähriges CS spielendes Kiddy bist? 😡



  • Wiso nein wie kommst du drauf ich nerve mich nur weil ich an diesem mit schon den ganzen tag dransitze und nie funktioniert es 😡



  • loadbitmapex schrieb:

    Also die Funktion ist kacke. In WM_PAINT würdest du jedes mal das Bitmap neuladen und woanders zeichnet man nicht.

    Jo da hast Du Recht:
    Man könnte der Funktion ja auch ein (statisches) Handle zu einer Bitmap übergeben, die unter WM_CREATE geladen und unter WM_DESTROY gelöscht wird.

    @BlackScreen:
    Man unterscheidet zwischen Bitmaps die als Resource in einem Modul abgelegt sind und solche die als Dateien auf einem Datenträger gespeichert sind.
    Resourcen-Bitmap werden über die Funktion LoadBitmap unter Angabe des korrekten Instanz-Handles und der ID der Bitmap. Bitmap-Dateien werden über die Funktion LoadImage geladen (man kann damit allerdings auch Resourcen-Bitmaps laden).

    Weiterhin werden Zeichenaktionen immer unter der Nachricht WM_PAINT in der entsprechenden WndProc deines Zielfensters abgehandelt. Dazu gehören selbstverstänldich auch 'Blittings'.

    Ich denke es wäre sinnvoll, wenn Du Dir (nochmal?) ein Tutorial bzgl. WinAPI anguckst. Hier ein Beispiel: http://www.win-api.de/ . Weitere findest Du zu Hauf bei Google.


Log in to reply