Mastershrimp: Bild online verkleinern und ausgeben

Heyho!

Ich hoffe, ich verscheuche nicht alle potentiellen Helfer mit der Größe des Postinges - es sind nur 2 große Code-Teile mit etwas Text ;-). Es sieht also größer aus als es in Wirklichkeit ist.

Vorneweg: Um die eigentliche Realisierung einer solchen Funktion geht es nicht - die habe ich bereits mithilfe von Archiv, SelfPHP und dem deutschen PHP Manual halbwegs hingekriegt.

Das Ganze scheitert momentan nur ein einem simplen Problem: Das Bild, das ich ausgebe, lässt sich nicht abspeichern.
Mozilla (Rechtsklick-> Grafik speichern unter) speichert eine HTML-Datei ab und der IE kann die JPEG-Datei nur in einer BMP-Datei abspeichern.

Das ist der besagte Code:

======================================
<?php
$datei         = $_FILES['image']['tmp_name'];

$bild_info     = getimagesize($datei);
$bild_w        = $bild_info[0];
$bild_h        = $bild_info[1];

$width  = $_POST['breite']; //Breite des endgültigen Bildes in px
$height = $_POST['hoehe'];  //Höhe des endgültigen Bildes in px
$quali  = $_POST['quali'];  //Qualität der Komprimierung zwischen 1 und 100 (1 = starke Komprimierung; 100 = hohe Qualität)

$html_head = "";

if($quali=="" || $quali < 1 || $quali > 100)
  { echo $html_head . "Der Grad der Qualität muss zwischen 1 und 100 liegen!"; exit; }

if($width=="" || $height=="")
  { echo $html_head . "Es wurden keine Ziel-Maße übergeben!"; exit; }

if($bild_w=="" && $bild_info[2]!="2")
  { echo $html_head . "Das ist kein Bild oder kein JPEG-Bild!"; exit; }

$quell_datei = imagecreatefromjpeg($datei);
$ziel_datei  = imagecreate($width,$height);

$resize_datei = imagecopyresized($ziel_datei,$quell_datei,0,0,0,0,$width,$height,$bild_w,$bild_h);

header("Content-Type: image/jpeg");
$ausgabe = imagejpeg($ziel_datei,"",$quali);
?>

In einem anderen Forum hat man mir dann zu folgender Prozedur geraten, die aber daran scheitert, dass das Bild nur temporär abgespeichert wird (was ja auch so sein soll) und beim erneuten Aufrufen des Scripts nicht mehr vorhanden ist:

  1. Formular sendet Bild an image_resize_script.php
  2. image_resize_script.php gibt einen <src>-Tag aus, dessen Quelle wieder die image_resize_script.php ist, allerdings mit dem Parameter ?action=ausgabe.
  3. Bekommt das Script diesen Parameter, verkleinert es das Bild und gibt es aus - Aber das Bild ist ja schon längst wieder weg, weil die Funktion erneut aufgerufen wurde.

Hier der Code:

<?php

$datei         = $_FILES['image']['tmp_name'];

$bild_info     = getimagesize($datei);
$bild_w        = $bild_info[0];
$bild_h        = $bild_info[1];

$width  = $_POST['breite']; //Breite des endgültigen Bildes in px
$height = $_POST['hoehe'];  //Höhe des endgültigen Bildes in px
$quali  = $_POST['quali'];  //Qualität der Komprimierung zwischen 1 und 100 (1 = starke Komprimierung; 100 = hohe Qualität)

if($_GET['action']=="ausgabe")
 {
  $html_head = "";

if($quali=="" || $quali < 1 || $quali > 100)
   { echo $html_head . "Der Grad der Qualität muss zwischen 1 und 100 liegen!"; exit; }

if($width=="" || $height=="")
   { echo $html_head . "Es wurden keine Ziel-Maße übergeben!"; exit; }

if($bild_w=="" && $bild_info[2]!="2")
   { echo $html_head . "Das ist kein Bild oder kein JPEG-Bild!"; exit; }

$quell_datei = imagecreatefromjpeg($datei);
  $ziel_datei  = imagecreate($width,$height);

$resize_datei = imagecopyresized($ziel_datei,$quell_datei,0,0,0,0,$width,$height,$bild_w,$bild_h);

header("Content-Type: image/jpeg");
  $ausgabe = imagejpeg($ziel_datei,"",$quali);
 }
