kostenloser Webspace werbefrei: lima-city


Prüfen ob zwei Bilder identisch sind

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    simon-d

    Kostenloser Webspace von simon-d

    simon-d hat kostenlosen Webspace.

    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.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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")
  4. Autor dieses Themas

    simon-d

    Kostenloser Webspace von simon-d

    simon-d hat kostenlosen Webspace.

    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 Adresse
    http://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.
  5. g****e

    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
  6. Autor dieses Themas

    simon-d

    Kostenloser Webspace von simon-d

    simon-d hat kostenlosen Webspace.

    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
    es funktioniert
    zurück.

    MfG. Simon D.
  7. matthias-detsch

    Kostenloser Webspace von matthias-detsch

    matthias-detsch hat kostenlosen Webspace.

    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
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!