php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.05.2010, 17:46  
Neuer Benutzer
 
Registriert seit: 21.08.2009
Beiträge: 9
PHP-Kenntnisse:
Anfänger
peter silie befindet sich auf einem aufstrebenden Ast
Standard imagecreatefromjpeg() "Allowed memory size exhausted"

Hallo.
Ich habe eine Uploadfunktion für mein Fotoalbum. Man kann dort Fotos hochladen, die dann verkleinert gespeichert werden sollen. An sich funktioniert auch alles. Nur wenn die Bilder eine gewisse Größe übersteigen, wird aus dem verkleinern nichts.

Fehlermeldung:
"Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 10240 bytes) in ... on Line..."
Dort steht imagecreatefromjpeg().

Jetzt würde ich gerne wissen, ob das am Quellcode liegt (unsaubere Programmierung oder sowas) oder ob ich nichts dagegen tun kann und damit leben muss, dass der zur Verfügung gestellte Speicher nicht reicht.

Ich habe den Quellcode mal um den überflüssigen Schnickschnack erleichtert:

PHP-Code:
<?php

$path 
"./Fotoalben/".$_POST['dir']."/".$_FILES['foto']['name'];

if(!
file_exists($path)){

    
move_uploaded_file($_FILES['foto']['tmp_name'], $path);
    
    
$size getimagesize($path);
    
$oldwidth $size[0];
    
$oldhight $size[1];
    if(
$oldwidth <= $oldhight){
    
        
$hight 550;
        
$width intval($oldwidth*$hight/$oldhight);
    }
    else{
    
        
$width 550;
        
$hight intval($oldhight*$width/$oldwidth);
    }
    
    if(
$oldwidth or $oldhight 550){
        
        
$input=imagecreatefromjpeg($path);
        
$output=imagecreatetruecolor($width,$hight);
        
imagecopyresampled($output,$input,0,0,0,0,$width,$hight,$oldwidth,$oldhight);
        
imagejpeg($output$path);
    }
}
?>

Peter Silie
peter silie ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.05.2010, 17:53  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Kann schon sein. 24MB sind auch nicht wirklich viel RAM und die GDLib lädt jedes einzelne Pixel in den Speicher, womit es den gleichen Raum einnimmt wie ein adäquates BMP-File. Da kann je nach Auflösung ein von der eigentlichen Dateigröße her gesehen recht kleines Bild den Speicher schnell füllen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 25.05.2010, 18:24  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Vor allen Dingen, wenn du kein imagedestroy aufrufst... du erzeugst dir ein Memory Leak
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline  
Alt 25.05.2010, 18:59  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Nicht zwangsläufig. Wenn PHP sich beendet, werden auch die Ressourcen freigegeben, aber wenn man mit hochauflösenden Bildern arbeitet, sollte man, wenn möglich, nach jeder Aktion die Ressource mit imagedestroy() freigeben. Einfach die Variable zu überschreiben reicht übrigens nicht. Dann hat man sich den Pointer auf die Ressource zerstört, das Bild bleibt aber im Speicher.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 25.05.2010, 19:36  
Neuer Benutzer
 
Registriert seit: 21.08.2009
Beiträge: 9
PHP-Kenntnisse:
Anfänger
peter silie befindet sich auf einem aufstrebenden Ast
Standard

Danke erstmal für den Hinweis mit imagedestroy(). Ich verstehe das jetzt so, dass ich imagedestroy() für die beiden erzeugten Bilder ($input und $output) aufrufen sollte, nachdem ich das verkleinerte Bild abgespeichert hab. (bzw. nach imagecopyresampled())
Das würde an dem Problem doch sicher nichts ändern, da quasi Speicher fehlt, bevor ich überhaupt welchen freigeben kann.
Gibt es eine andere Möglichkeit, Bilder zu verkleinern, die vielleicht nicht so "speicherintensiv" ist? (ich glaube zwar nicht, aber man kann ja mal fragen)

Peter Silie
peter silie ist offline  
Alt 25.05.2010, 21:46  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Wenn schon das Laden eines einzigen Bildes den Speicher überbeansprucht, gibt es nur zwei Möglichkeiten: PHP über die php.ini mehr Speicher zur Verfügung stellen oder ImageMagick statt GDLib nutzen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 27.04.2011, 16:12  
Neuer Benutzer
 
