Bild verkleinern
knack
- php
Hallo,
habe mir ein Skript zusammengebastelt mit dem ich Bilder hochladen und dann verkleinern kann. Das geht bis 1,3 MB Bildgröße.
$src_img = imagecreatefromjpeg($Pfad1.'/'.$Bild);
$oh = imagesy($src_img); # original Höhe
$ob = imagesx($src_img); # original Breite
ab dann bekomme ich folgende Fehlermeldung
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 12532 bytes) in
wer weiß, warum das so ist und wo gibt es eine DEUTSCHE Beschreibung für diesen und ähnliche Befehle?
Danke im voraus für eure Hilfe
knack
Hello,
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 12532 bytes) in
Ein JPG-Bild ist komprimiert. Wenn dies nun sehr wenige Farben hat und eine starke Kompressionsstufe gewählt wurde, kann es beim Auspacken schon auf den 50 bis 100-fachen Speicherbedarf anwachsen.
Du kannst Dich bei JPG-Dateien und bedingt auch bei den anderen davor schützen, dass der vorhandene Speicher überschritten wird, indem Du _vorher_ mit getimagesize()
http://de.php.net/manual/en/function.getimagesize.php
die Metadaten des Bildes auskliest und dann rechnest
sizeX * sizeY * (3 + Sicherheit1) + Sicherheit2
Das ist der Speicherbedarf, den Dein Bild mindestens verursacht.
Wenn Du es dann umkopieren willst, benötigst Du für die Kopie selbstverstänlich auch nochmal diesen Speicher. Zusätzlich benötigt Dein Script noch Speicher und für jedes Arrayelement muss man auch noch einiges an Overhead (zwischen 80 und 180 Bytes) einplanen, falls Du gerade welche angelegt hast.
Es gibt hier im Archiv einen Thread von mir, in dem ich unter Mithilfe der Anderen bemüht hatte, eine Speicherbedarfsschätzung für eben diesen Fall (Bilder bearbeiten) durchzuführen. Die Funktion hat "schon befriedigend" gearbeitet.
Musst mal suchen.
wer weiß, warum das so ist und wo gibt es eine DEUTSCHE Beschreibung für diesen und ähnliche Befehle?
Für die Übersetzung empfehle ich http://dict.tu-chemnitz.de/
Ein harzliches Glückauf
Tom vom Berg
Hallo Tom vom Berg,
mit
echo memory_get_usage() . "\n";
zeige ich den belegten Speicher an.
Wie bekomme ich den freien Speicher?
Gruß knack
Hello,
mit
echo memory_get_usage() . "\n";
zeige ich den belegten Speicher an.Wie bekomme ich den freien Speicher?
Gute Frage.
Den freien Speicher bekommst Du bzw. Dein Script i.d.R. gar nicht, sondern nur den zugeteilten. Und den kannst Du abfragen mit ini_get('memory_limit')
http://de.php.net/manual/en/function.ini-get.php
Es kann auch durchaus bei einem Hoster möglich sein, den Speicher für das Script noch während der Scriptlaufzeit heraufzusetzen. Dazu muss man dann ggf. ini_set() benutzen oder man versucht es in einer .htaccess-Datei
php_value memory_limit 67108864
Ein harzliches Glückauf
Tom vom Berg
Hallo,
Hallo,
habe mir ein Skript zusammengebastelt mit dem ich Bilder hochladen und dann verkleinern kann. Das geht bis 1,3 MB Bildgröße.
Du meinst skalieren (verkleinern kann sich auf vieles beziehen)?
ab dann bekomme ich folgende Fehlermeldung
Ab wann? imagesx() oder irgendwas folgendem, das wir nicht kennen? Poste den ganzen Code.
Gruß
Hallo,
<?php
$Pfad = '../uploads/temp/'.$_SESSION['MM_CO'].'.jpg';
$ok = 'nein'; $falsch = 'ja'; $nurJPG = 'ja';
$Speicher = memory_get_usage() . "\n"; # freier RAM Speicher
$Speicher = '3096000';
$dateityp = getimagesize($_FILES['datei']['tmp_name']);
if($dateityp[2] != 0 and $dateityp[2] == 2)
{
if($_FILES['datei']['size'] < $Speicher)
{
move_uploaded_file($_FILES['datei']['tmp_name'], $Pfad);
$ok = 'ja';
}
else
{
$falsch = 'nein';
}
}
else
{
$nurJPG = 'nein';
}
?>
<?php
if( $ok == 'ja' ) # ANFANG if( $ok == 'ja' )
{
$bild_ok = 'nein';
$Bild = $_SESSION['MM_CO'].'.jpg'; # bildname
$Pfad1 = '../uploads/temp'; # von wo?
$Pfad2 = '../uploads'; # nach wo
$max_b = 158; # maximale Breite des Bildes
$max_h = 200; # maximale Höhe des Bildes
# $src_img = LoadJpeg($Pfad1.'/'.$Bild);
$src_img = imagecreatefromjpeg($Pfad1.'/'.$Bild);
$oh = imagesy($src_img); # original Höhe
$ob = imagesx($src_img); # original Breite
if ( $oh > $max_h and $ob > $max_b ) # ANFANG if Bilder, größer als $max
{
# Breite > Höhe
if( $ob > $oh ) # ANFANG if( $ob > $oh )
{
$neu_b = $max_b;
$neu_h = $oh / ($ob / $max_b);
if ( $neu_h > $max_b ){$neu_h = $max_h; $neu_b = $ob / ($oh / $max_h);}
}# ENDE if( $ob > $oh )
# Höhe > Breite
if( $oh > $ob ) # ANFANG if( $oh > $ob )
{
$neu_h = $max_h;
$neu_b = $ob / ($oh / $max_h);
if ( $neu_b > $max_b ) {$neu_b = $max_b; $neu_h = $oh / ($ob / $max_b);}
}# ENDE ANFANG if( $oh > $ob )
# QUADRAT
if( $oh == $ob and $ob > $max_b) # ANFANG if( $oh == $ob )
{
$neu_b = $max_b;
$neu_h = $max_b;
}# ENDE ANFANG if( $oh == $ob )
} # ENDE if Bilder, größer als $max
else
{ # ANFANG else Bilder, größer als $max ( Bild ist kleiner als max )
$neu_b = $ob;
$neu_h = $oh;
}# ENDE else Bilder, größer als $max ( Bild ist kleiner als max )
$dst_img = imagecreatetruecolor($neu_b,$neu_h);
// imagecopyresized erzeugt schlechteres Bild als imagecopyresampled
imagecopyresampled($dst_img, $src_img, 0,0,0,0, $neu_b, $neu_h, imagesx($src_img), imagesy($src_img));
imagejpeg($dst_img, $Pfad2.'/'.$Bild);
# Datei in temp löschen
unlink ($Pfad1.'/'.$Bild);
$bild_ok = 'ja';
} # ENDE if( $ok == 'ja' )
?>
imagecreatefromjpeg sammelt doch nur Informationen von der Datei!?
knack
Hallo,
imagecreatefromjpeg sammelt doch nur Informationen von der Datei!?
Offensichtlich lädt diese Funktion das ganze Bild und entpackt es ggf. in den Speicher => siehe Toms Beitrag.
Gruß