Torwächter: Bild öffnen, verkleinern - UND Speichern

Hallo zusammen,

ich möchte ein Bild öffnen, verkleinern und dann auch speichern, das Problem, mein Script speichert nicht:

Für eine Lösung wäre ich sehr dankbar.

Greetings
Master

<?php
header ("Content-type: image/jpeg");

//Die aufzurufende Datei
$file = "41-Master.jpg";

//Weite und Höhe des auszugebenden Bildes
$width  = 80;
$height = 100;

$scource     = imagecreatefromjpeg($file);
$destination = imagecreate($width, $height);

//Bild kopieren und resizen
imagecopyresized($destination, $scource, 0, 0, 0, 0, $width, $height, imagesx($scource), imagesy($scource));

//Bild finden und zerstoeren
imagejpeg($destination);
imagedestroy($destination);
?>

  1. //Bild finden und zerstoeren
    imagejpeg($destination);
    imagedestroy($destination);

    So mach ich es bei mir.

    ImageJPEG($bild,$destination);

    Und ich kann dir empfehlen, wenn die GDlib 2.x eingespielt ist
    imagecopyresampled();
    zu nutzen

    1. Hallo,

      ImageJPEG($bild,$destination);

      Da bringt er bei mir nur ein schwarzes Bild :(

      Greetings
      Master

      1. Moin!

        ImageJPEG($bild,$destination);

        Da bringt er bei mir nur ein schwarzes Bild :(

        Weil du (bzw. andi123) die Parameter vertauscht hast.

        Lies http://de3.php.net/manual/de/function.imagejpeg.php, da steht, wie du mit imagejpeg() ein Bild als Datei speichern kannst.

        - Sven Rautenberg

        --
        SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
        ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
        1. Hallo,

          Danke für deine Antwort.
          So ?:

          <?php
          header ("Content-type: image/jpeg");

          //Die aufzurufende Datei
          $file = "41-Master.jpg";

          //Weite und Höhe des auszugebenden Bildes
          $width  = 80;
          $height = 100;

          $scource     = imagecreatefromjpeg($file);
          $destination = imagecreate($width, $height);

          //Bild kopieren und resizen
          imagecopyresized($destination, $scource, 0, 0, 0, 0, $width, $height, imagesx($scource), imagesy($scource));

          //Bild finden und zerstoeren
          imagejpeg($destination,$file);
          //imagedestroy($destination);
          ?>

          1. Moin!

            Danke für deine Antwort.
            So ?

            Du darfst ein Bild auch gerne zweimal mit imagejpeg() ausgeben. Einmal in eine Datei, und einmal direkt an den Browser.

            Ich habe mir mal eine nette Funktion geschrieben, die mir aus den Bildern meiner Digitalkamera Thumbnails mit Bilddaten erzeugt:
            <img src="http://www.rtbg.de/images/kirschbluete.jpg" border="0" alt="">

            Die Funktion gibt die Thumbnails aus. Da mein Server (nicht der, von dem jetzt das Bild kommt) lahm ist (Pentium 90), und das Generieren des Thumbnails ewig dauert, lege ich einen Cache an. Weil das Skript aber immer ein Bild an den Browser senden muß, und nur wenn kein Cache-Bild vorhanden ist, es speichern soll, mache ich am Skriptende z.B. sowas:

            [...]
            // Speichern auf Festplatte
            imagePng($dst_img,$_SERVER['DOCUMENT_ROOT']."/albumtest/cache/".md5($_REQUEST['file'].$_REQUEST['orientation']));

            // Ausgabe an den Browser
            header("Content-type: image/png");
            header("Last-Modified: " . gmdate("D, d M Y H:i:s", filemtime($_SERVER['DOCUMENT_ROOT']."/albumtest/cache/".md5($_REQUEST['file'].$_REQUEST['orientation']))) . " GMT");
            header("Expires: " . gmdate("D, d M Y H:i:s", (time()+86400) ) . " GMT"); // Expires: 1 Tag von heute an.

            imagePng($dst_img);
            exit;
            ?>

            //Bild finden und zerstoeren
            imagejpeg($destination,$file);
            //imagedestroy($destination);

            Es erscheint mir an dieser Stelle bei deinem Skript aber als ungünstig, den Dateinamen der Originaldatei zu verwenden. Davon wird das Bild nicht besser, wenn es immer und immer wieder neu komprimiert und (wenn auch 1:1) verkleinert wird. Du solltest einen anderen Namen für den Thumbnail verwenden.

            - Sven Rautenberg

            --
            SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
            ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
            1. Hallo Sven

              Danke für deine Antwort.

              Ich habe schon per Perl das Bild(a) in ein extra verzeichnis kopiert und will nun mit PHP das Bild nur noch verkleinern (es soll/wird nur einmal verkleinert).

              Meinst Du, es gibt Probleme, wenn ich die alte Datei einfach überschreibe ?
              Soll ich vielleicht aus dem Ordner mit den Originalgroßen Bildern die Datei holen und dann verkleinert abspeichern ?
              (Ich wäre Dir sehr dankbar, wenn Du mir den Code ausbessern/verbessern könntest, da das mein erstes PHP-Script ist. Vielen Dank.

              Greetings
              Torwächter

              1. Moin!

                Ich habe schon per Perl das Bild(a) in ein extra verzeichnis kopiert und will nun mit PHP das Bild nur noch verkleinern (es soll/wird nur einmal verkleinert).

                Naja, dann ist überschreiben zwar nicht falsch, aber es gibt auch keinen Grund, das _jedesmal_ zu tun.

                Meinst Du, es gibt Probleme, wenn ich die alte Datei einfach überschreibe ?

                Nein, eigentlich nicht. Ich vermute, die entsprechenden Funktionen sind atomar, so dass du gleichzeitige Zugriffe nicht fürchten mußt. Dabei bin ich mir allerdings nicht 100% sicher.

                Soll ich vielleicht aus dem Ordner mit den Originalgroßen Bildern die Datei holen und dann verkleinert abspeichern ?

                Ja. Insbesondere kannst du dabei ganz schnell feststellen, ob du diese (rechenaufwendige!) Arbeit bereits erledigt hast, indem du _vorher_ einfach nachguckst, ob die Zieldatei schon existiert (mit file_exists($dateiname)).

                (Ich wäre Dir sehr dankbar, wenn Du mir den Code ausbessern/verbessern könntest, da das mein erstes PHP-Script ist. Vielen Dank.

                So schlecht ist der doch gar nicht. Außerdem lernst du es dann nicht.

                Im übrigen bist du hier im Forum schon so lange unterwegs - da solltest du doch wissen, dass es hier kaum fertigen Code gibt, Hilfe zur Selbsthilfe dagegen jede Menge. Außerdem glaube ich nicht, dass die Aufgabe zu schwierig für dich ist - du hast jede Menge Gelegenheit, mit deiner Aufgabe zu wachsen. :)

                - Sven Rautenberg

                --
                SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
                ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
                1. Morgen,

                  danke für das Vertrauen :)
                  jaja, ich war faul.

                  hier der Code:

                  Aber es wird nun überhaupt kein Bild mehr angezeigt !?
                  (resized wird es sehr schön, es musste nur der file name nochmals gesetzt werden...)

                  Greetings
                  Torwächter

                  <?php
                  header ("Content-type: image/jpeg");

                  //Die aufzurufende Datei
                  $file = "41-Master.jpg";
                  $newfile = "41-Master.jpg";

                  //Weite und Höhe des auszugebenden Bildes
                  $width  = 80;
                  $height = 100;

                  $scource     = imagecreatefromjpeg($file);
                  $destination = imagecreate($width, $height);

                  //Bild kopieren und resizen
                  imagecopyresized($destination, $scource, 0, 0, 0, 0, $width, $height, imagesx($scource), imagesy($scource));

                  imagejpeg($destination,$newfile);
                  ?>

                  1. Moin!

                    Aber es wird nun überhaupt kein Bild mehr angezeigt !?
                    (resized wird es sehr schön, es musste nur der file name nochmals gesetzt werden...)

                    Vergleiche deinen Code mit meinem Code. Ich rufe imagejpeg() (oder war es imagepng()? Egal, hat den selben Effekt) zweimal auf - einmal zum Speichern auf Platte, und einmal zur Ausgabe an den Browser.

                    Du hingegen rufst die Funktion nur einmal auf - zum Speichern auf Platte. Und vorher hattest du den Funktionsaufruf zur Ausgabe an den Browser.

                    U know, what I mean?

                    - Sven Rautenberg

                    --
                    SELFTREFFEN 2003 - http://selftreffen.kuemmi.ch/
                    ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|
                    1. Ahha, that mean, ich speicher nur und geb es nicht auch noch aus.

                      Danke dir, werd es versuchen.

                      Greetings
                      Torwächter