Registriert seit: 27.04.2011
Beiträge: 5
PHP-Kenntnisse:
Anfänger
crueL befindet sich auf einem aufstrebenden Ast
Standard

Ich schreib das mal hier rein, da ich denke, dass ich ein ähnliches Problem habe.
Vorweg möchte ich erwähnen, dass ich php gerade erst lerne und ich ein Script mit verschiedenen Tutorials und dem php-Manual geschrieben habe.

Aufgabe des Scripts ist es, eine ziemlich große Menge (zwischen 800 und 1500) von Bildern zu verkleinern, verschieben und anschließend eine Zip-Datei zu erstellen.
Ich poste das Script erst mal und gehe dann genauer darauf ein:

PHP-Code:
<?php 
error_reporting
(E_ALL);
ini_set('display_errors','On');
if (
function_exists('ini_get') && ini_get('date.timezone') == '') {
    
ini_set('date.timezone''Europe/Berlin');
}
$script_start =  time();

if( !
ini_get('safe_mode') ){
    
set_time_limit(3600);

echo 
'<br />';

// Pfade
$absPath $_SERVER['DOCUMENT_ROOT'];
$watchPath $absPath '/flo/'// Pfad zum Watchfolder
$watchDir =  $watchPath '_watchFolder/'// Ordnername (_watchFolder)

//#################################### 
//          Mail-Variablen           #
//####################################
$absender "email@domain.de";
$empfaenger $absender;
$mailbetreff "aktualisierte Produktbilder";
$mailnachricht "\nDatum/Zeit: ";
$mailnachricht .= date("d.m.Y H:i:s")."\n\n";
$mailnachricht .= "Folgende Bilder wurden aktualisiert: \n\n";


//#################################### 
//         BCC-Liste auslesen        #
//####################################
$csv fopen($watchPath "Mailverteiler.csv""r");
$bcc '';
while (
$array fgetcsv($csv1024";")){
     
$bcc .= 'Bcc: ' $array[2] . "\r\n"//Mailadresse steht in der dritten Spalte der CSV-Datei
}
fclose ($csv);

//#################################### 
//     Bildnamen ins $filaeArray     #
//####################################
$fileArray = array(); 
$handle opendir($watchDir); 
$i=0
while(
$file readdir($handle)) { 
    if(
$file == "." || $file == "..") continue;     
    
$fileArray[$i] = $file// Bildnamen ins $fileArray schreiben
    
$mailnachricht .= $file "\n"//Dateien in den Mail-Text anhängen
    
$i++;
}
closedir($handle); 

//#################################### 
//      Backup vom Watchfolder       #
//####################################
if (count($fileArray != 0)){
    
$timestamp time();
    
$datum date("Ymd",$timestamp);
    
$ordnername $datum '_watchFolder';
    if (!
is_dir($watchPath $ordnername)){
        if (!
mkdir($ordnername0700)) echo 'Keinen Ordner erstellt! <br />';
        for ( 
$i 0$i count($fileArray); $i++){
            
copy($watchDir $fileArray[$i], $watchPath $ordnername '/' $fileArray[$i]);
        }
    } else {
        echo 
'Der Ordner ' $ordnername ' existiert bereits. <br />';
    }
}

//#################################### 
//  Daten-Array anlegen und fuellen  #
//####################################
if($i!=0) {
    
$allArray = array();

    
// 1000 x 1000 - Info bereich
    
$allArray[0]['h'] = 1000;    
    
$allArray[0]['w'] = 1000;
    
$allArray[0]['typ'] = 'jpg';
    
$allArray[0]['name'] = $allArray[0]['h'] . 'x' $allArray[0]['w'] . '-' $allArray[0]['typ'];
    
    
//600 x 600 - Store Categories - popup_images
    
$allArray[1]['h'] = 600;
    
$allArray[1]['w'] = 600;
    
$allArray[1]['typ'] = 'jpg';
    
$allArray[1]['name'] = $allArray[1]['h'] . 'x' $allArray[1]['w'] . '-' $allArray[1]['typ'];
    
    
// 370 x 370 - Store Categories - info_images
    
$allArray[2]['h'] = 370;
    
$allArray[2]['w'] = 370;
    
$allArray[2]['typ'] = 'jpg';
    
$allArray[2]['name'] = $allArray[2]['h'] . 'x' $allArray[2]['w'] . '-' $allArray[2]['typ'];
    
    
// 144 x 144 - Store Categories - thumbnail_images
    
$allArray[3]['h'] = 144;
    
$allArray[3]['w'] = 144;
    
$allArray[3]['typ'] = 'jpg';
    
$allArray[3]['name'] = $allArray[3]['h'] . 'x' $allArray[3]['w'] . '-' $allArray[3]['typ'];
    
    
// 370 x 370 - Store Products - info_images
    
$allArray[4]['h'] = 370;
    
$allArray[4]['w'] = 370;
    
$allArray[4]['typ'] = 'gif';
    
$allArray[4]['name'] = $allArray[4]['h'] . 'x' $allArray[4]['w'] . '-' $allArray[4]['typ'];

    
// 144 x 144 - Store Products - thumbnail_images

    
$allArray[5]['h'] = 144;
    
$allArray[5]['w'] = 144;
    
$allArray[5]['typ'] = 'gif';
    
$allArray[5]['name'] = $allArray[5]['h'] . 'x' $allArray[5]['w'] . '-' $allArray[5]['typ'];

    
//#################################### 
    //    Unterverzeichnisse anlegen     #
    //####################################
    
for ($i 0$i count($allArray); $i++){
        if (!
is_dir($watchPath $allArray[$i]['name'])){
            if (!
mkdir($watchPath $allArray[$i]['name'], 0700)) echo 'Der Ordner: ' $allArray[$i]['name'] . ' konnte nicht             erstellt werden! <br />';
        }
    }

    
//#################################### 
    //  Bilder editieren und speichern   #
    //####################################
    //require_once 'ProgressBar.class.php5';  // ProgressBar by David Bongard
    //$bar = new ProgressBar();  
    //$elements = count($allArray) * count($fileArray); // Anzahl der Schleifendurchläufe  
    //$bar->initialize($elements); // Initialisieren und leeren Fortschrittsbalken anzeigen

    
for ($i 0$i count($allArray); $i++){
        for( 
$j 0$j count($fileArray); $j++ ){
            
//echo '<div id="bar">Durchlauf: ' . $i . ' | Bild: ' . $j . '</div>';
            
$size getimagesize($watchDir $fileArray[$j]);
            
$w $size[0]; // Width des Originalbildes
            
$h $size[1]; // Height des Originalbildes
        
            // Seitenverhaltnisse + Verkleinerung
            
if ($h >= $w) {
                
$wn round($w/($h/$allArray[$i]['h']));
                
$hn $allArray[$i]['h'];
            } else {
                
$wn $allArray[$i]['w'];
                
$hn round($h/($w/$allArray[$i]['w']));
            }
            
            
// Bilderstellung mit neuen Seitenverhaltnissen
            
$dst_img ImageCreateTrueColor($wn,$hn);
            
$dst_body imagecolorallocate$dst_img255255255 );
            
imagefill$dst_img,0,0,$dst_body );
            
$src_img ImageCreateFromJpeg($watchDir $fileArray[$j]);
            
ImageCopyResized($dst_img$src_img0000$wn$hn ,$w ,$h); // ImageCopyResampled
            
            // gif oder jpg schreiben
            
if ($allArray[$i]['typ'] == 'jpg'){
                if(
$allArray[$i]['h'] == 1000){
                    
imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.jpg');
                } else {
                    
imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -8) . '.jpg');
                }
            } else {
                
imagegif($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.gif');            
            }                
            
ImageDestroy($src_img);
            
ImageDestroy($dst_img);    
            
            
//$bar->increase(); // Frotschrittsbalken    
        

    }

    
