Bild ausschneiden



  • Ich weis nicht ob das schon gab, denn ich hab es nicht gefunden (die Suchfunktion ist das Letzte; vorher war es besser!).

    Ich hab ein Bitmap schon geladen und "gespeichert". Wie kann ich etwas aus der Bitmap ausschneiden und dieses in eine neue Bitmap einfügen?

    mfg A-lex



  • Einfach entsprechend in einen 2. Memory-DC blitten 😉



  • Hier mein Versuch:

    HBITMAP hBitmap; // schon geladenes Bild
    
    HDC hDest = CreateCompatibleDC(NULL);
    BitBlt(hDest,0,0,32,32,hBitmap,0,0,SRCCOPY);
    

    So klappt es ja irgenwie nicht. Wie soll es denn aussehen?

    mfg A-lex



  • Du musst nach CreateCompatibleDC erst noch mit CreateCompatibleBitmap ein Bitmap in der gewünschten Größe erstellen und in hDest selektieren - sonst ist der DC nur 1x1 Pixel groß und schwarz-weiß.



  • Und wo ist jetzt der Fehler?

    HBITMAP hBitmap; // schon geladenes Bild
    
    HDC hDest = CreateCompatibleDC(NULL);
    HBITMAP hNew = CreateCompatibleDC(hDest,32,32);
    SelectObject(hDest,hNew);
    BitBlt(hDest,0,0,32,32,hBitmap,0,0,SRCCOPY);
    

    mfg A-lex



  • Ich meine:

    HBITMAP hBitmap; // schon geladenes Bild
    
    HDC hDest = CreateCompatibleDC(NULL);
    HBITMAP hNew = CreateCompatibleBitmap(hDest,32,32);
    SelectObject(hDest,hNew);
    BitBlt(hDest,0,0,32,32,hBitmap,0,0,SRCCOPY);
    


  • Du darfst bei CreateCompatibleBitmap als 2. Parameter nicht den gerade erstellten DC angeben, da dieser eben sw ist. Ebenso musst du auch erst für hBitmap noch einen Memory-DC erstellen und das Bild hineinselektieren. Dieses DC-Handle kannst du dann z.B. für CreateCompatibleBitmap verwenden. Und dann erst kannst du mit BitBlt vom 1. in den 2. DC blitten 😉



  • Was meinst du mit Memory-DC. 😕 Kannst du nicht einfach mal einen richtigen Code (mit Kommentaren falls nicht umständlich) hier zeigen, bitte?

    mfg A-lex



  • Das was du mit CreateCompatibleDC erstellst ist ein Memory-DC.

    HBITMAP hBitmap = Load...(); // schon geladenes Bild
    HDC hDCBitmap = CreateCompatibleDC(NULL);
    SelectObject(hDCBitmap,hBitmap);
    
    HDC hDest = CreateCompatibleDC(NULL);
    HBITMAP hNew = CreateCompatibleBitmap(hDCBitmap,32,32);
    SelectObject(hDest,hNew);
    BitBlt(hDest,0,0,32,32,hDCBitmap,0,0,SRCCOPY);
    
    // mache etwas mit hDCBitmap und hDest
    
    DeleteDC(hDCBitmap);
    DeleteObject(hBitmap);
    
    DeleteDC(hDest);
    DeleteObject(hNew);
    

    Hoffentlich hab ich jetzt keine allzu großen Fehler drinnen. BTW: Ich weiß ja nicht genau, was du vorhast, aber du kannst auch einfach gleich den entspechenden Ausschnitt auf dein Fenster blitten. (ohne den Umweg über hDest)



  • Ich will mit

    HWND hStatic = CreateWindowEx(WS_EX_TRANSPARENT,"STATIC","",WS_VISIBLE | WS_CHILD | WS_BORDER | SS_BITMAP,0,0,32,32,hWnd,NULL,hInstance,NULL)
    SendMessage(hStatic,STM_SETIMAGE,IMAGE_BITMAP,hDest);
    

    es in ein Static-Feld reinmachen. Und irgenwie funktioniert das immer noch nicht bei mir.

    mfg A-lex



  • Da musst du dann auch ein Bitmap-Handle angeben - also hNew.
    Du solltest dir etwas besser anschauen, wie genau die Funktionen deklariert sind und nicht einfach das nächstbeste übergeben!



  • geht auch nicht.

    mfg A-lex



  • Dann zeig mal etwas mehr Code



  • Was meinst du mit mehr Code? Du hast doch selber den Teil geschrieben und ich hab es übernohmen.

    mfg A-lex



  • Vielleicht hast du ihn ja auch falsch eingebaut 🙄
    Kann natürlich auch sein, dass mein Code fehlerhaft ist - du solltest auf jeden Fall mal die Rückgabewerte überprüfen. Und wie sieht das "geht auch nicht" aus?! Bekommst du Fehler? Etwas mehr Infos wären halt nicht schlecht, denn sonst kann man nur wild herumraten!



  • Könnte es daran liegen, dass sie verschiedene Größen haben oder so?

    mfg A-lex



  • So jetzt hab ich's raus:

    // hdc = aktuelles DC zum Zeichnen
    // hBmp = geladenes Bild
    // geht nur beim WM_PAINT
    
    HDC NewDC = CreateCompatibleDC(hdc);
    HBITMAP NewBmp = CreateCompatibleBitmap(hdc,32,32);
    SelectObject(NewDC,NewBmp);
    
    HDC hMemDC = CreateCompatibleDC(hdc);
    SelectObject(hMemDC,hBmp);
    
    BitBlt(NewDC,0,0,32,32,hMemDC,0,0,SRCCOPY);
    
    DeleteDC(NewDC);
    DeleteDC(hMemDC);
    

    mfg A-lex


Anmelden zum Antworten