Bilder vergleichen!

  • Hallo,
    ich steh mal wieder vor einem Problem.
    Ich möchte mehrere Bilder auf grafische Gleichheit überprüfen.
    Beide sind besitzen gleiche Größe und die gleichen Pixel. Ich möchte sie nicht über den Namen oder die Größe vergleichen, auch binär vergleichen funktionert nicht ganz korrekt, da beide PNG-Bilder verschiedene Autoren und Zusatztext beinhalten.
    Es gibt die Möglichkeit sie per GDI+ zu laden und Pixel für Pixel zu vergleichen aber dies wird bei 4000 x400 Bilder ein Jahr dauern...
    Im Anhang findet ihr 2 Beispiel Bilder, so und nun seid ihr dran ;)
    Mit freundlichen Grüßen Faweyr

  • Jub, bei der oben genannten Methode wäre es das klügste...

    Jeddoch hab ich vor das Zeug ihrgentwie binär auszulesen und davon nur die Pixel zu vergleichen, der eine Art Checksum anzuwenden...mal hoffen das jemand da mehr Ahnung hat... :(

  • Zitat

    Würde es nicht reichen, 20-50 zufällige Pixel zu vergleichen?


    Ich schätze nicht, da z.B. bei dem gegebenen Bild die "Augen" der Schnecke unterschiedlich
    "weit" (im Fortschritt gesehen) aufleuchten. Dieser Unterschied wäre minimal und die Treffwahrscheinlichkeit
    ist dementsprechend klein, dass man genau die besagten Pixel findet.

    Meine Idee:
    Wie wäre es mit einer Checksum?
    Bei PixelChecksum kannste ja auch recht präzise überprüfen, ob zwei Bereiche identisch sind...
    Wie du diesen Checksum umsetzt (da du das Bild sicherlich "im Hintergrund" überprüfen willst)
    weiss ich jedoch nicht...
    EDIT: Tja.. da hast du meine Idee offenbar schon vorgegriffen ...

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Hi

    so kannst du ziemlich schnell einen Pixelvergleich machen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

    _GDIPlus_Startup()
    $hImage1 = _GDIPlus_ImageLoadFromFile("hit1_0.png")
    $hImage2 = _GDIPlus_ImageLoadFromFile("0100100.png")

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

    $bData1 = _BitmapGetData($hImage1)
    $bData2 = _BitmapGetData($hImage2)

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

    Switch StringCompare($bData1, $bData2)
    Case 0
    MsgBox(0, "", "Bilder sind gleich")
    Case Else
    MsgBox(0, "", "Bilder sind unterschiedlich")
    EndSwitch

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

    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_Shutdown()

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

    Func _BitmapGetData($hBitmap)
    Local $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, _GDIPlus_ImageGetWidth($hBitmap), _GDIPlus_ImageGetHeight($hBitmap), $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    Local $Width = DllStructGetData($BitmapData, "Width")
    Local $Height = DllStructGetData($BitmapData, "Height")
    Local $Scan0 = DllStructGetData($BitmapData, "Scan0")
    Local $PixelData = DllStructCreate("ubyte[" & $Width * $Height * 4 & "]", $Scan0)
    Local $Data = DllStructGetData($PixelData, 1)
    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
    Return $Data
    EndFunc ;==>_BitmapGetData

    [/autoit]

    Die Bilder müssen aber tatsächlich komplett die gleichen Pixel besitzen

  • Jub, das funktioniert wunderbar :thumbup:
    nur die Compare-Funktion ist fehlerhaft, sie gab wohl immer False aus, obwohl beide Strings gleich waren..., durch ein "=" ersetzt und alles funzt wunderbar....
    Großes Lob an eukalyptus :rock: