Thomas: Fehler bei imagecopyresampled() - Bild wird ausgeschnitten

Guten Tag,

ich möchte auf meiner Homepage eine Bildergalerie realisieren. Nun lade ich die großen Bilder hoch, möchte sie verkleirn (damit die Ladezeit nicht zu groß wird) und dann speichern.

Eigentlich klappt alles ganz gut. Nur leider wird das Bild bei nicht verkleinert sondern die gewünschte Größe wird ausgeschnitte aus dem großen Bild. Kann mir jemand sagen, was ich falsch mache - hier ist mein Script:

-----

$size = getimagesize($bild);
$breite = $size[0];
$hoehe = $size[1];

$neueBreite = 200;
$neueHoehe = intval($hoehe*$neueBreite/$breite);

$altesBild = imagecreatefromjpeg($bild);
$neuesBild = imagecreatetruecolor($neueBreite, $neueHoehe);
imagecopyresampled($neuesBild, $altesBild, 0, 0, 0, 0, $neueBreite, $neueHoehe, $breite, $hoehe);
imagejpeg($neuesBild, "picture/test.jpeg");

chmod("picture/test.jpeg", 0555);

-----

Vielen Dank.

Gruß

Thomas

  1. Ich kann keinen Fehler finden, und wenn ich deinen Beispielcode laufen lasse erhalte ich auch das gewünschte Ergebnis. Kann es sein, dass der Code in deinem Skript ein anderer ist als der, den Du gepostet hast? Welche Version der GD-Lib verwendest Du? Welchen Ausschnitt des Bildes erhälst Du (vermutlich den links oben) in welcher Größe?

    MfG
    GK

    1. Hallo,

      also ich bin nun nicht der Crack mit PHP. Ich habe mir einfach XAMPP mit PHP 5.2 installiert und losgelegt. Also GD-Lib, sagt mir jetzt garnichts.

      Die Berechnung der Bilder (Breite - Höhe) ist soweit richtung und deine Annahme "oben links" stimmt ebenfalls. Es läuft alles wunderbar, das einziege was falsch läuft ist die verkleinerung.

      Gruß

      Thomas

      1. Die GD-Lib ist das Modul, welche die Grafikfunktionen wie z.B. imagecopyresampled enthält. Rufe mal folgendes Skript auf:
        <?php phpinfo(); ?>
        Das gibt dir deine PHP Konfiguration mit allen verfügbaren Modulen aus. Da gibt es auch einen Abschnitt gd der darüber Auskunft gibt, welche Version vorliegt und welche Formate unterstützt werden.

        Dann solltest Du die Variablenwerte deines Skripts mit echo ausgeben und prüfen, ob die Inhalte alle den erwarteten Wert haben (auch die Dateipfade prüfen).

        Hat das erzeugte Bild die richtige Größe (ist es also 200 Pixel breit und entsprechend hoch)? Versuche es probehalber mal mit imagecopyresized. Die Funktion macht dasselbe, die Qualität ist aber deutlich schlechter als bei imagecopyresampled.

        MfG
        GK

        1. GD Version: bundled (2.0.28 compatible)
          alle Werte sind auf enabled gesetzt.

          Die andere Funktion hab ich bereits getestet, leider ist das Ergebnis dort dasselbe.

          Bei der Ausgabe der Größen habe ich mich gewundert. Die alte Breite soll angeblich die gleiche sein, obwohl ich das mit getimagesize vom alten Bild auslese.

          Ich habe im voraus die Bilder in einer zip hochgeladen und dann extrahiert. Anschließemd durchlaufe ich das verzeichnis, in dem die Bilder liegen und verarbeite die dann. Aber wieso weiß der schon im voraus, wie groß das Bild im nachhinein sein müsste!?

          gruß

          Thomas

          1. Hallo,

            hab meinen Fehler gefunden. Ich verweise in getimagesize() nur auf den Dateinamen und nicht aufs richtige verzeichnis.

            Danke

          2. Trage in folgendem Skript in der ersten Anweisungszeile einen gültigen Dateipfad zu einem existierenden Bild ein, auf das der Webserver Zugriff hat und rufe das Skript über deinen Browser auf. Dann sollte das Bild in 200 Pixel Breite angezeigt werden. Wenn das funktioniert hat dein Problem nichts mit imagecopyresampled zu tun.

            <?php
              $bild = "Hier gültigen Dateipfad eintragen";
              $size = getimagesize($bild);
              $breite = $size[0];
              $hoehe = $size[1];

            $neueBreite = 200;
              $neueHoehe = intval($hoehe*$neueBreite/$breite);

            $altesBild = imagecreatefromjpeg($bild);
              $neuesBild = imagecreatetruecolor($neueBreite, $neueHoehe);
              imagecopyresampled($neuesBild, $altesBild, 0, 0, 0, 0, $neueBreite, $neueHoehe, $breite, $hoehe);
              header("Content-type: image/jpeg");
              imagejpeg($neuesBild);
            ?>

            MfG
            GK