//#################################### 
    //        Watchfolder leeren         #
    //####################################
    
echo '<br />';
    for (
$i 0$i count($fileArray); $i++){
        if(!
unlink($watchDir $fileArray[$i])) {
            echo 
'Beim Loeschen der Datei '$fileArray[$i] . ' trat ein Fehler auf! <br />';
        }
    } 

    
//#################################### 
    //        Zip-Datei erstellen        #
    //####################################    
    
$zip $datum 'Aktualisierungen.zip';                                                                        
    
ob_start();    
    require(
'./zip.lib.php');
    
$zipfile = new zipfile($zip);
    
$zipfile->addDirContent('1000x1000-jpg/');
    
file_put_contents($zip$zipfile->file());
                                                                                                                                                                                                                 
    
//#################################### 
    //           Mail erstellen          #
    //####################################
    
$mailnachricht .= 'Sie koennen die Bilder direkt unter: http://www.domain.de/flo/' $zip ' als zip-Archiv herunterladen.' "\n";
    
mail($empfaenger$mailbetreff$mailnachricht$bcc "From: ".$absender);    // Mail generieren
    
} else {
    echo 
'Der Ordner <i>"'$watchDir .'"</i> ist leer! Ich tu hier gar nichts<br />!';
    
mail($empfaenger'Cronejob - Done''Cronejob ausgeführt, keine neuen Bilder'"From: ".$absender);    // Mail generieren
}

$end_time time();
echo 
'<b>Erstellt in '.($end_time $script_start).' Sekunden</b><br />';
?>
Da bei uns auf dem Server kein Safe-Mode aktiviert ist, habe ich die Laufzeit des Scripts einfach mal auf eine Stunde gestellt, um auszuschließen, dass es in einen timeout läuft.

PHP-Code:
$watchDir =  $watchPath '_watchFolder/'// Ordnername (_watchFolder) 
Dieser Ordner (_watchFolder) soll mit den Bildern befüllt werden (die Größe der Bilder ist in dem Ordner 1000x1000 px) und wenn keine Bilder drin sind, wird auch nichts weiter gemacht. Das Script soll täglich via Cronejob angestoßen werden.

Das wirkliche Problem tritt dann aber erst in den zwei for-Schleifen auf:
PHP-Code:
    for ($i 0$i count($allArray); $i++){
        for( 
$j 0$j count($fileArray); $j++ ){
            
//echo '<div id="bar">Durchlauf: ' . $i . ' | Bild: ' . $j . '</div>';
            
$size getimagesize($watchDir $fileArray[$j]);
            
$w $size[0]; // Width des Originalbildes
            
$h $size[1]; // Height des Originalbildes
        
            // Seitenverhaltnisse + Verkleinerung
            
if ($h >= $w) {
                
$wn round($w/($h/$allArray[$i]['h']));
                
$hn $allArray[$i]['h'];
            } else {
                
$wn $allArray[$i]['w'];
                
$hn round($h/($w/$allArray[$i]['w']));
            }
            
            
// Bilderstellung mit neuen Seitenverhaltnissen
            
$dst_img ImageCreateTrueColor($wn,$hn);
            
$dst_body imagecolorallocate$dst_img255255255 );
            
imagefill$dst_img,0,0,$dst_body );
            
$src_img ImageCreateFromJpeg($watchDir $fileArray[$j]);
            
ImageCopyResized($dst_img$src_img0000$wn$hn ,$w ,$h); // ImageCopyResampled
            
            // gif oder jpg schreiben
            
if ($allArray[$i]['typ'] == 'jpg'){
                if(
$allArray[$i]['h'] == 1000){
                    
imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.jpg');
                } else {
                    
imagejpeg($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -8) . '.jpg');
                }
            } else {
                
imagegif($dst_img$watchPath $allArray[$i]['name'] . '/' substr($fileArray[$j], 0, -4) . '.gif');            
            }                
            
ImageDestroy($src_img);
            
ImageDestroy($dst_img);    
            
            
//$bar->increase(); // Frotschrittsbalken    
        

    } 
Im XAMPP habe ich das Teil mit einer recht große Menge an Bildern getestet und es rennt problemlos durch, allerdings bekomme ich auf dem Webserver ab einer bestimmten Anzahl von Bildern (ab ca. 25 Bildern) eine "Error 500 - Internal server error" Fehlermeldung. Wenn ich statt ImageCopyResized ImageCopyResampled (was qualitativ eher mein Favorit wäre) nehme geschieht dies auch schon bei weniger Bildern.

