Checken ob Bild schwarz

  • Hallo

    Ich mache mit dem Webcamscript ausm englischen Forum Snapshots von einer Videocapture-Karte.
    Das Preview-Bild wird im GUI angezeigt und dann als JPG abgespeichert.
    Falls nun kein Videosignal anliegt, ist das Bild schwarz und das will ich erkennen.

    Momentan löse ich das mit PixelGetColor, jedoch versagt diese Methode, wenn das GUI minimiert ist :(

    Zweite Möglichkeit wäre die Dateigröße abzufragen, denn schwarze Jpg´s sind in der Regel kleiner als bunte...

    Fallen euch noch weitere/bessere Möglichkeiten ein?

    thx
    Eukalyptus

    • Offizieller Beitrag

    Wie gut ist denn die Regelmäßigkeit der schwarzen Bilder?
    Kann man vielleicht mit einem Dateivergleich arbeiten? Du nimmst Dir eines der schwarzen Bilder und vergleichst es mit dem aktuellen. Vielleicht klappt das ja.

    Edit: Mir ist gerade noch eine Möglichkeit eingefallen. Ich hatte mal eine Funktion (FaTolStrComp00.AU3 fehlertoleranter Zeichenkettenvergleich für AutoIT3) in meine Sammlung aufgenommen. Mit der funktioniert der Vergleich. Sogar wenn sich die Bilder unterscheiden. Um wieviel sie sich unterscheiden dürfen, kannst Du festlegen.
    Die Funktion findest Du hier: Fehlertoleranter Zeichenkettenvergleich für AutoIT3

  • Hi

    Ja, natürlich...
    Ich weiß nur nicht, wie Jpg´s aussehen...

    Ich werd nun das Bild einfach als Bmp abspeichern und dann auslesen.
    Das geht erheblich leichter als Jpg.

    thx

    EDIT:
    Folgende Funktion ist für meine Zwecke ausreichend, also Problem gelöst ;)

    [autoit]

    $hFile=FileOpen(@ScriptDir & "\Test.bmp",16)
    $sPIC=FileRead($hFile)
    FileClose($hFile)

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

    If _CheckBlack($sPIC,10) = True Then
    MsgBox(0,"","Bild ist schwarz")
    Else
    MsgBox(0,"","Bild ist OK")
    EndIf

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

    Func _CheckBlack($BMP,$Trs=10,$Steps=10)
    $BMP=StringTrimLeft($BMP,110)
    Local $Cnt=StringLen($BMP)/6-Mod(StringLen($BMP)/6,6)
    $BMP=StringRight($BMP,6 * $Cnt)
    Local $R, $G, $B, $BCnt=0, $CCnt=0
    For $i=0 To $Cnt-1 Step $Cnt/$Steps
    $B=Int("0x" & StringMid($BMP,$i*6+1,2))
    $G=Int("0x" & StringMid($BMP,$i*6+3,2))
    $R=Int("0x" & StringMid($BMP,$i*6+5,2))
    If $B < $Trs And $G < $Trs And $R < $Trs Then
    $BCnt+=1
    Else
    $CCnt+=1
    EndIf
    Next
    If $BCnt>=$CCnt Then
    Return True
    Else
    Return False
    EndIf
    EndFunc

    [/autoit]