Gerhard Knabe: Internet Explorer erzeugt Fehler in meiner Galerie

Beitrag lesen

Sofern Du PHP5 einsetzt, kannst Du folgenden Code verwenden. Das Beispiel liefert die Datei test.jpg in der Größe von 200 Pixeln zurück. Der Einsatz der gd-FUnktionen ist aber in anderen Versionen nicht anders.

<?php
  final class Image
  {
    private $m_Filename;
    private $m_Handle;
    private $m_ImageInfo;

public function __construct($filename)
    {
      $this->m_Filename = $filename;
      $this->m_Handle = null;
      $this->m_ImageInfo = null;
    }

public function __destruct()
    {
      if (is_resource($this->m_Handle))
        imagedestroy($this->m_Handle);
    }

public function __get($name)
    {
      switch ($name)
      {
        case "File":
          $value = $this->m_Filename;
          break;

case "IsValid":
          $value = (file_exists($this->m_Filename) && is_resource($this->__get("Handle")));
          break;

case "Width":
          if (is_null($this->m_ImageInfo))
            $this->m_ImageInfo = GetImageSize($this->m_Filename);
          $value = (int)$this->m_ImageInfo[0];
          break;

case "Height":
          if (is_null($this->m_ImageInfo))
            $this->m_ImageInfo = GetImageSize($this->m_Filename);
          $value = (int)$this->m_ImageInfo[1];
          break;

case "Handle":
          if (is_null($this->m_Handle) && file_exists($this->m_Filename))
          {
            if (is_null($this->m_ImageInfo))
              $this->m_ImageInfo = GetImageSize($this->m_Filename);
            switch ($this->m_ImageInfo[2])
            {
              case 1:
                $this->m_Handle = imagecreatefromgif($this->m_Filename);
                break;

case 2;
                $this->m_Handle = imagecreatefromjpeg($this->m_Filename);
                break;

case 3:
                $this->m_Handle = imagecreatefrompng($this->m_Filename);
                break;

default:
                throw new Exception("Image::Handle - Cannot load image from {$this->m_Filename}");
                break;
            }
          }
          $value = $this->m_Handle;
          break;

default:
          throw new Exception("Unknown property {$name}");
          break;
      }
      return($value);
    }

public function Write()
    {
      $size = (0 < func_num_args()) ? func_get_arg(0) : null;
      if (is_integer($size) && ($size < 100))
        $size = 100;
      $destroy = false;
      $handle = $this->Handle;
      if (is_integer($size) && ($size < max($this->Width, $this->Height)))
      {
        if ($this->Width < $this->Height)
        {
          $width = $this->Width * $size / $this->Height;
          $height = $size;
        }
        else
        {
          $height = $this->Height * $size / $this->Width;
          $width = $size;
        }
        $image = imagecreatetruecolor($width, $height);
        imagecopyresampled($image, $handle, 0, 0, 0, 0, $width, $height, $this->Width, $this->Height);
        $handle = $image;
        $destroy = true;
      }
      header("Content-type: image/jpeg");
      imagejpeg($handle);
      if ($destroy)
        imagedestroy($handle);
    }
  }

$image = new Image("test.jpg");
  $image->Write(200);
?>

Auf Basis dieses Codes kannst Du zwei Skripte erstellen, z.B. thumbnail.php und image.php, die jeweils die Miniaturansicht und die große Ansicht zurückgeben. Den Dateiname kannst Du mit Hilfe von Get-Variablen (z.B. $_GET["id"] und $_GET["no"]) ermitteln. Der Vorteil dieser Vorgehensweise ist, dass auch die Miniaturansichten dynamisch generiert werden können. Nachteil ist natürlich, dass das den Server stärker belastet, da er die Bilder bei jedem Abruf errechnen muss. Dem kann aber durch einen Caching Mechanismus vorgebeugt werden (zu Lasten des Festplattenplatzes, mann kann halt nicht alles haben).

Übrigens: Bei der Verarbeitung von URL-Parametern solltest Du auf jeden Fall ein Minimum an Parametervalidierung vornehmen, bevor Du diese in einer SQL-Anweisung verbaust. Andernfalls ist dein Code anfällig für SQL-Injection. Für deine URL Parameter würde ich wenigstens
$id = (int)$_GET["id"];
$no = (int)$_GET["no"];
schreiben, damit in $id und $no auch wirklich nur Zahlen drin stehen.

MfG
GK