Jetzt habe ich mich bei 1&1 erkundigt, die mir sagten, dass folgende Einstllungen zu berücksichtigen sind:
- Prozesse dürfen max. 10 Sekunden Rechenzeit beanspruchen
- Prozesse dürfen max. 32 MB Speicher belegen. Bei Verwendung von PHP5 40 MB Speicher.
- Es dürfen max. 12 Prozesse gleichzeitig laufen.
Also vermute ich, dass ich diese Beschrenkungen offensichtlich nicht einhalten kann und habe wieder nach diesem Problem gegoogled und öfter mal gelesen, dass man das besser programmieren muss um Resourcen zu sparen. Irgend was mit Script sich selbst aufrufen lassen und sich merken, wo man war etc. allerdings weiß ich absolut nicht, wie ich das bei mir umsetzen soll. Mein erster Versuch einfach alle Variablen als $_Session-Variablen anzulegen ist kläglich gescheitert.

Vielleicht kann mir hier noch jemand einen Hinweis geben, wie ich dieses Script so umschreiben kann, dass es nicht mittendrin einfach abbricht.
Für jeden weiteren Hinweis auf Tutorials und Tips wäre ich echt dankbar.

Gruß
Flo
crueL ist offline  
Alt 27.04.2011, 18:07  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Ok. Erstmal kommt es auf die Größe bzw. Auflösung (DPI) der Bilder an, wieviel RAM sie benötigen. Ein JPEG, das sehr hoch komprimiert wurde, aber in einer sehr hohen Auflösung vorliegt, kann durchaus ein großes Vielfaches der Speichermenge brauchen, die die Bilddatei auf der Festplatte belegt.

Wo kommt der 500er Serverfehler her? LOG Dateien einsehen und Ursache herausfinden! Sollte es so sein, das ein Teil von PHP (GD Extension) diesen Fehler auslöst, kann auch das zu Speicherlecks führen.

Zitat:
Irgend was mit Script sich selbst aufrufen lassen und sich merken, wo man war etc. allerdings weiß ich absolut nicht, wie ich das bei mir umsetzen soll. Mein erster Versuch einfach alle Variablen als $_Session-Variablen anzulegen ist kläglich gescheitert.
Das ist eine typsiche "funzt nich" Fehlerbeschreibung. Welchen Ansatz hast du (hast du überhaupt einen) und was bedeutet kläglich gescheitert?

Du könntest bereits bearbeitete Bilder verschieben und immer nur in Häppchen arbeiten. Oder du speicherst die Namen der bereits verarbeiteten Dateien in einer gesonderten Datei und verwendest die als Blacklist. Es gibt verschiedene Ansätze.

Zitat:
Aufgabe des Scripts ist es, eine ziemlich große Menge (zwischen 800 und 1500) von Bildern zu verkleinern, verschieben und anschließend eine Zip-Datei zu erstellen.
Ist das die Tages-Gesamtmenge, oder sind das bei jedem Aufruf des Scripts soviele? Wenn du bereits Informationen zu 1000 Dateien im Speicher hälst, bevor die eigentliche Bildverarbeitung startet, geht das natürlich von deinem zur Verfügung stehenden Speicher ab.
Zitat:
das besser programmieren muss um Resourcen zu sparen
Ja, darum gehts im wesentlichen.

Kannst du externe Tools wie ImageMagick einsetzen?

Protokollier mal den Speicherverbrauch an verschiedenen Stellen im Programm mit: zu Beginn, nach dem Einlesen des Verzeichnisses, zu Beginn jeder Bildbearbeitung und am Ende des Scriptes, nachdem alle Resourcen freigegeben wurden. Setz dazu auch explizit Arrays auf null. Das dürfte schon Aufschluß über die Entwicklung geben. Dazu immer die Ausmaße des Bildes (Breite, Höhe, DPI bzw. BPP) und den tatsächlichen Speicherverbrauch nach dem Laden. Es kann auch sein, das einige der GD Funktionen memory leaks enthalten - von ImageCreateFromJPEG wird das zumindest immer wieder behauptet.

