yeahns: gd library, problem beim resizen

hallo,

Ich habe folgende Funktion geschrieben. Bei manchen Bildern gibt es immer einen memory exhaust, was wohl soviel heisst wie Speicherüberlauf oder buffer overflow? Ach ja, die maximale größe liegt bei 40MB, die hab ich mit den hochgeladenen Bildern NICHT übertroffen.

Der Fehler ist immer bei "imagecreatefromjpeg($dir.$file), wie man an den auskommentierten Zeilen oben drüber sehen kann, hab ich die Übergabewerte schon getestet, sind ok, und funktioniert ja auch mit der Mehrzahl der Bilder. Eine Abhängigkeit des Erfolgs vom Dateinamen konnte ich nicht feststellen. Hier die Funktion:

function imgres($dir,$file,$dirdest,$x_res,$y_res,$qual)
{
    $q=$qual;
    //open the directory
    if (is_dir($dir) && file_exists($dir.$file)) {
        $dh = opendir($dir);
        $k=explode(".",$file);
        $endung = $k[count($k)-1];
        if (!is_dir($dirdest)) {mkdir($dirdest, 0777);}

if($endung == "jpg" || $endung = "jpeg") {
            $salva=$dirdest.$file;
            $image = $dir.$file;
            //$image='img/orig/2005-06 Jazzhaus Juni 2005/VoiceEvent jazzhaus 2005.jpg';
            //print_r($image);
            //echo "<br />";
            $im =imagecreatefromjpeg($image);
            $x=imagesx($im);
            $y=imagesy($im);
            if (empty($x_res)) { $x_res=round($x * ($y_res/$y)); }
            if (empty($y_res)) { $y_res=round($y * ($x_res/$x)); }
            $thumbnail=imagecreatetruecolor($x_res,$y_res);
            imagecopyresized($thumbnail,$im, 0, 0, 0, 0, $x_res, $y_res, $x, $y);
            imagejpeg($thumbnail, $salva, $q);
        }
        elseif($endung = "gif") {
            $salva=$dirdest.$file;
            $image=$dir.$file;
            $im =imagecreatefromgif("$image");
            $x=imagesx($im);
            $y=imagesy($im);
            $thumbnail=imagecreatetruecolor($x/$val,$y/$val);
            $im_ridimensionata=imagecopyresized( $thumbnail, $im, 0, 0, 0, 0, $x/$val,
            $y/$val, $x, $y);
            imagegif($thumbnail, $salva, $q);
        }
        elseif(strpos($k[1],"png")===0) {
            $salva=$dirdest.$file;
            $image=$dir.$file;
            $im =imagecreatefrompng("$image");
            $x=imagesx($im);
            $y=imagesy($im);
            $thumbnail=imagecreatetruecolor($x/$val,$y/$val);
            $im_ridimensionata=imagecopyresized( $thumbnail, $im, 0, 0, 0, 0, $x/$val,
            $y/$val, $x, $y);
            imagepng($thumbnail, $salva, $q);
        }
        else {
            echo "File/Folder $file not compatible(no jpg,gif or png)";
        }
        closedir($dh);
    }

}

  1. Achso, und ich habe bis jetzt nur JPG gestestet, an irgendwelchen Lizenzproblemen liegt es auch nicht.

  2. echo $begrüßung;

    Ich habe folgende Funktion geschrieben. Bei manchen Bildern gibt es immer einen memory exhaust, was wohl soviel heisst wie Speicherüberlauf oder buffer overflow? Ach ja, die maximale größe liegt bei 40MB, die hab ich mit den hochgeladenen Bildern NICHT übertroffen.

    Wie groß waren denn die betroffenen Bilder?

    X × Y × 3 Byte Farbtiefe = ?

    Beachte bitte auch, dass teilweise ein Vielfaches des vom Bild belegten Speichers für die Bearbeitungsschritte benötigt werden.

    echo "$verabschiedung $name";

    1. Danke für die Antwort,

      Also: ich habe hier ein Bild, was 2,5MB groß ist und ca 2500x1900 pixel. das wurde problemlos resized. stammt von einer digicam.

      3 andere bilder, die von mir eingescannt wurden, sind deutlich kleine, zwischen <1MB und ca. 2MB, und wurden nie genommen. die haben aber auch eine Auflösung von ca. 2500x3500.

      In Sachen JPG kenne ich mich leider nicht aus, aber ich glaube, die dateigröße lässt sich ja nicht einfach nach x pixel * y Pixel * farbtiefe berechnen, oder?
      Könnte vll die Auflösung der Schlüssel zum Erfolg sein?

      MfG,
      Jens

      1. echo $begrüßung;

        In Sachen JPG kenne ich mich leider nicht aus, aber ich glaube, die dateigröße lässt sich ja nicht einfach nach x pixel * y Pixel * farbtiefe berechnen, oder?

        Das stimmt. Die Dateigröße ist deutlich geringer als der gemäß der Formel ermittelte Wert, da das JPEG-Format ein mehr oder weniger stark komprimierendes ist. Zum Bearbeiten des Bildes werden aber die unkomprimierten Daten benötigt, weswegen du bei den großen Bildern an die festgelegten Speicherlimits stößt, auch wenn die Dateigröße aufgrund unterschiedlichen Komprimierung geringer als bei kleineren Bildern sein kann.

        Könnte vll die Auflösung der Schlüssel zum Erfolg sein?

        Wenn du die Bilder verkleinerst und dann dem PHP übergibst, kannst du damit Erfolg haben. Weitere Möglichkeiten wären:

        • PHPs Speicherlimit hochsetzen, falls nicht durch übergeordnete Mächte (Provider) verhindert,
        • Bringe in Erfahrung, ob ImageMagick installiert ist, und lass die Bildbearbeitung von diesem durchführen. (Anleitungen dazu -> Suchmaschine :-)

        echo "$verabschiedung $name";