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.



  • Schon, aber ich kann die Funktion LoadImage() nicht so gerbauche wie du es in deinem Beispiel gezeigt hast, denn bein mit bekomm ich ein Handle als Rückgabe und kein HBITMAP, wie kann ich den aus dem Handle ein HBITMAP machen einfach draulos casten 😮


Anmelden zum Antworten