else
 { echo "<img src='" . basename($_SERVER["PHP_SELF"]) . "?action=ausgabe'>"; }
?>

FAZIT: Ich weiß nicht, ob man beim 2. Lösungsweg nocht etwas retten kann...Am liebsten wäre es mir, wenn es einen anderen Weg geben würde, der auf dem ersten Script basiert.
Wichtig ist nur, dass das Bild _nicht_ auf dem Server abgespeichert werden soll.

Ich hoffe ich habe mit diesem Riesen-Posting nicht alle möglichen Beantworter vergrault und würde mich freuen, wenn mir jemand einen Tipp geben könnte wie man das Problem aus Code1 oder Code2 beseitigen könnte.

Vielen Dank schonmal für eure bis hierhin aufgebrachten Mühen!

Gruß

Mastershrimp

--
Kämpft für die Rettung von dem Genitiv!
  1. Hi,

    Das Ganze scheitert momentan nur ein einem simplen Problem: Das Bild, das ich ausgebe, lässt sich nicht abspeichern.
    Mozilla (Rechtsklick-> Grafik speichern unter) speichert eine HTML-Datei ab und der IE kann die JPEG-Datei nur in einer BMP-Datei abspeichern.

    das liegt übrigens genauso daran, dass zu dem Zeitpunkt, an dem du das Bild speichern möchtest, die temporäre Datei nicht mehr vorhanden ist. Die Browser wollen die Datei beim Speichern also erneut vom Server laden, d.h. das Script wird auf dem Server erneut ausgeführt - diesmal gibt es die Datei $_FILES['image']['tmp_name'] allerdings nicht, da kein Upload erfolgte. Also liefert dein Script eine Fehlermeldung, was der Mozilla als text/html erkennt und daher eine HTML-Datei speichern möchte - der IE scheint zu merken, dass du die Grafik haben möchtest und, obwohl sie nicht mehr auf dem Server verfügbar ist, bietet er sie dir aus dem Cache an - den Content-Type vergisst er dabei aber.

    [...]
    Am liebsten wäre es mir, wenn es einen anderen Weg geben würde, der auf dem ersten Script basiert.
    Wichtig ist nur, dass das Bild _nicht_ auf dem Server abgespeichert werden soll.

    Du könntest die rohen Bilddaten nach dem Upload in einer Sessionvariablen speichern und diese dann als Quelle für die Größenänderung verwenden. Die Daten in der Session müssten dann auch bei der 2. Anfrage noch vorhanden sein.

    Gruß,
    Andreas.

    1. Heyho!

      Erstmal vielen Dank für die Antwort! Ich weiß jetzt zumindest schonmal,  woran das alles liegt.

      Du könntest die rohen Bilddaten nach dem Upload in einer Sessionvariablen speichern und diese dann als Quelle für die Größenänderung verwenden. Die Daten in der Session müssten dann auch bei der 2. Anfrage noch vorhanden sein.

      Leider habe ich noch nie mit Session-Variablen gearbeitet...
      Brauche ich fortschrittliche Kenntnisse, um deine Lösung mit Sessionvariablen zu lösen? Oder ist das 1 Handgriff? Wenn letzteres zutrifft - könntest du den ganz kurz posten oder mir einen Tutorial-Link geben?

      Eine alternative Lösung wäre dann ja auch, dass ich die Datei zwar abspeichere, bei der nächsten Benutzung des Scripts aber dann prüfe, ob noch Dateien von früheren Benutzungen übrig sind und diese ggf. dann lösche...

      Mir pers. würde das mit der Sessionvariable besser gefallen. Habe ich dich richtig verstanden, dass ich quasi den "Quellcode" des Bildes in der Sessionvariable speichere? Könnte ich den mit readfile() aus der Bild-Ressource ($ziel_datei) holen?

      Gruß

      Mastershrimp

      --
      Kämpft für die Rettung von dem Genitiv!
      1. Hallo!

        Ich bin's nochmal.

        Ich stehe gerade irgendwie auf dem Schlauch: Die bearbeitete Bild-Datei liegt mir ja nur als Ressource vor - wie kann ich davon die Binärdaten auslesen? fread() benötigt ja die Dateigröße. filesize() wiederrum benötigt den Pfad - den ich ja nicht habe. Habe ja nur die Ressource ID...

        Was mach ich da?

        Habe mich übrigens ein bisschen in Sessions eingelesen.
        Mit session_start() beginnt man eine. Unter $_SESSION['datei_inhalt'] könnte ich die Binärdaten speichern und auslesen. Muss ich dann beim 2. Aufrufen der Funktion die Session wieder aufnehmen? Das soll ja auch irgendwie mit session_start() gehen - aber wie übergebe ich die Session-ID an session_start()?
        Oder muss ich die nicht wieder aufnehmen und kann die Variable einfach unter $_SESSION['datei_inhalt'] abfragen?

        Und wenn ich die Binärdaten habe gebe ich die einfach mit
          header("Content-Type: image/jpeg");
          $ausgabe = imagejpeg($ziel_datei,"",$quali);
        aus. Also so wie im 2. Versuch, oder? Das müsste ja gehen...

        Bleiben also nur noch die kleinen Session-Fragen und die Frage mit fread()

        Könntest du mir da nochmal helfen? Bitte *bettel* :D

        Gruß

        Mastershrimp

        --
        Kämpft für die Rettung von dem Genitiv!
        1. Heyho, ich bins noch ein letztes Mal für heute.

          Habe jetzt versucht, das mit den Sessionvariablen hinzukriegen - klappt irgendwie nicht. Wahrscheinlich benutze ich sie falsch. Da ich aber innerhalb eines jpeg-Headers nicht prüfen kann, ob die Variablen da sind, muss ich mich wieder an euch wenden...

          Das mit dem Datei-Auslesen habe ich mittlerweile hingekriegt. Ich habe einfach die temporäre Datei _vor_ der Bearbeitung ausgelesen und in die Variable getan.

          Lange Rede, kurzer Sinn - hier der Code, der _nicht_ funktioniert:

          ================================

          <?php
          $action = $_GET['action'];

          if($action=="ausgabe")
           {
            session_start();
            $datei         = $_SESSION['datei_inhalt'];

          $bild_info     = getimagesize($datei);
            $bild_w        = $bild_info[0];
            $bild_h        = $bild_info[1];

          $width   = $_GET['breite'];  //Breite des endgültigen Bildes in px
            $height  = $_GET['hoehe'];   //Höhe des endgültigen Bildes in px
            $quali   = $_GET['quali'];   //Qualität der Komprimierung zwischen 1 und 100 (1 = starke Komprimierung; 100 = hohe Qualität)
            $prozent = $_GET['prozent']; //Prozentuale Veränderung

          if($prozent!="")
             {
              $prozent  = $prozent/100;
              $width    = $bild_w * $prozent;
              $height   = $bild_h * $prozent;
             }

          $html_head = "<html>\n<head>\n<title>Bild Ausgabe</title>\n</head>\n<body>\n";
            $html_tail = "\n</body>\n</html>";

          if($quali=="" || $quali < 1 || $quali > 100)
             { echo $html_head . "Der Grad der Qualität muss zwischen 1 und 100 liegen!" . $html_tail; exit; }

          if($width=="" || $height=="")
             { echo $html_head . "Es wurden keine Ziel-Maße übergeben!" . $html_tail; exit; }

          if($bild_w=="" && $bild_info[2]!="2")
             { echo $html_head . "Das ist kein Bild oder kein JPEG-Bild!" . $html_tail; exit; }

          $quell_datei = imagecreatefromjpeg($datei);
            $ziel_datei  = imagecreatetruecolor($width,$height);

          $resize_datei = imagecopyresampled($ziel_datei,$quell_datei,0,0,0,0,$width,$height,$bild_w,$bild_h);

          $interlace    = imageInterlace($ziel_datei,1); //Interlacing-Funktion: 0 = aus; 1 = 1

          header("Content-Type: image/jpeg");
            $ausgabe = imagejpeg($ziel_datei,"",$quali);
           }

          else
           {
            $width   = $_POST['breite'];  //Breite des endgültigen Bildes in px
            $height  = $_POST['hoehe'];   //Höhe des endgültigen Bildes in px
            $quali   = $_POST['quali'];   //Qualität der Komprimierung zwischen 1 und 100 (1 = starke Komprimierung; 100 = hohe Qualität)
            $prozent = $_POST['prozent']; //Prozentuale Veränderung

          $datei = $_FILES['image']['tmp_name'];
            $temp  = fopen($datei,"r");
            $temp  = fread($temp,filesize($datei));

          session_start();
            $_SESSION['datei_inhalt'] = $temp;

          echo "<img src='" . basename($_SERVER["PHP_SELF"]) . "?action=ausgabe&amp;breite=" . $width . "&amp;hoehe=" . $height . "&amp;quali=" . $quali . "&amp;prozent=" . $prozent . "'>";
           }
          ?>

          ================================

          Kurze Erklärung:

          • Das Script wird ohne Parameter aufgerufen
          • Die hochgeladene, temporäre Datei wird ausgelesen und in die Sessionvariable gespeichert
          • ein IMG-Tag mit dem Script+Parameter "ausgabe" und diversen anderen Informationen wird ausgegeben
          • Der Aufruf des Scripts+Parameter sollte bewirken, dass die Sessionvariable (= die binären Datei-Daten) ausgelesen, bearbeitet und ausgegeben wird
          • Die Ausgabe erfolgt mit einem image/jpeg-Header, sodass innerhalb des img-Tags nun ein Bild erscheinen sollte....

          Nur klappt das nicht.

          Ich vermute folgende Fehlerquellen:

          1. Denkfehler im generellen Ablauf: Sind alle Variablen noch da, wenn sie da sein sollen?
          2. Session-Variable nicht mehr da: Wie kann ich eine Session wieder aufnehmen? Wie muss ich die Session-ID an session_start() übergeben? Im PHP-Manual steht nix darüber.
          3. Session-Sachen generell falsch angewendet: da ich noch nie vorher mit Sessions gearbeitet habe und auch nur sehr wenig darüber gelesen habe, würde ich nicht ausschließen wollen, dass ich mich da irgendwie vertippt habe (oder so). Könnte mir jemand in diesem Fall den korrekten Code zum Schreiben und wieder-Auslesen einer Sessionvariable posten? Wäre echt cool!
          4. Tippfehler im Code ;)

          Ich würde ja das Vorhandensein der Variablen gerne selber prüfen, aber ich kann ja keinen Text ausgeben, wenn der Browser Bild-Daten für den IMG-Tag erwartet...(schlecht formuliert, aber ich hoffe ich konnte es halbwegs deutlich beschreiben)

          Wie schon in den vorrausgehenden Postings gesagt, würde ich mich freuen, wenn mir jemand weiterhelfen könnte!

          Vielen Dank schonmal an alle, die sich bis hierher durchgekämpft haben!

          Gruß

          Mastershrimp

          1. Guten Morgen,

            ich schreibe erstmal, wie ich mir das (nach deinem ersten Plan) vorgestellt habe:

            <?php

            error_reporting(E_ALL);
            session_start();

            if (!isset($_SESSION['data']) && isset($_FILES['image'])) {

            // das Formular wurde gerade abgeschickt

            /**
                 * - deine ganzen Überprüfungen auf $_FILES['image']['tmp_name'] anwenden
                 * - Bilddaten mittels fread() aus $_FILES['image']['tmp_name'] auslesen und in $_SESSION['data'] speichern
                 * - Die Größe des Originals in den Session-Variablen 'oldWidth' und 'oldHeight' o.ä. speichern
                 * - die restlichen Formulardaten in den Session-Variablen 'newWidth', 'newHeight' und 'quali' o.ä. speichern
                 */

            }

            /**
             * hier stehen dir jetzt die Daten der Session zur Verfügung und
             * ich hoffe, dass sie das auch dann noch tun, wenn das Formular nicht
             * abgeschickt wurde, also nach dem Klick auf "Grafik speichern unter..."
             */

            // Ressourcen erstellen
            $quell_datei = imagecreatefromjpeg($_SESSION['data']);
            $ziel_datei  = imagecreate($_SESSION['newWidth'], $_SESSION['newHeight']);

            // Größe ändern
            imagecopyresized($ziel_datei, $quell_datei, 0, 0, 0, 0, $_SESSION['newWidth'], $_SESSION['newHeight'], $_SESSION['oldWidth'], $_SESSION['oldHeight']);

            // und ausgeben...
            header("Content-Type: image/jpeg");
            imagejpeg($ziel_datei, "", $_SESSION['quali']);

            ?>

            Ich bin mir nicht sicher, ob es so funktioniert und kann es hier leider nicht testen.

            Jetzt noch zu deinem Script:

            <?php
            $action = $_GET['action'];

            if($action=="ausgabe")
            {
              session_start();

            wie du oben siehst, reicht es aus, session_start() einmal an den Anfang der Datei zu schreiben. Die Session wird i.d.R. durch Cookies automatisch wieder aufgenommen.

            $datei         = $_SESSION['datei_inhalt'];

            $bild_info     = getimagesize($datei);

            das wird nicht funktionieren, da getimagesize() einen Dateinamen erwartet. Daher habe ich oben diese Werte ebenfalls in Session-Variablen gespeichert - bei diesem Versuch kannst du die natürlich auch über GET weitergeben.

            Der Rest sieht IMHO eigentlich ganz okay aus - ich denke, das könnte so funktionieren.

            Gruß,
            Andreas.

            1. Heyho!

              Vielen Dank erstmal für deine kontinuierlich-schnellen Antworten!

              Das mit dem getimagesize() ist mir nach Abschicken des Postings auch aufgefallen. Habe das dann einfach, so wie du schon sagtest, _vorher_ gemacht.
              Ich zeig dir einfach mal meinen Versuch, der leider immer noch _nicht_ klappt. Habe jetzt auch mal ein paar mehr Kommentare eingefügt ;)

              =====================================

              <?php

              /* Beim Lesen des folgenden Codes beginnt man am besten mit dem else{}-Bereich! */

              if($_GET['action']=="ausgabe")          //Wenn Param. ausgabe gesetzt ist, liefert Script den Inhalt des Bildes für den IMG-Tag unten
               {
                session_start();
                $datei   = $_SESSION['datei_inhalt']; //Enthält den Dateiinhalt der hochgeladenen Datei

              $width   = $_GET['breite'];  //Breite des endgültigen Bildes in px
                $height  = $_GET['hoehe'];   //Höhe des endgültigen Bildes in px
                $quali   = $_GET['quali'];   //Qualität der Komprimierung zwischen 1 und 100

              $quell_datei = imagecreatefromjpeg($datei); //Erstellt eine JPEG-Datei aus dem Dateiinhalt der hochgeladenen Datei
                $ziel_datei  = imagecreatetruecolor($width,$height);

              $resize_datei = imagecopyresampled($ziel_datei,$quell_datei,0,0,0,0,$width,$height,$bild_w,$bild_h); //Bildgröße anpassen

              $interlace    = imageInterlace($ziel_datei,1); //Interlacing-Funktion: 0 = aus; 1 = an

              header("Content-Type: image/jpeg");            //Ausgabe des Bildes, welches dann per IMG-Tag (s.u.) angezeigt wird
                $ausgabe = imagejpeg($ziel_datei,"",$quali);
               }

              else
               {
                $width   = $_POST['breite'];  //Breite des endgültigen Bildes in px
                $height  = $_POST['hoehe'];   //Höhe des endgültigen Bildes in px
                $quali   = $_POST['quali'];   //Qualität der Komprimierung zwischen 1 und 100
                $prozent = $_POST['prozent']; //Prozentuale Veränderung

              $datei = $_FILES['image']['tmp_name']; //Die hochgeladene Datei

              $bild_info     = getimagesize($datei);
                $bild_w        = $bild_info[0];
                $bild_h        = $bild_info[1];

              if($prozent!="") //Ggf. relative Anpassung der Seitenverhältnisse
                 {
                  $prozent  = $prozent/100;
                  $width    = $bild_w * $prozent;
                  $height   = $bild_h * $prozent;
                 }

              $html_head = "<html>\n<head>\n<title>Bild Ausgabe</title>\n</head>\n<body>\n";
                 $html_tail = "\n</body>\n</html>";

              if($quali=="" || $quali < 1 || $quali > 100)
                  { echo $html_head . "Der Grad der Qualität muss zwischen 1 und 100 liegen!" . $html_tail; exit; }

              if($width=="" || $height=="")
                  { echo $html_head . "Es wurden keine Ziel-Maße übergeben!" . $html_tail; exit; }

              if($bild_w=="" && $bild_info[2]!="2")
                  { echo $html_head . "Das ist kein Bild oder kein JPEG-Bild!" . $html_tail; exit; }

              $temp  = fopen($datei,"r");             //Hochgeladene Datei wird geöffnet...
                $temp  = fread($temp,filesize($datei)); //...und ausgelesen

              session_start();
                $_SESSION['datei_inhalt'] = $temp; //Dateiinhalt der hochgeladenen Datei wird in einer Sessionvariable abgespeichert

              //Ein IMG-Tag wird ausgegeben, über den die Funktion erneut aufgerufen wird und diesmal die Bilddaten ausgibt
                echo "<img src='" . basename($_SERVER["PHP_SELF"]) . "?action=ausgabe&amp;breite=" . $width . "&amp;hoehe=" . $height . "&amp;quali=" . $quali . "'>";
               }
              ?>

              =====================================

              Das Ganze lässt sich hier: http://mastershrimp.com/test/php/resize/image_resize_upload.php ansehen und ausprobieren.

              Benutze ich die Session-Sachen richtig? Nehme ich die Session richtig wieder auf? Sendet der Browser schon Daten, bevor er den Header ausgibt? All das würde ja einen Fehler erklären...

              Btw.: Sehe ich das richtig, dass ich in dem if($_GET['action]=="ausgabe")-Teil keinerlei Fehlerabfrage machen kann?

              Siehst du noch einen Fehler? Vielleicht in der Syntax?

              Gruß

              Mastershrimp

              --
              Kämpft für die Rettung von dem Genitiv!
              1. Hallo!

                Habe kurz noch einen Bug gefunden und verbessert:
                Im Ausgabe-Teil waren die Maße des Originalbildes nicht vorhanden. Habe sie nun als GET-Parameter mit übergeben. Der aktuelle Code wäre also:

                ===========================
                <?php

                /* Beim Lesen des folgenden Codes beginnt man am besten mit dem else{}-Bereich! */

                if($_GET['action']=="ausgabe")          //Wenn Param. ausgabe gesetzt ist, liefert Script den Inhalt des Bildes für den IMG-Tag unten
                 {
                  session_start();
                  $datei   = $_SESSION['datei_inhalt']; //Enthält den Dateiinhalt der hochgeladenen Datei

                $width   = $_GET['new_w'];   //Breite des endgültigen Bildes in px
                  $height  = $_GET['new_h'];   //Höhe des endgültigen Bildes in px
                  $bild_w  = $_GET['old_w'];   //Breite des Originalbildes
                  $bild_h  = $_GET['old_h'];   //Höhe des Originalbildes
                  $quali   = $_GET['quali'];   //Qualität der Komprimierung zwischen 1 und 100

                $quell_datei = imagecreatefromjpeg($datei); //Erstellt eine JPEG-Datei aus dem Dateiinhalt der hochgeladenen Datei
                  $ziel_datei  = imagecreatetruecolor($width,$height);

                $resize_datei = imagecopyresampled($ziel_datei,$quell_datei,0,0,0,0,$width,$height,$bild_w,$bild_h); //Bildgröße anpassen

                $interlace    = imageInterlace($ziel_datei,1); //Interlacing-Funktion: 0 = aus; 1 = an

                header("Content-Type: image/jpeg");            //Ausgabe des Bildes, welches dann per IMG-Tag (s.u.) angezeigt wird
                  $ausgabe = imagejpeg($ziel_datei,"",$quali);
                 }

                else
                 {
                  $width   = $_POST['breite'];  //Breite des endgültigen Bildes in px
                  $height  = $_POST['hoehe'];   //Höhe des endgültigen Bildes in px
                  $quali   = $_POST['quali'];   //Qualität der Komprimierung zwischen 1 und 100
                  $prozent = $_POST['prozent']; //Prozentuale Veränderung

                $datei = $_FILES['image']['tmp_name']; //Die hochgeladene Datei

                $bild_info     = getimagesize($datei);
                  $bild_w        = $bild_info[0];
                  $bild_h        = $bild_info[1];

                if($prozent!="") //Ggf. relative Anpassung der Seitenverhältnisse
                   {
                    $prozent  = $prozent/100;
                    $width    = $bild_w * $prozent;
                    $height   = $bild_h * $prozent;
                   }

                $html_head = "<html>\n<head>\n<title>Bild Ausgabe</title>\n</head>\n<body>\n";
                   $html_tail = "\n</body>\n</html>";

                if($quali=="" || $quali < 1 || $quali > 100)
                    { echo $html_head . "Der Grad der Qualität muss zwischen 1 und 100 liegen!" . $html_tail; exit; }

                if($width=="" || $height=="")
                    { echo $html_head . "Es wurden keine Ziel-Maße übergeben!" . $html_tail; exit; }

                if($bild_w=="" && $bild_info[2]!="2")
                    { echo $html_head . "Das ist kein Bild oder kein JPEG-Bild!" . $html_tail; exit; }

                $temp  = fopen($datei,"r");             //Hochgeladene Datei wird geöffnet...
                  $temp  = fread($temp,filesize($datei)); //...und ausgelesen

                session_start();
                  $_SESSION['datei_inhalt'] = $temp; //Dateiinhalt der hochgeladenen Datei wird in einer Sessionvariable abgespeichert

                //Ein IMG-Tag wird ausgegeben, über den die Funktion erneut aufgerufen wird und diesmal die Bilddaten ausgibt
                  echo "<img src='" . basename($_SERVER["PHP_SELF"]) . "?action=ausgabe&amp;new_w=" . $width . "&amp;new_h=" . $height . "&amp;old_w=" . $bild_w . "&amp;old_h=" . $bild_h . "&amp;quali=" . $quali . "'>";
                 }
                ?>

                Funktioniert leider immer noch nicht :-/

                Das kaputte Bild hat die URL http://mastershrimp.com/test/php/resize/image_resize_script.php?action=ausgabe&new_w=200&new_h=200&old_w=650&old_h=500&quali=100

                Also muss der Fehler entweder im Datei-Auslesen (Nicht genug Rechte? Würde PHP da nicht meckern?) oder im "Ausgabe"-Teil sein, oder?

                Ich habe nun folgende Vermutung:
                imagecreatefromjpeg():
                "imagecreatefromjpeg --  Erzeugt ein neues Bild im JPEG-Format, welches aus einer Datei oder von einer URL gelesen wird.
                int imagecreatefromjpeg ( string filename)"
                Das kriegt ja schonmal keinen Pfad, sondern nur den Dateiinhalt. Das ist wahrscheinlich schon der erste Fehler. Aber wie mache ich das dann? Ich muss den Dateiinhalt in eine temporäre Datei schreiben und dann den Zeiger dieser Datei an den Rest weitergeben. Ich denke das ist der Fehler.

                Aber wie mache ich das?

                Gruß

                Mastershrimp

                1. Hi,

                  Ich habe nun folgende Vermutung:
                  imagecreatefromjpeg():
                  "imagecreatefromjpeg --  Erzeugt ein neues Bild im JPEG-Format, welches aus einer Datei oder von einer URL gelesen wird.
                  int imagecreatefromjpeg ( string filename)"
                  Das kriegt ja schonmal keinen Pfad, sondern nur den Dateiinhalt. Das ist wahrscheinlich schon der erste Fehler.

                  ja - stimmt. Das ist definitiv ein Fehler.

                  Aber wie mache ich das dann? Ich muss den Dateiinhalt in eine temporäre Datei schreiben und dann den Zeiger dieser Datei an den Rest weitergeben. Ich denke das ist der Fehler.

                  nein, das brauchst du nicht, denn es gibt noch die Funktion imagecreatefromstring() (http://de3.php.net/manual/en/function.imagecreatefromstring.php), die müsste dafür die richtige sein.

                  Gruß,
                  Andreas.

                  1. Hallo Andreas!

                    Es klappt!! Endlich! Ich war kurz vor'm Verzweifeln ;)

                    Unabhängig zu deiner letzten Lösung hatte ich das Problem mit dem Pfad und dem Dateiinhalt mit einer temporären Datei gelöst. Das klappte zwar auch, aber es ist nicht so elegant wie deine Lösung. Habe diese jetzt umgesetzt und ausprobiert - und es funktioniert einwandfrei.

                    Mozilla speichert eine JPEG-Datei ab.

                    Allerdings speichert der IE nach wie vor nur eine BMP-Datei ab. Sowohl bei deiner, als auch bei meiner Lösung. Ist mir pers. im Prinzip egal - mich würde nur interessieren, warum er das macht. Außerdem nutzen ein Großteil meiner User den IE....es wäre also auch für sie ein Vorteil, wenn man das verhindern könnte.

                    Weißt du vielleicht, woran das liegt?

                    Vielen Dank für deine bisherige (und zukünftige?) Hilfe!

                    Gruß

                    Mastershrimp

                    1. Hi,

                      Allerdings speichert der IE nach wie vor nur eine BMP-Datei ab. Sowohl bei deiner, als auch bei meiner Lösung. Ist mir pers. im Prinzip egal - mich würde nur interessieren, warum er das macht. Außerdem nutzen ein Großteil meiner User den IE....es wäre also auch für sie ein Vorteil, wenn man das verhindern könnte.

                      Weißt du vielleicht, woran das liegt?

                      ich habe ja anfangs geglaubt, die Browser würden die Datei nochmal vom Server anfordern, was im Falle der Nicht-Existenz des $_FILES-Arrays scheitern würde. Das ist aber Quatsch (warum sollten die Browser die Datei erneut anfordern?) - weiß auch nicht, was mich da geritten hat ;-)

                      Ich weiß es einfach nicht. Ich habe heute nachmittag ein paar Sachen getestet, bin der Sache aber noch nicht wirklich auf den Grund gekommen.

                      Gruß,
                      Andreas.

                      1. Ich weiß es einfach nicht. Ich habe heute nachmittag ein paar Sachen getestet, bin der Sache aber noch nicht wirklich auf den Grund gekommen.

                        Naja. In einem anderen Forum hat man das als IE-Bug abgestempelt...
                        Ich werde die Frage einfach nochmal als extra-Thema in ein paar Tagen stellen (wenn das hier im Archiv gelandet ist).
                        Momentan sieht das für mich auch schwer nach einem Bug aus. Zumal es in Mozilla ja funktioniert.

                        Schade ist es allerdings schon, weil ich eigentlich die Funktion für eine andere Funktion geschrieben habe, die nur JPEG-Dateien akzeptiert. Und ich bezweifele, dass derjenige, für den ich das alles mache (neben mir selber natürlich ;) ), Mozilla hat.

                        Vielen vielen Dank auf jeden Fall schonmal für deine Mühen! Falls dir noch was zu dem Bug (oder Codefehler?) einfällt, würde ich mich freuen, wenn du das hier rein posten könntest.

                        Jeder andere ist natürlich ebenso willkommen ;)

                        Gruß

                        Mastershrimp

                        --
                        Kämpft für die Rettung von dem Genitiv!