transparente Pixel eines .png finden

  • Hallo!

    Gibt es einen Weg um mit GDI+ (oder irgendwas anderem) alle transparenten Pixel eines .png-Bilds zu finden und aufzulisten?
    Und vielleicht noch wichtig: Geschwindigkeit spielt keine Rolle.

    Bei meinem bisherigen Code werden transparente Pixel als 0xFFFFFFFF ausgegeben.. :/

    Spoiler anzeigen
    [autoit]


    _GDIPlus_Startup()

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

    Global $bmp = _GDIPlus_ImageLoadFromFile("BildMitTransparenz.png")
    Global $width = _GDIPlus_ImageGetWidth($bmp)
    Global $height = _GDIPlus_ImageGetHeight($bmp)

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

    Local $lock = _GDIPlus_BitmapLockBits($bmp, 0, 0, $width, $height)
    Local $stride = DllStructGetData($lock, "Stride")
    Local $scan0 = DllStructGetData($lock, "Scan0")

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

    For $r = 0 To $width-1
    For $c = 0 To $height-1
    $px = DllStructCreate("dword", $scan0 + ($r * $stride) + ($c * 4))
    $col = DllStructGetData($px, 1)
    ConsoleWrite("0x" & Hex($col) & @CRLF)
    Next
    Next

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

    _GDIPlus_BitmapUnLockBits($bmp, $lock)

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

    _GDIPlus_ImageDispose($bmp)
    _GDIPlus_Shutdown()

    [/autoit]

    Danke schon mal und Gruß syne

  • Das liegt daran, das der Hintergrund deiner PNG weiß war, deshalb 0xFFFFFF.
    Ich wüsste nur eine, SEHR mühselige Idee, um soetwas zu machen... Vllt das Bild vor unterschiedlichen Hintergründen wechseln und gucken welche Pixel anders sind ^^
    Aber ich denke mal das es einfacher geht.

    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

  • Ich hab mal angefangen mit dem was ich vorgeschlagen hab. Funzt zwar noch nicht aber ich denke der Fehler liegt entwerder in der Überprfung oder im Array vergleich...

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Array.au3>

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

    Opt("GUIOnEventMode", 1)
    Global $hwndX = 400, $hwndY = 400
    $hWND = GUICreate("Transparent?", $hwndX, $hwndY, -1, -1, $WS_POPUP)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    Dim $aPixelArray1[1000][1000], $aPixelArray2[1000][1000], $Durchsichtig[1000][1000]

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

    ;~ GUISetBkColor (0xFF00FF)
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWND)
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\Roter Kreis.png")

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

    GUISetState()
    $winPos = WinGetPos("Transparent?")
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, 400, 400)
    For $i = $winPos[0] To $hwndX
    For $k = $winPos[1] To $hwndY
    $aPixelArray1[$i - $winPos[0]][$k - $winPos[1]] = PixelGetColor($i, $k);1
    Next
    Next
    Sleep (5000)
    GUISetBkColor(0xFF0000)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, 400, 400)
    For $i = $winPos[0] To $hwndX
    For $k = $winPos[1] To $hwndY
    $aPixelArray2[$i - $winPos[0]][$k - $winPos[1]] = PixelGetColor($i, $k);2
    Next
    Next
    Sleep (5000)

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

    For $i = $winPos[0] To $hwndX
    For $k = $winPos[1] To $hwndY

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

    If $aPixelArray1[$i - $winPos[0]][$k - $winPos[1]] <> $aPixelArray2[$i - $winPos[0]][$k - $winPos[1]] Then
    $Durchsichtig[$i - $winPos[0]][$k - $winPos[1]]="FEHLER"
    EndIf
    Next
    Next
    sleep (5000)
    GUIDelete ()
    _ArrayDisplay ($Durchsichtig)

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

    Func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]

    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

  • Das liegt daran, das der Hintergrund deiner PNG weiß war, deshalb 0xFFFFFF.
    Ich wüsste nur eine, SEHR mühselige Idee, um soetwas zu machen... Vllt das Bild vor unterschiedlichen Hintergründen wechseln und gucken welche Pixel anders sind ^^
    Aber ich denke mal das es einfacher geht.


    Ist auch ne gute Idee :) ,aber es geht wirklich einfacher :P
    Mit dem zusätzlichen Parameter von eukalyptus werden auch die alpha-Werte mit ausgegeben.
    Merke: Nächstes Mal die Hilfe einfach bis zum Ende lesen :rolleyes::D

    Gruß und Danke
    syne