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


Log in to reply