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
Bilder vergleichen!
-
- [ offen ]
-
Faweyr -
30. Januar 2011 um 13:06 -
Geschlossen -
Erledigt
-
-
Würde es nicht reichen, 20-50 zufällige Pixel zu vergleichen?
-
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 ... -
Hi
so kannst du ziemlich schnell einen Pixelvergleich machen:
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
$hImage1 = _GDIPlus_ImageLoadFromFile("hit1_0.png")
$hImage2 = _GDIPlus_ImageLoadFromFile("0100100.png")$bData1 = _BitmapGetData($hImage1)
[/autoit] [autoit][/autoit] [autoit]
$bData2 = _BitmapGetData($hImage2)Switch StringCompare($bData1, $bData2)
[/autoit] [autoit][/autoit] [autoit]
Case 0
MsgBox(0, "", "Bilder sind gleich")
Case Else
MsgBox(0, "", "Bilder sind unterschiedlich")
EndSwitch_GDIPlus_ImageDispose($hImage1)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_ImageDispose($hImage2)
_GDIPlus_Shutdown()Func _BitmapGetData($hBitmap)
[/autoit]
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 ;==>_BitmapGetDataDie Bilder müssen aber tatsächlich komplett die gleichen Pixel besitzen
-
Jub, das funktioniert wunderbar
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