Image Resize funktioniert nicht immer

-Ener-

Erfahrenes Mitglied
Hallo, ich habe Probleme mit meinem Script welches Bilder hochläd und sie auf eine einheitsbreite oder einheitshöhe reduziert, bei einem Bild welches 590KB groß ist und 1536x2048px groß ist funktioniert das nicht, er macht das nicht kleiner, außerdem bekomm ich bei größeren Bildern (ab 800kb) ne RAM Fehlermeldung, verbraucht des Script denn so viel Speicher? Bitte schaut mal drüber:

PHP:
<?
require('main.php');

session_start();

if (!isset($_SESSION['uid'])) {
$_SESSION['uid'] = $_REQUEST['uid'];
$_SESSION['pwd'] = $_REQUEST['pwd'];
}
$uid = $_SESSION['uid'];
$pwd = $_SESSION['pwd'];
db_connect();
$res = mysql_query("SELECT * FROM users WHERE uid='$uid' AND pwd='$pwd'");
$re  = mysql_fetch_array($res);
if(mysql_num_rows($res) != 0) {
include(INC_DIR."header.php");
if ($uid){
?>
        <span style="font-family:verdana;font-size:10pt">Herzlich Willkommen <b><?php echo $uid;?></b></span><br><br><br>
        <span style="font-family:verdana;font-size:7pt"><i> Die Zufallsbild-URL für deine BI lautet: <b><a href="http://www.twixt-design.de/bild.php?user=<?php echo $uid;?>#bild.jpg" target="_blank">http://www.twixt-design.de/bild.php?user=<?php echo $uid;?>#bild.jpg</a></b></i><br><br>Bilder die größer als 550x413 Pixel bzw. 413x550 Pixel sind werden automatisch auf diese Größe angepasst!</span><br><br><br><br>
<?
    }
        ?>
<form action="http://www.twixt-design.de<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<input type="file" name="bild" />
<input type="submit" value="Neues Bild hochladen" />
</form>
<?
$dateityp = GetImageSize($_FILES['bild']['tmp_name']);
$datei= $_FILES['bild']['name'];
$pfad = "user/$uid/$datei";
if($dateityp[2] != 0)
   {
move_uploaded_file($_FILES['bild']['tmp_name'], $pfad);
chmod("$pfad",0777);
if (filesize($pfad) > 803840){

    unlink($pfad);
    echo "Das Bild darf aus technischen Gründen nicht größer als 785 KB groß sein!";
}
else {
$dateiendung = pathinfo("$pfad");
if ($dateiendung["extension"] == "jpg"){
$im = ImageCreateFromJPEG("$pfad");
$width = ImageSX($im);
$height = ImageSY($im);
if ($width > 500 or $height > 500){
if ($width > $height){
$twidth = 500;
$theight = round(($height/$width)*$twidth,0);
    }
else {

$theight = 500;
$twidth = round(($width/$height)*$theight,0);
    }

$im2 = ImageCreatetruecolor($twidth,$theight);
ImageCopyResized($im2,$im,0,0,0,0,$twidth,$theight,$width,$height);
ImageJpeg($im2, "$pfad", 70);
}
if ($dateiendung["extension"] == "gif"){
$im = ImageCreateFromGIF("$pfad");
$width = ImageSX($im);
$height = ImageSY($im);
if ($width > 500 or $height > 500){
if ($width > $height){
$twidth = 500;
$theight = round(($height/$width)*$twidth,0);
    }
else {

$theight = 500;
$twidth = round(($width/$height)*$theight,0);
    }
    

$im2 = ImageCreatetruecolor($twidth,$theight);
ImageCopyResized($im2,$im,0,0,0,0,$twidth,$theight,$width,$height);
ImageGIF($im2, "$pfad", 70);
}
    
}

}
echo "Das Bild wurde Erfolgreich hochgeladen";
      }

   }
else
    {
    echo "Wähle ein Bild von der Festplatte und klicke anschließend auf &quot;Neues Bild Hochladen&quot;";
    }
?>
<br><br><br><br>
<?
if ($_GET["del"]) {

        unlink("user/$uid/$_GET[del]");
?>
<script language="javascript">
        window.location.href = "member.php";
    </script>
    <?
    
}
$ordner = "./user/$uid";
$handle = opendir($ordner);
while ($file = readdir ($handle)) {
    if($file != "." && $file != "..") {
        if(is_dir($ordner."/".$file)) {
            echo "/".$file."<br/>";
        } else {
            // kompletter Pfad
            $compl = $ordner."/".$file;
            echo "<img src=$ordner/$file><br><br><a href=?del=$file onclick=\"javascript:return confirm('Möchtest du das Bild &quot;$file&quot; wirklich löschen?')\">[Bild löschen]</a><br><br>";
        }
    }
}
closedir($handle);
} else {

    include(INC_DIR."header.php");
    unset($_SESSION['uid']);
    unset($_SESSION['pwd']);

    echo "<br><font color=red>Login fehlgeschlagen!</font>";
    include(INC_DIR."login.php");

    }


    include(INC_DIR."footer.php");
    db_disconnect();




