SetTransparent auf Bitmap anwenden



  • Nach vielem gegoogle und suchen in diversen Sites bitte ich einfach mal
    hier um Hilfe.

    Ich habe eine Ressource IDB_BITMAP1 die ich in der Farbe "schwarz"
    transparent darstellen möchte. Ich finde einfach keine für mich verständliche
    Erklärung, wie man das anstellen soll.

    Kann mir jemand aus diesem Forum dabei auf die Sprünge helfen ?
    Ich habe zwar schon Demos gefunden, die kann ich aber weder nachbauen,
    noch wirklich nachvollziehen.

    Ich brauche wohl COLORREF und muss dort mit RGB etwas wie 0,0,255
    angeben um erstmal schwarz zu definieren. Aber dann hört es auf.
    Brauche ich eine HBITMAP Variable um dieser dann SetTransparentColor
    oder SetTransparent zu übergeben ? Und wenn ja, wie ist dafür der Ansatz ?



  • Wie zeichnest du denn nachher dein Bitmap? Schau dir mal TransparentBlt an.
    BTW: Schwarz wäre wenn dann aber 0,0,0



  • Ich habe das ursprünglich in einem MFC-Projekt.
    Ziel ist das angezeigte Bitmap mit der ID IDB_BITMAP1
    am Rand transparent zu bekommen. Der Rand ist schwarz und soll weg.
    Das Bild soll danach dann nur noch selbst zu sehen sein.

    Wenn es für einen erfahrenen Programmierer hier im Forum
    möglich wäre einen Beispielcode zu posten, will ich mich
    daran weiter versuchen. Momentan komme ich selbst einfach
    keinen Schritt weiter.

    Ich habe momentan abgesehen von den viel unübersichtlichen
    Beispielprojekten nur folgendes (hoffentlich) verstanden:

    Ich brauche auf HBITMAP den Zugriff auf mein Bitmap:

    HBITMAP bmp1=::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
    

    Dann muss ich wohl das ganze Bitmap nochmal in ein HBITMAP überführen
    und dann irgendwie CreateBitmap verwenden und dem Bitmap dann die
    Transparenz verpassen. Habe ich das jetzt richtig erklärt ?

    Uff...also selbst die sonst gut verständlichen und dokumentierten Klassen
    bei Codeproject überfordern mich in dieser Sache ehrlich gesagt total. 😞



  • Mal so auf die Schnelle (Fehler nicht ausgeschlossen):

    hdc = BeginPaint (hwnd, &ps);
    HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
    BITMAP bmpInfo;
    GetObject(hBmp,sizeof(BITMAP),&bmpInfo);
    HDC hdcMem = CreateCompatibleDC(hdc);
    SelectObject(hdcMem,hBmp);
    TransparentBlt(hdc,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,hdcMem,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,RGB(0,0,0));
    DeleteObject(hBmp);
    DeleteDC(hdcMem);
    EndPaint (hwnd, &ps);
    

    Das ist der Code aus WM_PAINT - der Übersichtlichkeit halber hab ich mal alles da rein gepackt. Von der Effizienz her wäre es wohl sinnvoller das Bitmap z.B. bei WM_CREATE zu laden. Und nicht vergessen Msimg32.lib zu linken...

    edit: hInst wäre dann bei dir AfxGetInstanceHandle() 😉



  • Ich muss also noch HDC, PAINTSRUCT und HWND definieren oder?

    HDC hdc;
    PAINTSTRUCT ps;
    HWND hwnd;
    
    hdc = BeginPaint (hwnd, &ps);
    HBITMAP hBmp = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
    BITMAP bmpInfo;
    GetObject(hBmp,sizeof(BITMAP),&bmpInfo);
    HDC hdcMem = ::CreateCompatibleDC(hdc);
    SelectObject(hdcMem,hBmp);
    TransparentBlt(hdc,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,hdcMem,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,RGB(0,0,0));
    DeleteObject(hBmp);
    DeleteDC(hdcMem);
    ::EndPaint (hwnd, &ps);
    

    Nur mein Bitmap will nicht den schwarzen Bereich transparent setzen 😞
    Es passiert nichts. Was muss ergänzend noch gemacht werden?
    Ich check das noch nicht wirklich. Wie muss ich hwnd definieren (=NULL)?



  • Der Code von flenders zeichnet ein Bitmap in ein Fenster und muss im richtigen Moment ausgeführt werden. Er ändert nicht das Bitmap, so dass danach schwarz transparent ist, was du erwartet hast, oder?
    Du könntest unterstützend mal deinen gesamten Code zeigen oder zumindest die relevanten Funktionen.

    BTW: Warum fragst du nicht im MFC-Forum?



  • Vielleicht hilft folgender Beitrag weiter:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39066.html



  • Ich hätt auch ne frage:
    Gibts eine Funktion/Methode mit der man eine Farbe zu m-% transparent machen kann?

    Also zum beispiel nur 50% durchsichtig?

    Weil ich verwende TransparentBlt aber damit wird die Farbe einfach ausgeblendet und für Schatten-Effekte oder dgl. eignet sich das natürlich nicht.

    MfG Kuldren



  • da gibts AlphaBlend für. TransparentBlt is im PSDK glaub ich auch als deprecated oder speicherbuggy bezeichnet oder so, soll man also eigentlich nicht mehr nehmen, oder die ham das in neueren win-vrsionen gefoxt, kA



  • Use AlphaBlend to specify 32 bits-per-pixel bitmaps with transparency.

    Zum selber zeichnen bietet dir GDI+ einige Funktionen 🙂

    Maxi schrieb:

    da gibts AlphaBlend für. TransparentBlt is im PSDK glaub ich auch als deprecated oder speicherbuggy bezeichnet oder so, soll man also eigentlich nicht mehr nehmen, oder die ham das in neueren win-vrsionen gefoxt, kA

    Das steht nur zu Windows 95/98:

    TransparentBlt contains a memory leak that can exhaust system resources. To draw a transparent bitmap using BitBlt, see Knowledge Base article 79212.


Anmelden zum Antworten