Durchschnittsfarbe eines Bildes mit GDIPlus?

  • Hallo Leute,

    habe nach langer Zeit mal wieder angefangen wieder zu scripten und komme an einer Stelle nicht weiter. Und zwar habe ich ein Bild, das beispielsweise 500x500 Pixel groß ist. Mit _GDIPlus_GraphicsDrawImageRect zeichne ich das auf die GUI in der Größe 1x1 Pixel, damit ich die Durchschnittsfarbe des ganzen Bildes habe. Aber irgendwie bekomme ich mit _GDIPlus_GetPixel nur die Farbe vom Format 500x500 Pixel.

    Also ich zeichne erst das Bild mit 1x1 Pixel, ermittel die Farbe davon, lösche es um anschließend die Hintergrundfarbe mit der Farbe zu füllen und zeichne letzendlich das Bild in Vollbild (1:1). Klappt leider nicht :rofl:

    Hier das Script (Siehe Zeile 75-79):

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.8.1
    Author: Burak Keskin

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <class\AutoItObject.au3>
    #include <class\iTunes.au3>
    #include <class\mainGUI.au3>
    #include <class\random.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Array.au3>

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    Opt('GUIOnEventMode', 1)

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

    ;Objects
    Local $mainGUI = _new_mainGUI()
    Local $iTunes = _new_iTunes()
    Local $random = _new_Random()
    ;Vars
    Local $iWidth = @DesktopWidth
    Local $iHeight = @DesktopHeight
    Local $aOldSong[3]
    Local $hGraphic, $hImage, $iColor = 0xFF000000
    Local $sTempFile = @TempDir & '\' & $random.genTmpName()

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

    $iTunes.start()

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

    #region mainGUI
    $mainGUI.create()
    $mainGUI.setEvent($GUI_EVENT_CLOSE, '_exit')
    $mainGUI.setEvent($GUI_EVENT_PRIMARYDOWN, '_clickedLeftDown')
    $mainGUI.setEvent($GUI_EVENT_SECONDARYDOWN, '_clickedRightDown')
    $mainGUI.setState(@SW_SHOW)
    #endregion mainGUI

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

    _setCurrentInfo()
    AdlibRegister('_setCurrentInfo', 300)

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

    While 1
    Sleep(50)
    WEnd

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

    Func _setCurrentInfo()
    Local $aSongInfo = $iTunes.curGetInfo()

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

    If Not IsArray($aSongInfo) Or $aSongInfo[1] = '' Or _
    $aOldSong[0] == $aSongInfo[0] Or $aOldSong[1] == $aSongInfo[1] Or $aOldSong[2] == $aSongInfo[2] Then Return 0

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

    _GDIPlus_ImageDispose($hImage)

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

    FileDelete($sTempFile)

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

    $iTunes.curCoverGet($sTempFile)

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND(HWnd($mainGUI.getGUIHandle))
    _GDIPlus_GraphicsClear($hGraphic, $iColor)

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

    $hImage = _GDIPlus_ImageLoadFromFile($sTempFile)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, 2, 2) ;???????
    $iColor = _GDIPlus_GetPixel($hImage, 5, 5)
    _GDIPlus_GraphicsClear($hGraphic, $iColor)

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

    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, ($iWidth - $iHeight) / 2, 0, $iHeight, $iHeight)

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

    $aOldSong[0] = $aSongInfo[0] ;Album
    $aOldSong[1] = $aSongInfo[1] ;Artist
    $aOldSong[2] = $aSongInfo[2] ;Name
    EndFunc

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

    Func _clickedLeftDown()
    $iTunes.next()
    EndFunc

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

    Func _clickedRightDown()
    $iTunes.prev()
    EndFunc

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

    Func _exit()
    Exit
    EndFunc

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

    Func _GDIPlus_GetPixel($hBitmap, $X, $Y)
    Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapGetPixel", "ptr", $hBitmap, "int", $X, "int", $Y, "dword*", 0)
    If @error Then Return SetError(1, 0, 0)
    Return SetError($result[0], 1, $result[4])
    EndFunc ;==>_GDIPlus_GetPixel

    [/autoit]


    Ich denke mal, das lässt sich ganz simpel lösen, komme aber nicht drauf. :pinch:

    Beste Grüße


    DeepRed92


    Edit: Ups, Anhang vergessen.
    Edit2: Ach ja,in Zeile 75, 76 stimmen wie Werte nicht überein. Funktioniert trotz Anpassung auch nicht.

  • Hi!

    Erstens gibt es bei mir volgenden Fehler:
    C:\Dokumente und Einstellungen\lb304\Desktop\iTunesInterface\class\iTunes.au3 (55) : ==> Variable must be of type "Object".:
    $aInfo[0] = $oSelf.mainObject.CurrentTrack.Album
    $aInfo[0] = $oSelf.mainObject.CurrentTrack^ ERROR

    Zweitens habe ich hier eine Funktion, die ein Teil einer Bibliothek (die noch nicht fertig ist :D) von mir sein soll. Vielleicht hilfts dir.

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

    #Include <Color.au3>

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

    Func _Color_Average( $aColors, $iMode )

    If Not IsArray( $aColors ) Then Return SetError( 1, 0, False )

    Local $iTmpRed, $iTmpGreen, $iTmpBlue

    If $iMode = 0 Then

    For $i = 0 To UBound( $aColors ) - 1

    $iTmpRed += _ColorGetRed( $aColors[$i] )
    $iTmpGreen += _ColorGetGreen( $aColors[$i] )
    $iTmpBlue += _ColorGetBlue( $aColors[$i] )

    Next

    $iTmpRed /= UBound( $aColors )
    $iTmpGreen /= UBound( $aColors )
    $iTmpBlue /= UBound( $aColors )

    Return "0x" & Hex( Int( $iTmpRed ), 2 ) & Hex( Int( $iTmpGreen ), 2 ) & Hex( Int( $iTmpBlue ), 2 )

    ElseIf $iMode = 1 Then

    For $i = 1 To $aColors[0]

    $iTmpRed += _ColorGetRed( $aColors[$i] )
    $iTmpGreen += _ColorGetGreen( $aColors[$i] )
    $iTmpBlue += _ColorGetBlue( $aColors[$i] )

    Next

    $iTmpRed /= UBound( $aColors )
    $iTmpGreen /= UBound( $aColors )
    $iTmpBlue /= UBound( $aColors )

    Return "0x" & Hex( Int( $iTmpRed ), 2 ) & Hex( Int( $iTmpGreen ), 2 ) & Hex( Int( $iTmpBlue ), 2 )

    EndIf

    EndFunc

    [/autoit]

    BB - Grimbizo :)

    PS: Wenn du dich geduldest ist das ganze bald eine C/C++ DLL für ein au3 Plugin ;)

  • Zitat


    C:\Dokumente und Einstellungen\lb304\Desktop\iTunesInterface\class\iTunes.au3 (55) : ==> Variable must be of type "Object".:
    $aInfo[0] = $oSelf.mainObject.CurrentTrack.Album
    $aInfo[0] = $oSelf.mainObject.CurrentTrack^ ERROR


    Das liegt daran, dass auf deinem PC kein iTunes installiert ist (Das sollte auch so bleiben! :D).
    Daher ist dem System das iTunes-Objekt, auf dessen Eigenschaften (mainObject.CurrentTrack.Album) hier zugegriffen wird, nicht bekannt, und es gibt einen Fehler, weil das Objekt nie erzeugt wurde.

    lg