Prüfen ob zwei Bilder identisch sind
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anspruch
anwendungsfall
bevorzugen
bild
code
datei
entsprechenden dateien
erzeugen
farbe
folgendem beispiel
funktion
header
identische bilder
inhalt
kopie
pixel
sparen
unterschiedliche bilder
url
vergleichen
-
Hallo!
Ich wollte einmal fragen, ob es möglich ist, mit PHP zwei Bilder insofern miteinander zu vergleichen, dass festgestellt werden kann, ob zwei Bilder identisch sind.
Mit identisch meine ich natürlich den Inhalt (die Pixel) und die Größe.
Ich habe bereits nach "php feststellen ob bilder identisch" gegoogled aber nichts gefunden. Die Bilder, die ich vergleichen möchte sind JPG-Dateien.
Ich hoffe ihr wisst eine Antwort auf meine Frage.
MfG. Simon D. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wie möchtest du denn "identische" Bilder erzeugen?
Falls du eine Kopie der Datei meinst, ist es wohl das einfachste, den Inhalt der entsprechenden Dateien zu vergleichen. Das geht z.B. über Hashwerte.
hash_file("sha512", "Bild1.JPG") == hash_file("sha512", "Bild2.JPG")
-
Hallo und danke für die erste Antwort!
fuerderer schrieb:
Wie möchtest du denn "identische" Bilder erzeugen?
Es geht darum, dass auf einem anderen Server ein PHP-Script ein Bild erzeugt also z. B. mit der Adressehttp://www.example.org/bild.php?xy=xyz
fuerderer schrieb:
Falls du eine Kopie der Datei meinst, ist es wohl das einfachste, den Inhalt der entsprechenden Dateien zu vergleichen. Das geht z.B. über Hashwerte.
hash_file("sha512", "Bild1.JPG") == hash_file("sha512", "Bild2.JPG")
Ich versuche das mal, hoffentlich funktioniert es auch, wenn das dynamisch generiert wurde.
MfG. Simon D. -
Sofern das eine Bild eine KOPIE des anderen ist, also bitweise exakt gleich erzeugt wird, kannst du es mit Hashes wie beschrieben machen.
Sind es allerdings 2 unterschiedliche Bilder (in meinem folgendem Beispiel PNG und JPG) geht das natürlich nicht.
$areTheSame = true; $jpegAttr = getimagesize("example.jpg"); $pngAttr = getimagesize("example.png"); if ($jpegAttr[0] == $pngAttr[0] /*sind die weiten gleich*/ && $jpegAttr[1] == $pngAttr[1] /*sind die höhen gleich*/) { $jpeg = imagecreatefromjpeg("example.jpg"); $png = imagecreatefrompng("example.jpg"); for ($x=0;$x<$jpegAttr[0] && $areTheSame;$x++) { for ($y=0;$y<$jpegAttr[1];$y++) { if (imagecolorat($jpeg, $x, $y) != imagecolorat($png, $x, $y) /*wenn die pixel unterschiedlich sind*/) { $areTheSame = false; break; } } } imagedestroy($jpeg); imagedestroy($png); } else { $areTheSame = false; }
(ungetestet)
Damit wird pixelweise verglichen, ob die Farben der Pixel übereinstimmen.
Je nach Anwendungsfall, wollt ich dies nur noch einmal beifügen, weil du schriebest, dass du den Inhalt prüfen möchtest, und so könnten auch die Header anders sein (exif), und es wäre gleich.
Denk allerdings dran, dass dabei wirklich JEDER Pixel durchgegangen wird. Bei 8MegaPixel sind das 8Millionen durchläufe, was erhebliche Zeit in anspruch nimmt.
Man könnte auch statt getimagesize() die Funktion imagesx und imagesy nehmen, das kommt in meinen Augen aber auf den Anwendungsfall an. Wenn du die Bilder bereits geladen hast, sind die zweiten beiden Funktionen besser, um speicher zu sparen, wenn du die Bilder noch nicht geladen hast, würd ich allerdings die erste Funktion bevorzugen.
Liebe Grüße -
Hallo!
Ich habe es nun getestet:
if(hash_file("sha512", "bild.jpg") == hash_file("sha512", "http://simon-d.de/bild.php?bla=blabla")) { echo("es funktioniert"); } else { echo("es funktioniert nicht"); }
Da ich das erzeugte Bild gespeichert hatte, wusste ich, dass sie übereinstimmten (die Bilder). Danke für die Antworten!
Das Programm gab natürlich
zurück.es funktioniert
MfG. Simon D. -
ggamee schrieb:
Sofern das eine Bild eine KOPIE des anderen ist, also bitweise exakt gleich erzeugt wird, kannst du es mit Hashes wie beschrieben machen.
Sind es allerdings 2 unterschiedliche Bilder (in meinem folgendem Beispiel PNG und JPG) geht das natürlich nicht.
$areTheSame = true; $jpegAttr = getimagesize("example.jpg"); $pngAttr = getimagesize("example.png"); if ($jpegAttr[0] == $pngAttr[0] /*sind die weiten gleich*/ && $jpegAttr[1] == $pngAttr[1] /*sind die höhen gleich*/) { $jpeg = imagecreatefromjpeg("example.jpg"); $png = imagecreatefrompng("example.jpg"); for ($x=0;$x<$jpegAttr[0] && $areTheSame;$x++) { for ($y=0;$y<$jpegAttr[1];$y++) { if (imagecolorat($jpeg, $x, $y) != imagecolorat($png, $x, $y) /*wenn die pixel unterschiedlich sind*/) { $areTheSame = false; break; } } } imagedestroy($jpeg); imagedestroy($png); } else { $areTheSame = false; }
(ungetestet)
Damit wird pixelweise verglichen, ob die Farben der Pixel übereinstimmen.
Je nach Anwendungsfall, wollt ich dies nur noch einmal beifügen, weil du schriebest, dass du den Inhalt prüfen möchtest, und so könnten auch die Header anders sein (exif), und es wäre gleich.
Denk allerdings dran, dass dabei wirklich JEDER Pixel durchgegangen wird. Bei 8MegaPixel sind das 8Millionen durchläufe, was erhebliche Zeit in anspruch nimmt.
Man könnte auch statt getimagesize() die Funktion imagesx und imagesy nehmen, das kommt in meinen Augen aber auf den Anwendungsfall an. Wenn du die Bilder bereits geladen hast, sind die zweiten beiden Funktionen besser, um speicher zu sparen, wenn du die Bilder noch nicht geladen hast, würd ich allerdings die erste Funktion bevorzugen.
Liebe Grüße
du könntest doch das bild erst in jpeg umwandeln und dann vergleichen ,oder?
//$new_org_file ist der Pfad zur Datei $png_file = imagecreatefrompng($new_org_file);
Beitrag zuletzt geändert: 1.1.2014 16:05:07 von matthias-detsch -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage