Gustl: Thumbnails mit PHP

Also da der letzte Thread eine Diskussion von Therapie-Bedürftigen auslöste, hier ein neuer, weil ich möchte dass das Forums-Archiv auch was davon hat.

Felix Riester schrieb:

Kompliment, das ist mal eine wirklich unmissverständliche Problembeschreibung! (ernst gemeint!) Da kann man jetzt ansetzen.

Also das Bild wird hochgeladen und dein Script "nimmt es entgegen" und speichert es vorläufig ab. Danach wird das Bild resized, um es auf eine vernünftige Auflösung zu verkleinern. Danach wir es in den endgültigen Bestimmungs-Ordner gespeichert. - Fertig!

Und in PHP...? Ich habe folgendes Script für unsere Schulhomepage programmiert, da auf der Startseite Bilder von Unterseiten angezeigt werden sollen, diese aber mit einer festen maximalen Auflösung (wird als Variablen übergeben). Wie man sehen kann, legt das Script eine neue Bilddatei an, da auf unserer Page das Original nicht verändert werden soll. Ich poste Dir hier meinen Code. Möge er Dir nützen:

// Funktion zum Verkleinern eines Bildes, sofern die Maße des Bildes
// die maximal erlaubten Maße übersteigen.

function thumbnail_erstellen($bildpfad, $dateiname, $maxx, $maxy)
      {
      if($bildpfad == "") return;
      // Bilddatei ausmessen
      $bildtyp = exif_imagetype($bildpfad);
      $bilddimensionen = getimagesize($bildpfad);
      $originalx = $bilddimensionen[0];
      $originaly = $bilddimensionen[1];

switch($bildtyp)
         {
         case IMAGETYPE_JPEG:
         $bild = imagecreatefromjpeg($bildpfad);
         break;

case IMAGETYPE_GIF:
         $bild = imagecreatefromgif($bildpfad);
         break;

case IMAGETYPE_PNG:
         $bild = imagecreatefrompng($bildpfad);
         break;

default:
         $bild = imagecreatetruecolor($maxx, $maxy);
         }

// Skalierung vornehmen
      $ratio = $originalx / $originaly;

if($bilddimensionen[0] > $maxx)
         {
         $bilddimensionen[0] = $maxx;
         $bilddimensionen[1] = floor($maxx / $ratio);
         }
      if($bilddimensionen[1] > $maxy)
         {
         $bilddimensionen[1] = $maxy;
         $bilddimensionen[0] = floor($maxy * $ratio);
         }

// Thumbnail erstellen
      $thumbnail = imagecreatetruecolor($bilddimensionen[0], $bilddimensionen[1]);
      imagefill($thumbnail, 0, 0, 0xFFFFFF); // white color (#FFFFFF)
      imagecopyresampled($thumbnail, $bild, 0, 0, 0, 0, $bilddimensionen[0], $bilddimensionen[1], $originalx, $originaly);

// Thumbnail abspeichern
      if(strpos($dateiname, " ") > 0) $dateiname = substr($dateiname, 0, strpos($dateiname, " "));
      $thumbnail_datei = substr($bildpfad, 0, strpos($bildpfad, "../w")+2)."/images/tn_".strtolower($dateiname).".jpg"; // Das wist Du anders lösen.
      $thumbnail_datei_test = fopen($thumbnail_datei, "wb+");
      fclose($thumbnail_datei_test);
      imagejpeg($thumbnail, $thumbnail_datei);
      imagedestroy($thumbnail);
      }

Liebe Grüße aus Ellwangen,

Felix Riesterer.

  1. Hallo Felix, also das hab ich jetzt gefunden. Funzt zwar nur auf jpg aber ich werd versuchen das ding noch umzubauen.

    <?php

    $thumbsize=100;
       $imgfile = "P F A D";
       header('Content-type: image/jpeg');
       list($width, $height) = getimagesize($imgfile);
       $imgratio=$width/$height;
       if ($imgratio>1){
         $newwidth = $thumbsize;
         $newheight = $thumbsize/$imgratio;}
       else{
         $newheight = $thumbsize;
         $newwidth = $thumbsize*$imgratio;}
       $thumb = ImageCreateTrueColor($newwidth,$newheight);
       $source = imagecreatefromjpeg($imgfile);
       imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    imagejpeg($thumb,"P F A D",50);

    print "Script durchlaufen<br><br><img src="P F A D">";

    ?>

    1. Jetzt noch ne Frage: Wie setzt man Sprungmarken in PHP, so wie ichs von Perl kenne ?

      in Perl:

      if (blabla eq blabla) { make bla; goto nachdort;}

      blabla ...

      nachdort: (in Perl läuft das Script ab 'nachdort:' weiter, wie sag ichs PHP ? mein Buch gibt darüber nix her !

      1. echo $begrüßung;

        Jetzt noch ne Frage: Wie setzt man Sprungmarken in PHP, so wie ichs von Perl kenne ?

        Es gibt keine allgemeinen Sprungmarken in PHP.

        echo "$verabschiedung $name";

        1. Schön, bestätigt, es gibt wirklich keine Sprungmarken in PHP. Danke.

          Nächstes Problem:

          Ich habe das Script zum Upload jetzt so im Einsatz (da ich nur jpg und gif zum upload zulasse:

          Der Browser MSIE (6) bricht mir aber den Upload ab, wenn ich dateien verwende die z.b. 1500 kb gross sind. der depp sagt, es konnte keine verbindung hergestellt werden. teste ich mit 500 kb, gehts in ordnung. woran kann das nun wieder liegen ?

          copy($upload, "$datei_verz/$upload_name") or die ("Kopiervorgang nicht möglich");

          if ( $upload_type == "image/pjpeg" )
            {
            $thumbsize=400; $imgfile = $bildpfad; header('Content-type: image/pjpeg'); list($width, $height) = getimagesize($imgfile);
               $imgratio=$width/$height; if ($imgratio>1){ $newwidth = $thumbsize; $newheight = $thumbsize/$imgratio;} else{
                 $newheight = $thumbsize; $newwidth = $thumbsize*$imgratio;} $thumb = ImageCreateTrueColor($newwidth,$newheight);
               $source = imagecreatefromjpeg($imgfile); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            imagejpeg($thumb,$bildpfad,50);
            }

          if ( $upload_type == "image/gif" )
            {
            $thumbsize=400; $imgfile = $bildpfad; header('Content-type: image/gif'); list($width, $height) = getimagesize($imgfile);
               $imgratio=$width/$height; if ($imgratio>1){ $newwidth = $thumbsize; $newheight = $thumbsize/$imgratio;} else{
                 $newheight = $thumbsize; $newwidth = $thumbsize*$imgratio;} $thumb = ImageCreateTrueColor($newwidth,$newheight);
               $source = imagecreatefromgif($imgfile); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            imagejpeg($thumb,$bildpfad,50);
            }

          1. Hallo Gustav,

            Der Browser MSIE (6) bricht mir aber den Upload ab, wenn ich dateien verwende die z.b. 1500 kb gross sind. der depp sagt, es konnte keine verbindung hergestellt werden. teste ich mit 500 kb, gehts in ordnung. woran kann das nun wieder liegen ?

            tritt dieses Verhalten nur im IE auf? Mit anderen Browsern kannst Du das Bild erfolgreich hochladen?

            Wieviel Speicher darf Dein Skript maximal in Anspruch nehmen? Kann es sein, dass Du bei der Bildverarbeitung an diese Grenze (Standardwert 8 MB) stösst? Bedenke bitte, dass z.B. bei der Verarbeitung von JPG-Dateien nicht die Dateigröße relevant ist, sondern die entpackte Größe, d.h. Anzahl der Pixel mal Farbtiefe.

            [... viel unleserlicher Code ...]

            Freundliche Grüße

            Vinzenz

            1. hi vinzenz, also ich hab es nicht mit max_file_size begrenzt, aber mir kam da ein anderer gedanke:

              vielleicht ist mein server begrenzt und ich hab mal in die php.ini

              upload_max_filesize = 5242880 , also 5 mb geschrieben. wirkt aber nicht.

              hab ich den eintrag falsch ? vielleicht heissts:

              upload_max_filesize 5242880 oder upload_max_filesize "5242880" oder ..

              weisst du wie das genau geschrieben werden muss ?

              danke - gustl

              1. Abschliessend: Script läuft !

                1.) Firefox sendet an PHP den Mime-Type image/jpeg. MSIE sendet image/pjpeg. Ich habe also mein Script so gebaut, als wären es 2 verschiedene Mime-Typen.

                2.) Die Unterbrechung der Übertragung bei grossen Files über 1 MB ist noch nicht geklärt. Fest steht aber, dass sie an anderen Standorten sowohl bei MSIE als bei Firefox NICHT abbricht. An den Ressourcen (memory_limit) und an upload_max_filesize lag es nicht.

                3.) Ein Freund von mir hatte die o.g. Werte in der php.ini gesetzt. Herr Superschlau hat aber auch das selbe in die Apache.config geschrieben. Folge: Apache lies sich nicht mehr starten. Alle Tests mussten fehlschlagen. Hab ihm den Hals umgedreht, jetzt schaut er nach hinten :-)

                Danke auch noch für den Hinweis mit der example.com .

                Der Vorteil an diesem Forum ist, dass man lernt ohne es eigentlich zu wollen.

                1. Lieber Gustl,

                  Abschliessend: Script läuft !

                  Ich gratuliere! Das ist wunderbar.

                  MSIE sendet image/pjpeg.

                  Ich hasse den IE immer mehr... und ich harre schon wütend der verfluchten Nachfolgeversion, die in Sachen Standards keine Besserung verspricht! Da ist es ja dann schon ein Hohn, auf den 7-er zu "upgraden", was die Unwissenden vor dem PC eh nicht tun werden.

                  Der Vorteil an diesem Forum ist, dass man lernt ohne es eigentlich zu wollen.

                  Vorteil - ja, ganz bestimmt. "Ohne es zu wollen" - ganz sicher nicht. Ich möchte immer dazulernen!

                  Alles Gute für Dein weiteres Projekt!

                  Liebe Grüße aus Ellwangen,

                  Felix Riesterer.

                  1. Hallo Felix.

                    Ich hasse den IE immer mehr... und ich harre schon wütend der verfluchten Nachfolgeversion, die in Sachen Standards keine Besserung verspricht!

                    Doch, versprochen wird einiges.

                    Einen schönen Sonntag noch.

                    Gruß, Ash*feel free*ura

                    --
                    Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
                    30 Days to becoming an Opera8 Lover -- Troubleshooting
                    Meine Browser: Opera 8.50 | Firefox 1.0.7 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
                    Use OpenOffice.org
    2. Lieber Gustl,

      was soll dieses neue Script? Mir scheint, Du hast weder das Script von mir, noch das von Dir neu gepostete wirklich von seinem Ablauf her verstanden! Deine Frage nach Sprungmarken á la "goto" scheinen mir Recht zu geben.

      Es ist sicherlich sinnvoller, wenn Du mal wirklich versuchst, _ein_ Script wirklich zu begreifen, damit Du die Funktionsweise Deinen Vorstellungen entsprechend anpassen bzw. ändern kannst.

      Sowohl in meinem, als auch in dem von Dir gefundenen Script ist das "Herzstück" für die Thumbnail-Generierung die PHP-Funktion imagecopyresized(). Um diese Funktion erfolgreich einsetzen zu können bedarf es einiger Vorarbeit. Und die wird von den beiden Scripten, die Du nun hast, unterschiedlich geleistet.

      Studiere beide Scripte, um endlich das Problem lösen zu können! Eine genauere Beschreibung des "Fehlerfalles" hilft uns hier im Forum weiter, denn dann können wir Dir eher sagen, welcher Teil des Scriptes noch nicht wie beabsichtigt läuft. Und es hilft auch sehr, wenn Du für dieses Problem zunächst wirklich nur bei der Thumbnail-Geschichte bleibst. Upload-Probleme, bzw. Speicherbegrenzungen können wir erst im nächsten Anlauf lösen.

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

      1. Guten Morgen Felix,

        es ist ein Kreuz mit Hobby-Bastlern wie mich , stimmt´s ? Meine subversive Reizung anfangs war falsch. Werde mir das zukünftig verkneifen.

        Ich bin ein praktisch orientierter Mensch und für mich zählt einzig und alleine das Ergebnis. Trotzdem denke ich, dass ich den Ablauf der Scripte einigermassen verstanden habe, aber ich gebe Dir Recht dass meine Kenntnisse sehr oberflächlich sind. Ich bin kein gelernter Programmierer. Es ist nur ein Hobby.

        Also mein Verständnis:

        Dem Grunde nach messen beide Scripte das Original-Bild aus, setzen es in Relation zur Kantenlänge wieder zusammen und speichern es mit dem gewünschten Namen und dem gewünschten Typ (*.jpg) erneut ab.

        Dein Script macht das erst, wenn bestimmte Kantenlängen überschritten werden. Der Bildtyp wird bei Dir exif_imagetype ausgelesen, ich prüfs mit if ($upload_type == "image/..."){ } und sende den entsprechenden header einfach mit. Mein Script gibt beim Speichern noch die (ich nenne es Dichte) an. Dein Script ist eine Funktion.

        Wie aber z.B: imagecopyresized oder ImageCreateTrueColor genau funktioniert, also was im Server da GENAU abläuft weiss ich nicht. Dazu fehlt mir das Grundwissen.

        Mein kleines Script war FÜR MICH zum Verständnis sehr wichtig, Deins ist wesentlich intelligenter.

        Ich habe das kleine jetzt mal testweise verwendet, es läuft gut und bringt für mich zufriedenstellende Ergebnisse.

        Das neue Problem, dass jetzt auftritt ist, dass (ich verwende MSIE 6, bitte nicht schimpfen aber den verwenden die meisten Internet-Nutzer und für die Nutzer bau ich es ja) beim Upload-Versuch von Bildern (ich habe bisher nur jpg getestet) über ca. 1 MB die Meldung bringt, dass die Verbindung zur Seite nicht hergestellt werden kann. Is ne blöde Meldung. Bricht PHP die Verbindung ab wenn upload_max_filesize überschritten wird ? scheint so.

        Wenn es also um die entpackte Grösse -wie Vinzenz berichtet- geht, also die Anzahl der Pixel mal Farbtiefe, überschreite ich mit Sicherheit den Wert upload_max_filesize, der gesetzt ist. Den weiss ich aber nicht. Wenn ich davon ausgehe, dass Vinzenz mit seinen 8MB richtig liegt muss ich ihn erhöhen. ich habe in meinem confixx eine rubrik "httpd-spezial" . da muss das rein, vermute ich. ich schreibe also rein: upload_max_filesize = 20971520 (20 MB). es tut sich aber nichts, der fehler ist noch da. hab ich den eintrag falsch gechrieben ?

        da stehe ich jetzt und weiss nicht mehr weiter.

        1. Lieber Gustl,

          Ich habe das kleine jetzt mal testweise verwendet, es läuft gut und bringt für mich zufriedenstellende Ergebnisse.

          das hört sich gut an! :-)

          Das neue Problem, dass jetzt auftritt ist, dass (ich verwende MSIE 6, bitte nicht schimpfen aber den verwenden die meisten Internet-Nutzer und für die Nutzer bau ich es ja) beim Upload-Versuch von Bildern (ich habe bisher nur jpg getestet) über ca. 1 MB die Meldung bringt, dass die Verbindung zur Seite nicht hergestellt werden kann. Is ne blöde Meldung. Bricht PHP die Verbindung ab wenn upload_max_filesize überschritten wird ? scheint so.

          Du bist dem Forum immer noch die Antwort schuldig, was unter Verwendung eines anderen Browsers passiert! Es wäre sehr hilfreich zu wissen, ob z.B. im Firefox der selbe Effekt eintritt, oder ob eben nicht. Probiere das doch bitte einmal aus und poste Deine Erfahrung hier!!

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

          1. Habe mit Mozilla Firefox 1.07 DAS KLEINE Script getestet.

            Ergebnis Firefox: Die GRAFIK "http://www.xxx.com/test.php" kann nicht angezeigt werden, weil sie Fehler enthält. (Gut, akzeptiert)
            Ergebnis MSIE: Läuft

            Test des FELIX-Script:
            Ergebnis Firefox: Das Script läuft ergebnislos durch, heisst: kein Bild wird neu erstellt.
            Ergebnis MSIE: dito

            Test des aktuell im Portal laufenden Script: (in diesem verarbeite ich zusätzlich die vom formular mitgelieferten $upload_name , $upload_type , $upload_size)

            Ergebnis Firefox: Leere Seite.
            Ergebnis MSIE: läuft bis 1 MB Dateigrösse, dann Unterbrechung der Verbindung

            REGISTER_GLOBALS ist in der Apache-Konfig OFF, weils bei ON mit MSIE nicht läuft.

            MAX_UPLOAD_SIZE steht seit heute in der php.ini auf 20 MB, memory_limit auf -1 (unbegrenzt). An dem lags ja dann nicht.

            Hilft uns dieses Ergebnis weiter ?

            1. Hallo

              Ergebnis Firefox: Die GRAFIK "http://www.xxx.com/test.php" kann nicht angezeigt werden, weil sie Fehler enthält. (Gut, akzeptiert)

              Na, na. Gehört Dir die Domäne xxx.com? Wahrscheinlich nicht. Verwende Sie deswegen auch nicht.

              Verwende für Beispiele lieber z.B. example.com, die ist genau dafür da.

              Test des aktuell im Portal laufenden Script: (in diesem verarbeite ich zusätzlich die vom formular mitgelieferten $upload_name , $upload_type , $upload_size)

              Ergebnis Firefox: Leere Seite.
              Ergebnis MSIE: läuft bis 1 MB Dateigrösse, dann Unterbrechung der Verbindung

              REGISTER_GLOBALS ist in der Apache-Konfig OFF

              Das ist eine gute Einstellung. Bitte lass sie so.

              weils bei ON mit MSIE nicht läuft.

              Die Begründung hab' ich noch nie gehört.

              MAX_UPLOAD_SIZE steht seit heute in der php.ini auf 20 MB, memory_limit auf -1 (unbegrenzt). An dem lags ja dann nicht.

              Hilft uns dieses Ergebnis weiter ?

              Welchen Wert besitzt ERROR_REPORTING?
              Welche Fehler fängst Du an welchen Stellen ab?
              Hast Du Dich schon einmal mit dem Kapitel http://www.php.net/manual/de/security.errors.php beschäftigt?

              Ein Link auf den Quelltext Deines Skriptes wäre hilfreich, falls dieser leserlicher ist als der von mir kritisierte.

              Freundliche Grüße

              Vinzenz

        2. Hallo Gustav,

          Wenn es also um die entpackte Grösse -wie Vinzenz berichtet- geht, also die Anzahl der Pixel mal Farbtiefe, überschreite ich mit Sicherheit den Wert upload_max_filesize, der gesetzt ist. Den weiss ich aber nicht. Wenn ich davon ausgehe, dass Vinzenz mit seinen 8MB richtig liegt muss ich ihn erhöhen.

          An erster Stelle sollte, wie Felix Dir ebenfalls geraten hat, der Test auf Browserabhängig- bzw. -unabhängigkeit stehen.

          Mein weiterer Tipp bezieht sich nicht auf upload_max_filesize, sondern auf die Limitierung von Ressourcen, siehe http://www.php.net/manual/de/ini.sect.resource-limits.php.

          Freundliche Grüße

          Vinzenz

  2. Hallo Gustl,

    Also da der letzte Thread eine Diskussion von Therapie-Bedürftigen auslöste, hier ein neuer, weil ich möchte dass das Forums-Archiv auch was davon hat.

    Hmm, von der Sache her okay, das Thema nochmal neu aufzurollen - aber so wie du dein Posting hier angefangen hast, war das nicht besonders schlau. Die diversen "Nicht hilfreich"-Votings zeigen dir, dass dein Stil schon auf Missbilligung stößt. Auch wenn das Voting vom Grundsatz her anders gadacht ist. Aber das ist eine andere Geschichte.

    Besser wäre gewesen, du hättest als Startposting einfach nochmal deine Problemstellung formuliert und dabei "beiläufig" auf den bereits archivierten Thread verwiesen. Eventuell mit der Bemerkung, dass das eigentliche Problem ja noch nicht gelöst sei.
    So lese ich dein Posting und frage mich, "Toll, der zitiert einen kompletten fremden Beitrag von letzter Woche oder so, aber was will er nun eigentlich?"

    Felix Riester schrieb:

    Noch dazu hast du dem armen Felix ein "er" im Nachnamen unterschlagen: Er heißt Riesterer. Mit dem Rentenexperten hat er, glaube ich, nichts zu tun.

    So long,

    Martin

    1. ok, martin, du hast recht. damit hab ich mich auf das selbe niveau begeben.

      1. Lieber Gustl,

        ok, martin, du hast recht. damit hab ich mich auf das selbe niveau begeben.

        was die unvollständige Nennung meines Nachnamens angeht, so hast Du gerne meine Absolution. ;-) Daran störe ich mich nicht.

        Berechtigte Kritik am Eingangsposting hat Martin ja schon sehr sachlich und (meiner Meinung nach) richtig geäussert. - Aber hey, wir wollen Dein Problem lösen! Auf geht's.

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.