Alle Pixel einer PNG-Datei die nicht einem bestimmter Farbe entsprechen auf Transparent setzen

  • Hallo Com,

    für ein kleines Spiele-/Quizprojekt möchte ich Landkarten bis auf eine Stadt auf Volltransparent setzen, ausserdem benötige ich noch ein Array welches die Bildkoordinaten der Stadt enthält. Hier mein Ansatz:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GDIP.au3>
    #include <Array.au3>
    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromFile('D:\Programme\AutoIt3\MyDemos\HeimatkundeQuiz\Karten\Berlin2.png')
    $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Dim $aArray[$iWidth][$iHeight]

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

    For $iX = 0 To $iWidth -1
    For $iY = 0 To $iHeight - 1
    $sHex=Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY))
    ConsoleWrite($iX&'/'&$iY&': '&$sHex&@CRLF)
    If $sHex='FFC11E1E' Then
    $aArray[$iX][$iY]=1
    Else
    $aArray[$iX][$iY]=0
    _GDIPlus_BitmapSetPixel($hBitmap, $iX, $iY,0xFFFFFFFF)
    EndIf
    Next
    Next
    _GDIPlus_ImageSaveToFile($hBitmap,'D:\Programme\AutoIt3\MyDemos\HeimatkundeQuiz\Karten\Berlin.png')
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()

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

    _ArrayDisplay($aArray)

    [/autoit]

    Obwohl mir die Konsolenausgabe den gesuchten Wert:

    Code
    99/52: FFBD2121
    99/53: FFC11E1E
    99/54: FFC11E1E
    99/55: FFC11E1E
    99/56: FFA8605C

    ausgibt schlägt die nachfolgende Prüfung (Zeile 14) schief, dadurch ist naürlich auch das geänderte Bild für den Mülleimer. Ich benutze AutoIt 3.6.6.1 auf Win XP SP3.

    Edit: Lösung

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GDIP.au3>
    #include <Array.au3>
    _GDIPlus_Startup()
    ;ConsoleWrite(Dec('C11E1E')&@CRLF)
    ;Exit
    $hBitmap = _GDIPlus_BitmapCreateFromFile('D:\Programme\AutoIt3\MyDemos\HeimatkundeQuiz\Karten\Berlin2.png')
    $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Dim $aArray[$iWidth][$iHeight]

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

    For $iX = 0 To $iWidth -1
    For $iY = 0 To $iHeight - 1
    $sHex= Hex(_GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY),6)
    $iColor=Dec($sHex)
    ;ConsoleWrite($iX&'/'&$iY&': '&$iColor&@CRLF)
    If $iColor = 12656158 Then
    $aArray[$iX][$iY]=$iColor
    Else
    $aArray[$iX][$iY]=0
    _GDIPlus_BitmapSetPixel($hBitmap, $iX, $iY,0xFF)
    EndIf
    Next
    Next
    _GDIPlus_ImageSaveToFile($hBitmap,'D:\Programme\AutoIt3\MyDemos\HeimatkundeQuiz\Karten\Berlin.png')
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()

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

    _ArrayDisplay($aArray)

    [/autoit]

    mfg autoBert

  • Hi Autobert,
    Bei mir gibt deine Consolenausgabe das hier zurück

    Code
    0/0: 00000000FFC6ECFF
    0/1: 00000000FFC6ECFF
    0/2: 00000000FFC6ECFF

    Habe dann dazu Zeile 14 in

    [autoit]

    If $sHex='00000000FFC11E1E' Then

    [/autoit]

    geändert und habe jetzt Berlin in dem neu erstellten Bild erhalten.

    Ich benutze Win 7 32 Bit, AutoIt : 3.3.8.1