*Markus: Grafiken verkleinern bei zu großen Grafiken?

Hallo,

ich musste feststellen, dass bei viel zu großen Grafiken PHP mit der GD-Bibliothek Probleme hat, diese Grafiken zu verkleinern, aber wie verkleinere ich Grafiken, wenn diese nicht verkleinerbar sind? Ich kann es weder lokal noch auf meinem Webspace. Mir würde zwar nicht einfallen, Grafiken, die 1.5MB groß sind, mit PHP bearbeiten zu wollen, aber wenn dritte, wie Kunden, auf solche Ideen kommen, wüsste ich jetzt nicht, wie ich es verhindern soll.
Zur Zeit verwende ich folgende Klasse, um Bilder aus einem Orginalverzeichnis automatisch für ein Thumbnail-Verzeichnis verkleinern zu lassen:

  
  
<?php  
  
  
   class VorschaubildGenerator   {  
  
     private $verkleinerungsFaktor = 0.2;  
     private $vorschauFotoVerzeichnis = 'fotosPreview';  
  
//    Gibt das verkleinerte Bild zurück  
        public function minimizePicture($bigPicFilename, $year)   {  
         $sourceImage = '';  
         //Bild auslesen, Grafiktyp: 1=GIF, 2=JPG, 3=PNG, 4=SWF  
            list($width, $height, $grafiktyp) = getimagesize($bigPicFilename);  
            $new_width = $width * $this->verkleinerungsFaktor;  
   $new_height = $height * $this->verkleinerungsFaktor;  
  
   // Resample  
   $destImage = imagecreatetruecolor($new_width, $new_height);  
  
   if ($grafiktyp == 1)   { //GIF  
    $sourceImage = imagecreatefromgif($bigPicFilename);  
    imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $new_width, $new_height, $width, $height);  
    imagegif($destImage, $this->vorschauFotoVerzeichnis .  
                DIRECTORY_SEPARATOR .  
                $year .  
                DIRECTORY_SEPARATOR .  
                basename($bigPicFilename), 100);  
   }  
  
   if ($grafiktyp == 2)   {  //JPG  
    $sourceImage = imagecreatefromjpeg($bigPicFilename);  
    imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $new_width, $new_height, $width, $height);  
    imagejpeg($destImage, $this->vorschauFotoVerzeichnis .  
                DIRECTORY_SEPARATOR .  
                $year .  
                DIRECTORY_SEPARATOR .  
                basename($bigPicFilename), 100);  
   }  
   if ($grafiktyp == 3)   {  //PNG  
    $sourceImage = imagecreatefrompng($bigPicFilename);  
    imagecopyresampled($destImage, $sourceImage, 0, 0, 0, 0, $new_width, $new_height, $width, $height);  
    imagepng($destImage, $this->vorschauFotoVerzeichnis .  
                DIRECTORY_SEPARATOR .  
                $year .  
                DIRECTORY_SEPARATOR .  
                basename($bigPicFilename), 100);  
   }  
//   Den neuen Vorschaubildlink zurückliefern  
   return basename($bigPicFilename);  
        }  
   }  
?>  
  

Könnte ich hier irgendetwas einbauen, um mit dem Problem fertig zu werden?

--
  1. Hello,

    die GD-Lib hat keine Probleme, große Grafiken zu verkleinern.
    Du benötigst dafür allerdings genügend Speicher, weil die Funktionen den GD-Lib speicherorientiert arbeiten.

    Bei gepackten Formaten, wie JPG, PNG, GIF, compessed TIFF (das kann die GD sowieso nicht) zählt auch nicht der Speicherbedarf der gepackten Grafik, sondern ihre Ausmaße. Die GD-Lib arbeitet mit einem entpackten Pixel-Image, für das sie für jedes Pixel drei (RGB), bzw sogar vier Bytes Speicher benötigt.

    Du kannst also den Bedarf in etwa errechnen.

    Dabei benötigst Du den Platz für das entpackte Quellimage, das entpackte Zielimage, und wenn Du mit den "String"-Funktionen der GD arbeitest auch noch Platz für die Quell- und die Zieldatei im Speicher.

    m mit dem Problem fertig zu werden?
    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. Hi,

    ich musste feststellen, dass bei viel zu großen Grafiken PHP mit der GD-Bibliothek Probleme hat, diese Grafiken zu verkleinern,

    Du kannst sowas über eine .htaccess steuern - sofern Dein Provider das zulässt. Beispiel :
    php_value upload_max_filesize 4M
    php_value post_max_size 4M
    php_value max_execution_time 100
    php_value max_input_time 100
    php_value memory_limit 50M

    Diese Werte sind allerdings ziemlich grosszügig, denn sie stammen aus meiner Ego-Galerie ;-)
    Kunden würde ich natürlich erheblich stärker einschränken, und schon beim Upload eine entsprechende Fehlermeldung erzeugen.

    if ($grafiktyp == 3)...

    Das kann man übrigens etwas weniger aufwändig lösen und sich die Abfragen sparen:
    call_user_func ("imagecreatefrom" . $imgsuffix, $image);

    Ganz genial ist übrigens das unsharp mask script von Torstein Hønsi, da Bilder beim skalieren immer etwas unscharf werden. Du wendest es auf den handle an, den Dir imagecreatetruecolor zurückgibt, nachdem Du das Bild skaliert hineinkopiert hast.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. Hello Joachim,

      Ganz genial ist übrigens das unsharp mask script

      von Torstein Hønsi, da Bilder beim skalieren immer etwas unscharf werden.

      guter Tipp.
      Kannst Du die drei Parameter erklären und wie es funktioniert?

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi Tom,

        Kannst Du die drei Parameter erklären und wie es funktioniert?

        Er beschreibt das eigentlich recht gut im Script: Stärke des Effektes, Unschärferadius (der unscharfen Maske) und quasi der Schwellwert, ab dem der Schärfeeffekt greift. Letzterer stellt sicher, dass nicht leichte Kontraste plötzlich überbetont werden, sondern nur deutliche Kanten geschärft werden.

        Das sind im Grunde ja die gleichen Parameter wie beim Photoshop.

        Hey, bist Du umgezogen?

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Hello,

          Das sind im Grunde ja die gleichen Parameter wie beim Photoshop.

          Mit Grafiksoftware habe ich mich bisher nur nebenbei beschäftigt.
          Eine menschlich verständliche Beschreibung ist mir daher immer lieber :-)

          Hey, bist Du umgezogen?

          Nicht wirklich.
          Nur temporär, sozusagen.
          Bis Januar wird dieser Zustand noch anhalten und dann wird man sehen ...

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
    2. Hallo,

      php_value memory_limit 50M

      ich glaube, dass dies hier am besten zu meinem Problem passt. Allerdings scheint es bei mir nicht mal lokal zu funktionieren.
      Lokal habe ich folgendes getestet:

      Ich habe die .htaccess im Hauptverzeichnis des Webauftritts zu Testzwecken abgelegt mit
      php_value memory_limit 500M um ganz sicher zu gehen.
      Dennoch bleibt das Script davon unbeeindruckt, hmmm.

      Markus

      --
      1. Hello,

        Ich habe die .htaccess im Hauptverzeichnis des Webauftritts zu Testzwecken abgelegt mit
        php_value memory_limit 500M um ganz sicher zu gehen.
        Dennoch bleibt das Script davon unbeeindruckt, hmmm.

        Was heißt: "bleibt das Script davon unbeeindruckt"?

        Gibt es keine Fehlermeldungen?
        Wenn die GD-Lib auf out-of-Memory laufen würde, gäbe es eine Fehlermeldung.
        Hast Du die Fehlermeldungen zum Entwickeln auch alle eingeschaltet?

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. Hi,

        php_value memory_limit 50M

        ich glaube, dass dies hier am besten zu meinem Problem passt.

        nene, afaik brauchst Du alles, ich hatte das mal ausgetestet. Prüfe doch mal per phpinfo(), ob sich die Werte tatsächlich verändern.

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Hello,

          ich glaube, dass dies hier am besten zu meinem Problem passt.
          nene, afaik brauchst Du alles, ich hatte das mal ausgetestet. Prüfe doch mal per phpinfo(), ob sich die Werte tatsächlich verändern.

          Wenn die Dateien schon auf seiem Server parken, weil sie z.B. per FTP hochgeladen wurden, braucht er ja die Post-Methoden-Parameter nicht mehr. Dann reicht es vielleicht wirklich, die Speicherparameter hochzusetzen, und das dann auch nur für bestimmte Kunden und für das eine Script.

          Ich will damit sagen, er kann _innerhalb_ des Scriptes noch den Speicher hochsetzen, wenn der Serveradmin das nicht hart begrenzt hat. Und er kann das dann selbstverständlich sehr leicht von einer authentifizierung abhängig machen. --> z.B. kostenlose Umwandlung bis 160.000 Pixel Eingabeformat, alles was darübr liegt  nur gegen Account (und Billing).

          Liebe Grüße aus Syburg bei Dortmund

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de