Pixelgetcolor sehr langsam

  • Hallo Leute ich bin gerade dabei ein kleines Ambilight zu basteln und brauche dafür ein codeschnipsel, dass mir den linken und rechten Bildschirmrand analysiert und darraus einen Mittelwert berechnet. Diese Mittelwerte sollen dann per serielle Schnittstelle an ein kleine Mikrocontroller board gesendet werden.
    Ich habe mal ein kleines Codeschnipsel für den linken Rand geschrieben und naja das dauer einfach vieeeeelll zu lange:

    [autoit]

    #include <array.au3>
    Dim $farbe[31][101]

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

    $time = TimerInit()

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

    For $i = 0 To 30
    For $p = 0 To 100
    $farbe[$i][$p] = PixelGetColor($i*10, $p*10)
    ;ToolTip($i & $p)
    Next
    Next
    MsgBox(0,"llalal", timerdiff($time))

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


    Das dauer bei mir 104! sekunden
    Das muss doppelt ablaufen und dann mit ca 20fps, gibts mit Autoit da eine Möglichkeit oder muss ich auf was anderes umsteigen?

    Danke schonmal :D

  • Ich weis ja nicht was du für einen Computer hast auf meinem altertümlichen Notebok aus dem Jahre 2003 läuft das ganze in 63.4865604427378 ms durch,

    mfg autobert

  • Abend, ist es denn nötig so viele Pixel abzufragen? im Normalfall spiegelt das Ambilight doch immer den Rand des Bildes wieder d.h. du kannst doch Pro Bildseite also Links, Rechts, Oben und ggf Unten zb 20 Abfragen machen mit einem Abstand von 100 Pixeln oder so, so detailgenau gibt das Ambilight doch die Seitenränder überhaupt nicht wieder, ist zumindest bei unserem Phillips Tv nicht der Fall dass jeder Pixel auf dem Ambilight abgebildet wird^^

    Gruß Marvin

  • waaas ?!
    Ich habe einen Pc von 2010 mit quadcore und 4ghz pro KERN und 8gb Ram :D
    hat jemand ne Ahnung wieso das bei mir soo langsam ist?

    edit:
    Das im Code ist ja auch der linke Bildrand und später soll der Farbdurchschnitt aus all diesen Pixeln dann berechnet werden.

  • ja es liegt definitiv an aero, wenn ich auf windows standart design umschalte, braucht das script nurnoch 60msec :) hat jemand ne Idee wie das auch mit Win7 schnell läuft?

  • Ich würde einen Screenshot machen und die Pixel aus dem Bitmap auslesen.
    Das sollte auch mit Aero schnell gehen... kanns aber grad nicht testen

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    _GDIPlus_Startup()

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

    HotKeySet("{ESC}", "_Exit")

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

    While 1
    $iTimer = TimerInit()
    $aFarbe = _GetScreenPixels()
    ConsoleWrite(Round(TimerDiff($iTimer), 1) & " ms" & @CRLF)
    WEnd

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

    Func _GetScreenPixels()
    Local $hBMP = _ScreenCapture_Capture()
    Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)

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

    Local $iW = _GDIPlus_ImageGetWidth($hBitmap)
    Local $iH = _GDIPlus_ImageGetHeight($hBitmap)

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

    Local $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    Local $Stride = DllStructGetData($BitmapData, "Stride")
    Local $Width = DllStructGetData($BitmapData, "Width")
    Local $Height = DllStructGetData($BitmapData, "Height")
    Local $Scan0 = DllStructGetData($BitmapData, "Scan0")
    Local $PixelData = DllStructCreate("uInt[" & $Width * $Height & ']', $Scan0)
    Local $iOff, $aColor[31][101]

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

    For $i = 0 To 30
    $iOff = ($i * 10) * $Width
    For $p = 0 To 100
    $aColor[$i][$p] = DllStructGetData($PixelData, 1, $iOff + ($p * 10) + 1)
    Next
    Next
    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
    _GDIPlus_BitmapDispose($hBitmap)
    _WinAPI_DeleteObject($hBMP)

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

    Return $aColor
    EndFunc ;==>_GetScreenPixels

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

    Func _Exit()
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • wow danke für das Script :)
    kommt leider nicht ganz an das Getpixel script ran :( Das aus dem 1. Beitrag etwas optimiert dauer bei mir ca 2ms und deins 80ms aber trotzdem danke :D