?>
 
Hallo!

Die Dateigrösse spielt nur beim Upload eine Rolle.
Beim bearbeiten mit den Image-Funktionen hingegen spielen die Höhe und Breite eine Rolle.
Die Image-Funktionen dekomprimieren das Bild (machen Grafikprogramme ja auch) um es zu bearbeiten.
Mit anderen Worten musst Du die max. Breite/Höhe des Bildes für den Upload festlegen.
Einfache Rechnung: Breite x Höhe x 3 (3 Farben, RGB) = dekomprimierte Dateigrösse.
Bei Deinem Bild kommst Du also auf 9437184 / 1024 / 1024 = 9 MB.
Wenn Du z.b. noch ein GIF als Wasserzeichen o.ä. über das Bild legen willst, musst Du dessen Dateigrösse noch hinzurechnen.
Ich bin mir nicht sicher, aber ich meine post_max_size ist hierfür ausschlaggebend.

Gruss Dr Dau
 
Also sollt ích jetzt sozusagen zusätzlich noch ne Sperre der Breite und höhe einbauen? Des wäre nicht das was ich damit bezwecken will, ich möchte das jede erdenkliche (gut...bis 2MB Filesize) eines Bildes hochgeladen werden kann ABER dann immer auf eine Breite bzw, Höhe von 500px umgewandet wird. Ne andere Möglichkeits gibts da wohl nicht oder?
 
... oder memory_limit höher setzen, oder ImageMagick benutzen ...
Und die GDlib verbraucht recht viel Speicherplatz.
Für 1536x2048px sind locker 15MB weg, und wenn dazu noch ein zweites Bild erstellt wird, kommt dies zum Spiecherbedarf noch dazu.
 
Ich hab leider keinen root-zugriff, kann deßhalb nichts ändern. Ein zweites Bild wird ja nicht erstellt, nur wenn das Bild in breite oder höhe größer als 500px ist dann wird 1 Bild erstellt und mit dem gerade hochgeladenen überschrieben... mhhhh was empfehlt ihr?

@ nephix das tut er doch im Script mit:
PHP:
$im = ImageCreateFromJPEG("$pfad");
$width = ImageSX($im);
$height = ImageSY($im);
if ($width > 500 or $height > 500){
if ($width > $height){
$twidth = 500;
$theight = round(($height/$width)*$twidth,0);
	}
else {

$theight = 500;
$twidth = round(($width/$height)*$theight,0);
	}

Das rundet das Ergebniss und resized immer auf entweder 500px Breite oder 500px Höhe je nachdem ob es Hoch oder Querformat ist.
 
Zuletzt bearbeitet:
Achso sorry nicht rein geschaut, der Quelltext sah so schlecht formatiert aus, dass mir daran die Lust vergangen ist ;-)
 
Zurück