Enrico: Neue Skript-Version

Beitrag lesen

Hallo,

so, jetzt habe ich - hoffentlich - alle Anregungen umgesetzt, um das Skript sowohl durch direkten Aufruf mit hart eingegebenen Parametern zum Laufen zu bringen, als auch als src-Angabe für das Einbinden der verkleinerten Grafik im image-Tag:

   if (!isset ($_GET["G"]))
      die ("Es wurde keine zu verkleinernde Grafik angegeben");

   $Grafik = "../../IMG/" . $_GET["G"] . ".png"; // Vollständigen relativen Pfad erzeugen

   if (!file_exists ($Grafik))
      die ("Der Pfad zur zu verkleinernden Grafik ist fehlerhaft oder die zu verkleinernde Grafik existiert nicht");

   if (exif_imagetype ($Grafik) != IMAGETYPE_PNG)
      die ('Die zu verkleinernde Grafik ist keine "png"-Datei');

   if (!($Informationen = @getimagesize ($Grafik)))
      die ("Die Daten der zu verkleinernden Grafik konnten nicht ausgelesen werden");

   if (isset ($_GET["B"])) // Auf Breite verkleinern
      $Faktor = 80 / $Informationen[0];
   else
      if (isset ($_GET["H"])) // Auf Höhe verkleinern
         $Faktor = 100 / $Informationen[1];
      else
         die ("Die Angabe zur Verkleinerung der Grafik in der Höhe oder Breite fehlt");

   $Breite = round ($Informationen[0] * $Faktor);
   $Hoehe  = round ($Informationen[1] * $Faktor);

   $Kopie         = imagecreatefrompng ($Grafik);
   $Verkleinerung = imagecreatetruecolor ($Breite, $Hoehe);
   $Transparenz   = imagecolortransparent ($Kopie);

   if ($Transparenz != -1)
   {
      $Transparente_Farbe = imagecolorsforindex ($Kopie, $Transparenz);
      $Transparenz = imagecolorallocate ($Verkleinerung, $Transparente_Farbe["red"], $Transparente_Farbe["green"], $Transparente_Farbe["blue"]);
      imagefill ($Verkleinerung, 0, 0, $Transparenz);
      imagecolortransparent ($Verkleinerung, $Transparenz);
   }
   else
   {
      imagealphablending ($Verkleinerung, false);
      $Alpha = imagecolorallocatealpha ($Verkleinerung, 0, 0, 0, 127);
      imagefill ($Verkleinerung, 0, 0, $Alpha);
      imagesavealpha ($Verkleinerung, true);
   }

   imagecopyresampled ($Verkleinerung, $Kopie, 0, 0, 0, 0, $Breite, $Hoehe, $Informationen[0], $Informationen[1]);

   header ("Content-type: IMAGETYPE_PNG");
   imagepng ($Verkleinerung, null);

Der Aufruf im image-Tag erfolgt folgendermaßen:

echo '<img src="INC/Verkleinern.php?G=FotoEnricoGross&B">';

Ich übergebe nun nur noch ein Kennzeichen "B" oder "H", um die übergebene Grafik entweder in ihrer B(reite) oder H(öhe) zu verkleinern mit fest im Skript hinterlegten Werten.

Das Skript soll letztendlich beim Aufrufen einer anzuzeigenden Galerie auf jede Grafik in obig genannter Form die jeweilige Grafik verkleinern. Interaktionen von Besuchern sind ausdrücklich nicht vorgesehen.

Das Script schaut nach, ob schon ein generiertes Bild in der angefragten Größe im Dateisystem existiert. Wenn ja, wird dieses ausgeliefert. Wenn nein, wird es erstellt, im Dateisystem abgelegt und ausgeliefert.

Gunnar, Dein Ansatz zieht wohl darauf ab, dass ich, zusätzlich zu den vorhandenen großen Originalgrafiken, die verkleinerten Thumbnails erzeuge und auf dem Server ablege, oder habe ich Dich hier falsch verstanden?

und wenn man schon mal dabei ist, kann das Skript auch einen last_modified-Header mitsenden und beim Request prüfen, ob der Browser einen "If-Modified-Since" mitgesendet hat und den auswerten. Warum nochmal umwandeln und übertragen, wenn der Client das Bild schon hat?

Robert, Du gehst in die gleiche Richtung wie Gunnar? Oder kann ich diesen Mechanismus generell auf mein Vorhaben anwenden? Wenn ja, wie muss ich vorgehen?

Kann ich am Skript sonst noch etwas verbessern?

Gruß, Enrico