GD: Bilder bearbeiten - Grössenbeschränkung?

  • Hallo zusammen!

    Wieder mal ein Problem =)
    Ich möchte per Uploadformular Bilder auf einen Server laden.

    Dazu will ich noch ein kleines Vorschaubild generieren und unter einem anderen Namen speichern.

    Ist alles kein Problem. Nur bricht bei grossen Bildern das Script, dass die Bilder skaliert, plötzlich ab (ohne Fehlermeldung, trotz error_reporting(E_ALL) )

    Schlussendlich ist das Originalbild auf dem Server vorhanden, das kleine allerdings nicht.

    Bei Bildern <~800kb oder so funktioniert alles einwandfrei.

    Hat das etwas mit der Arbeitsspeicherbeschränkung von PHP zu tun?
    Dasselbe funktioniert aber auch mit

    Code
    ini_set("memory_limit","48M"); // oder 128M etc...

    nicht.

    Weiss jemand von euch Bescheid?

    Vielen Dank! :)

  • gib mal bitte das ganze scipt, damit man mal eine überblick bekommt. Den nich habe soetwas auch sohon mal gebaut und es habe es mit bis zu 6mb bildern erfolgreich getestet.

  • ja? ok, hier mal das script.

    [php:1:b1abf1f9f0]<?php
    session_start();
    function createThumb($ordner, $quelldatei, $prefix, $maximalgroesse, $qualitaet)
    {
    //dateiinformationen auslesen
    $info = getimagesize($ordner.$quelldatei);
    $width = $info[0];
    $height = $info[1];
    $type = $info[2]; #type 2 = jpeg
    //----------------- Originalbild skalieren----------------------
    //wenn bild gr&ouml;sser ist als $maximalgroesse, bild skalieren
    if (($width > $maximalgroesse) || ($height > $maximalgroesse))
    {

    //wenn bild jpeg ist
    switch ($type)
    {
    case 1: $newimage = @imagecreatefromgif($ordner.$quelldatei); break;
    case 2: $newimage = @imagecreatefromjpeg($ordner.$quelldatei); break;
    case 3: $newimage = @imagecreatefrompng($ordner.$quelldatei); break;
    }

    //wenn querformat
    if ($width > $height)
    {
    //breite ist die gr&ouml;sse, die oben angegeben wurde
    $nwidth = $maximalgroesse;
    //h&ouml;he wird berechnet, um bild nicht zu verzerren
    $nheight = round($height/($width/$nwidth));
    }
    //wenn hochformat
    else
    {
    //h&ouml;he ist die gr&ouml;sse, die oben angegeben wurde
    $nheight = $maximalgroesse;
    //breite wird berechnet, um bild nicht zu verzerren
    $nwidth = round($width/($height/$nheight));
    }
    //bild erstellen (original &uuml;berschreiben)
    $image2 = imagecreatetruecolor($nwidth, $nheight);
    imagecopyresampled($image2, $newimage, 0, 0, 0, 0, $nwidth, $nheight, $width, $height);
    @imagedestroy($newimage);
    //imagejpeg(bild, filename, qualit&auml;t) erstellt bild
    switch ($type)
    {
    case 1:
    $r = imagegif($image2,$ordner.$prefix.$quelldatei, $qualitaet);
    break;
    case 2:
    $r = imagejpeg($image2,$ordner.$prefix.$quelldatei, $qualitaet);
    break;
    case 3:
    $r = imagepng($image2,$ordner.$prefix.$quelldatei, $qualitaet);
    break;
    }
    @imagedestroy($image2);
    if ($r)
    {
    return true;
    }
    else
    {
    return false;
    }

    }
    else
    {
    switch ($type)
    {
    case 1: $newimage = @imagecreatefromgif($ordner.$quelldatei);
    $r = @imagegif($newimage,$ordner.$prefix.$quelldatei, $qualitaet);
    break;
    case 2: $newimage = @imagecreatefromjpeg($ordner.$quelldatei);
    $r = @imagejpeg($newimage,$ordner.$prefix.$quelldatei, $qualitaet);
    break;
    case 3: $newimage = @imagecreatefrompng($ordner.$quelldatei);
    $r = @imagepng($newimage,$ordner.$prefix.$quelldatei, $qualitaet);
    break;
    }
    @imagedestroy($image2);
    @imagedestroy($newimage);
    if ($r)
    {
    return true;
    }
    else
    {
    return false;
    }

    return true;
    }
    }

    // Einbinden der Datei, die eine Datenbankverbindung aufbaut.
    include("../dbconnect.php");

    //Auswählen der Datenbank
    mysql_select_db("u4-1003802-3");

    $tag = substr($_POST['datum'],0,2);
    $monat = substr($_POST['datum'],3,2);
    $jahr = substr($_POST['datum'],6,4);
    $datum = mktime(0,0,0,$monat,$tag,$jahr);
    $titel = addslashes($_POST['titel']);
    $titel_en = addslashes($_POST['titel_en']);

    $autor = $_SESSION['autor'];

    $original = $_FILES['datei']['name'];
    $quelle = $_FILES['datei']['tmp_name'];

    $dateiname = str_replace(array(" ","ä","ö","ü"),array("_","ae","oe","ue"),$original);

    if (@copy($quelle, "../../../presse/images/" . $dateiname))
    {
    $sql = "INSERT INTO de_p_bilder (dateiname, datum, titel, titel_en, autor) VALUES ('$dateiname', '$datum', '$titel', '$titel_en', '$autor')";
    $eintragen = mysql_query($sql);
    }

    mysql_free_result($eintragen);

    createThumb("../../../presse/images/", $dateiname, "t_", 200, 70);

    header("Location: index.php?mode=pbilderauf");
    ?>[/php:1:b1abf1f9f0]


    vielleicht ist auch meine funktion für die bildskalierung zu speicheraufwändig..?

  • ALso die funktion ist astrein. Ich habe es mit bilder von bis zu 1,2mb getestet und ich hatte keine erhöhten CPU / Speicher ausschläge. Mein server hat ein maximalspeicher für php von 3mb und es funktioniert echt gut.

    Hast du es sonst einmal auf eien anderen server ausprobiert ??

    Sry kann dir da leider auch nicht weiterhelfen, kann den Fehler auch nicht nachvolziehen