edit: Und benutz lieber eine Mailerklasse, nicht mail(), es ist reine Glückssache, wenn Mails damit ankommen...
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

Geändert von lstegelitz (27.04.2011 um 18:11 Uhr).
lstegelitz ist offline  
Alt 27.04.2011, 18:23  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Ok. Erstmal kommt es auf die Größe bzw. Auflösung (DPI) der Bilder an, wieviel RAM sie benötigen.
Es kommt ausschließlich auf die Maße in Pixeln an. Für DPI interessiert sich die GDLib nicht (bzw. „Computergrafik“ allgemein) - das ist ein Wert, der Drucker interessiert.

Und die GDLib arbeitet intern mit 32 Bit, also 4 Byte pro Pixel (RGB+Transparenz).
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline  
Alt 27.04.2011, 18:49  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Zitat:
Es kommt ausschließlich auf die Maße in Pixeln an. Für DPI interessiert sich die GDLib nicht (bzw. „Computergrafik“ allgemein) - das ist ein Wert, der Drucker interessiert.
Jep und Jain.
DPI heißt "Dots per Inch" und ist tatsächlich nur für die Print-Ausgabe gedacht. Eine weitere Größe, die aber aber oft synonym verwendet wird, ist PPI (Pixels per Inch). Dies ist für Computergrafik interessant, da hiermit a) die Pixeldichte auf Monitoren und damit b) die Erscheinungsgröße von Grafiken beeinflusst wird.
Die GDLib interessiert das aber natürlich nicht, das stimmt. Wozu sollte es auch, letztendlich definiert sich die PPI nur durch die absolute und metrische Größenangabe, die das Bild hat, sowie der Menge an Pixeln.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Allowed Memory Size robydog PHP Tipps 2009 29 03.04.2010 18:22
Allowed Memory Size exhausted Exituz23 Server, Hosting und Workstations 4 01.02.2010 12:37
Fehler beim kompilieren von php 5.2.9 malio Server, Hosting und Workstations 11 05.06.2009 18:40
Memory Size - Trotz Umstellung Fehler! MaxDittmann PHP Tipps 2009 4 08.02.2009 00:33
Verzeichnis auslesen Manko10 Wiki Diskussionsforum 15 26.10.2008 21:43
Memory exhausted PHP Tipps 2005-2 2 29.08.2005 19:47
[Erledigt] Fatal error: Allowed memory size... PHP Tipps 2005-2 5 07.07.2005 13:01
Allowed Memory Size exhausted bicpi PHP-Fortgeschrittene 16 20.04.2005 00:28
different size in shared object, consider re-linking!? Heart Datenbanken 1 09.03.2005 15:42
Fatal error: Allowed memory size of 8192 bytes exhausted at PHP Tipps 2005 11 06.03.2005 19:26
[Erledigt] imagecreatetruecolor memory size PHP-Fortgeschrittene 2 10.09.2004 17:52
Fatal error: Allowed memory size of PHP Tipps 2004 4 04.09.2004 17:50
[Erledigt] Memory Problem mit gd PHP-Fortgeschrittene 1 25.06.2004 18:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
imagecreatefromjpeg memory, php imagecreatefromjpeg, imagecreatefromjpeg allowed memory size, imagecreatefromjpeg, imagecreatefromjpeg exhausted, imagecreatefromjpeg memory size exhausted, http://www.php.de/php-einsteiger/68265-imagecreatefromjpeg-allowed-memory-size-exhausted.html, imagecreatefromjpeg ram, imagecreatefromjpeg php, imagecreatefromjpeg allowed memory size exhausted, imagecreatefromjpeg speicher, imagecreatetruecolor allowed memory size, php imagecreatefromjpeg allowed memory size exhausted, imagecreatefromjpeg speicher freigeben, memory exhausted, imagecreatefromjpeg memory exhausted, php imagecreatefromjpeg size, php imagecreatefromjpeg allowed memory, php.ini speicher freigeben, erst imagecreatefromjpeg und dann resizen?

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum