GDI+ Graphic transparenter Hintergrund

  • Hallo Leute,
    habe gerade mit GDI+ angefangen und habe eine sich immer
    aktualisierene Graphic, auf die ein Image (PNG) gepackt wird. (_WinAPI_BitBlt)
    Ich hätte aber gerne, dass der Hintergrund, also Graphic, transparent
    ist. Wie ist das möglich?

    Habe es schon mit

    [autoit]

    _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)

    [/autoit]


    probiert, was aber leider nicht geklappt hat.

    Sinn der Tranzparenz ist, dass ich ein Hintergrundbild habe.

    Danke für Hilfe.


    MfG
    qixx

  • _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF) übermalt die komplette Grafik in einer Farbe, Transparenz wäre so also nicht zu erreichen. Abgesehen davon, ist die Farbe weiß mit einem Alpha-Channel von 255 wohl kaum transparent :pinch: .
    Du musst einen Befehl finden, der dir jeden einzelnen Pixel in einer Grafik in möglichst kurzer Zeit auf den ARGB Farbwert 0x00000000 setzt. Den kann ich mir jetzt aber leider nicht aus dem Ärmel schütteln. ;)

    Edit: Wieso verwendest du _WinAPI_BitBlt um ein Bild in eine Grafik zu malen? Mit _GDIPlus_GraphicsDrawImageRect geht das ganze doch auch, und soweit ich weiß sogar mit Transparenz

  • So wie ich es verstanden hab könntest du auch ein durchsichtiges Bild als Hintergrund nehmen. Und damit dann immer übermalen.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Zitat

    So wie ich es verstanden hab könntest du auch ein durchsichtiges Bild als Hintergrund nehmen. Und damit dann immer übermalen.


    Eine Grafik mit einem transparenten Bild übermalen ist so effektiv wie die Zahl 10 durch addieren von 0 auf 0 bringen zu wollen :D .

  • Zitat

    _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF) übermalt die komplette Grafik in einer Farbe


    Das heißt, es übermalt es nur;) und wenn er es dann mit 0x00000000 übermalen will, kommt das raus was ich vorgeschlagen hab. Über den Sinn lässt sich streiten :D

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • BadBunny wenn wir von GDI+ reden kannst du doch gar nicht mitreden =0 ?
    Nein kommt es nicht ~.~, stell dir vor du hast Glas vorm gesicht und dahinter ne Schwarze fläche, und da malst du mit Grüner Farbe rauf, wenn du jetzt das ganze mit noch ner Glasscheibe wegmachen willst passiert irgendwie nichts, oder ?
    H2112 hat eine UDF geschrieben womit man komplett Transparent zeichnet, da setzt er den Hintergrund auch immer auf 0x00 ?? ?? ?? , also musste ihn mal anfragen ...

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Zitat

    Über den Sinn lässt sich streiten :D


    Da hast du recht, funktionieren würde es aber trotzdem nicht :P. Das ist als ob du in einem Bildbearbeitungsprogramm ein Transparentes Layer über ein Bild legst, in der Hoffnung es transparent zu machen. Das geht halt einfach nicht....

  • *Totlach* Ja name22 hat wie immer Recht, ist halt UEZ in neuauflage und jünger, und noch ein bissl weniger erfahren =D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Na dann hab ich ja keine Chance :D Das mit dem Glas (die Vorstellung dazu) war mir klar. Nur ich weiß jetzt nicht was der Themaersteller genau will. Eine Transparente Graphic..?

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Du weißt es aber Hinterfragst es, omq !!!
    BadBunny du machst ja auch zu 80 % nur Spam, löst mich wohl ab =D

    Wenn ich Name22 & Threadersteller folgen kann möchte er ein Bild zeichnen, das Transparent ist, und wenn er auf diesem Bild malt möchte er die Stellen wo es transparent ist eben wieder Transparent haben, sofern darauf gemalt wird...

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • 1. Ich habs nicht Hinterfragt, sondern nur falsch verstanden.
    2. Also er malt ein Leeres Bild, Ok das hab ich kapiert. Dann wenn auf das Transparente gemalt wird, soll nochmal alles Transparent werden? Das das Bild dann weg ist? Oder alles transparent bis auf das wo das Bild drauf ist?
    Sorry das ich frage, aber ich denke das Forum dient auch dazu zu lernen wenn man nicht der Treadsteller ist. Und das versuche ich halt. :D

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Edit: Wieso verwendest du _WinAPI_BitBlt um ein Bild in eine Grafik zu malen? Mit _GDIPlus_GraphicsDrawImageRect geht das ganze doch auch, und soweit ich weiß sogar mit Transparenz

    Weil es ohne nicht funktionieren mag...
    Hier mal mal Quellcode. ;)

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    HotKeySet("{Esc}", "_Exit")
    $sText = "Hallo"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Dim $MovePic[1]
    $Move_Animation = 1
    $Links = True
    $ImageExist = True

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Test", 400, 150)
    $hGUI_DC = _WinAPI_GetDC($hGUI)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Slider = GUICtrlCreateSlider(40, 110, 201, 41)
    GUICtrlSetLimit(-1, 20, 1)
    GUICtrlSetData(-1, 5)

    [/autoit] [autoit][/autoit] [autoit]

    $Button = GUICtrlCreateButton("Richtung", 250, 110)

    [/autoit] [autoit][/autoit] [autoit]

    $hBitmap = _WinAPI_CreateCompatibleBitmap($hGUI_DC, 500, 100)
    $hGraphics_DC = _WinAPI_CreateCompatibleDC($hGUI_DC)
    _WinAPI_SelectObject($hGraphics_DC, $hBitmap)
    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hGraphics_DC)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $x = 400, $y = 0, $X2 = 0, $Y2 = 100

    [/autoit] [autoit][/autoit] [autoit]

    $i = 0
    While $ImageExist
    $Image = @ScriptDir & "\images\Ausgewachsen\5000030-move-" & $i & ".png"
    $ImageExist = FileExists($Image)
    If $ImageExist Then
    ReDim $MovePic[UBound($MovePic)+1]
    $MovePic[$i+1] = _GDIPlus_ImageLoadFromFile($Image)
    $i += 1
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $Timer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    While Sleep(5)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    _Exit()
    Case $Button
    If $Links = True Then
    $Links = False
    $x += 59
    Else
    $Links = True
    $x -= 59
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    If TimerDiff($Timer) >= 100 Then
    _Move(10, 0, 400, GUICtrlRead($Slider), $Links) ; Geschwindigkeit, Richtung, Breite, Abstand oben, Abstand links
    $Timer = TimerInit()
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Move($Top, $Left, $MovingWidth, $Speed = 1, $Forward = True)
    _GDIPlus_GraphicsClear($hGraphics, 0xFFFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    If $Forward = True Then
    $Width = _GDIPlus_ImageGetWidth($MovePic[1])
    $Height = _GDIPlus_ImageGetHeight($MovePic[1])
    $x -= $Speed
    If $x < -$Width Then $x = $MovingWidth
    Else
    $Width = -_GDIPlus_ImageGetWidth($MovePic[1])
    $Height = _GDIPlus_ImageGetHeight($MovePic[1])
    $x += $Speed
    If $x > $MovingWidth - $Width Then $x = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $Move_Animation = UBound($MovePic)-1 Then
    $Move_Animation = 1
    Else
    $Move_Animation += 1
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$MovePic[$Move_Animation], $x, 0, $Width, $Height)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_BitBlt($hGUI_DC, $Left, $Top, $MovingWidth, $Height, $hGraphics_DC, 0, 0, $SRCCOPY)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    _WinAPI_DeleteDC($hGraphics_DC)
    _WinAPI_ReleaseDC($hGUI, $hGUI_DC)
    _WinAPI_DeleteObject($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    MfG
    qixx

  • Ich bin zurzeit leider nicht zuhause, aber wenn ich zuhause bin, stell ich dir die Funktion, die eine komplette Transparents erzwingt, rein. ;)

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Mehrere möglichkeiten um das zu überprüfen:
    1. Label unter das Bild legen und überprüfen ob draufgeklickt wurde (GUIGetCursorInfo )
    2. Die Koordinaten des bilder "einkesseln" und dann wieder mit GUIGetCursorInfo() überprüfen ob in den Bereich des Bildes geklickt wurde

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • 2. Die Koordinaten des bilder "einkesseln" und dann wieder mit GUIGetCursorInfo() überprüfen ob in den Bereich des Bildes geklickt wurde

    Ja, so hätte ich das sonst auch gemacht. ;)
    Hätte ja sein können, dass es eine Funktion dafür gibt.

    Habe mal eben eine geschrieben.

    [autoit]

    Func _MousePos($Links, $Oben, $Breite, $Hoehe) ;Abstand von links, Abstand von Oben, Breite, Höhe des Kastens
    $pos = MouseGetPos()

    [/autoit][autoit][/autoit][autoit]

    If $pos[0] > $Links And _
    $pos[1] > $Oben And _
    $pos[0] < $Breite And _
    $pos[1] < $Hoehe Then

    [/autoit][autoit][/autoit][autoit]

    Return True
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Return False
    EndFunc

    [/autoit]

    MfG
    qixx

  • Hier bitte. ;D

    Die ShutDown musst dir selber machen, bin gerade im Stress. ;)

    [autoit]


    Global $hWnd, $hGraphic, $hBitmap, $backbuffer
    Global $ScreenDc, $dc, $tSize, $pSize, $tSource, $pSource, $tBlend, $pBlend, $tPoint, $pPoint, $gdibitmap

    [/autoit][autoit][/autoit][autoit]

    Func _Startup()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic)
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($backbuffer[$i], 4)
    $ScreenDc = _WinAPI_GetDC($hWnd)
    $dc = _WinAPI_CreateCompatibleDC($ScreenDc)

    [/autoit][autoit][/autoit][autoit]

    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $width)
    DllStructSetData($tSize, "Y", $height)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    DllStructSetData($tBlend, "Format", 1)
    $tPoint = DllStructCreate($tagPOINT)
    $pPoint = DllStructGetPtr($tPoint)
    DllStructSetData($tPoint, "X", 0)
    DllStructSetData($tPoint, "Y", 0)
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _Update()
    $gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _WinAPI_SelectObject($dc, $gdibitmap)
    _WinAPI_UpdateLayeredWindow($hWnd, $ScreenDc, 0, $pSize, $dc, $pSource, 0, $pBlend, 2)
    _WinAPI_DeleteObject($gdibitmap)
    EndFunc

    [/autoit]
    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%