2011-01-06 14 views
1

Ich erstelle derzeit eine PHP-Website, wo Benutzer Bilder hochladen können, die dann in einer angemessenen Größe geändert werden müssen. Meine PHP-Konfiguration ist auf ein Speicherlimit von 50 MB eingestellt.Reduzierung der php Speicherverbrauch für Bildgrößenänderung

Das Problem ist, wenn Bilder über 5mb hochgeladen werden, php ist nicht in der Lage, das Bild zu vergrößern (wegen zu viel Gedächtnisgebrauch). Also habe ich mich gefragt, ob es sowieso eine Optimierung der Speichernutzung von Bildern in der Größe gibt. Hier ist, was ich zur Zeit verwenden:

class Image { 


    var $uploaddir; 
    var $quality = 80; 
    var $ext; 
    var $dst_r; 
    var $img_r; 
    var $img_w; 
    var $img_h; 
    var $output; 
    var $data; 
    var $datathumb; 

    function setFile($src = null) { 
    $this->ext = strtoupper(pathinfo($src, PATHINFO_EXTENSION)); 
    if(is_file($src) && ($this->ext == "JPG" OR $this->ext == "JPEG")) { 
    $this->img_r = ImageCreateFromJPEG($src); 
    } elseif(is_file($src) && $this->ext == "PNG") { 
    $this->img_r = ImageCreateFromPNG($src);  
    } elseif(is_file($src) && $this->ext == "GIF") { 
    $this->img_r = ImageCreateFromGIF($src); 
    } 
    $this->img_w = imagesx($this->img_r); 
    $this->img_h = imagesy($this->img_r); 
    } 

    function resize($largestSide = 100) { 
    $width = imagesx($this->img_r); 
    $height = imagesy($this->img_r); 
    $newWidth = 0; 
    $newHeight = 0; 

    if($width > $height){ 
     $newWidth = $largestSide; 
     $newHeight = $height * ($newWidth/$width); 
    }else{ 
     $newHeight = $largestSide; 
     $newWidth = $width * ($newHeight/$height); 
    } 

    $this->dst_r = ImageCreateTrueColor($newWidth, $newHeight); 
    imagecopyresampled($this->dst_r, $this->img_r, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 
    $this->img_r = $this->dst_r; 
    $this->img_h = $newHeight; 
    $this->img_w = $newWidth; 
    } 

    function createFile($output_filename = null) { 
    if($this->ext == "JPG" OR $this->ext == "JPEG" OR $this->ext == "PNG" OR $this->ext == "GIF") { 
    imageJPEG($this->dst_r, $this->uploaddir.$output_filename.'.'."jpg", $this->quality); 
    } /*elseif($this->ext == "PNG") { 
    imagePNG($this->dst_r, $this->uploaddir.$output_filename.'.'.$this->ext); 
    } elseif($this->ext == "GIF") { 
    imageGIF($this->dst_r, $this->uploaddir.$output_filename.'.'.$this->ext); 
    }*/ 
    $this->output = $this->uploaddir.$output_filename.'.'.$this->ext; 
    } 

    function setUploadDir($dirname) { 
    $this->uploaddir = $dirname; 
    } 

    function flush() { 
    $tempFile = $_FILES['Filedata']['tmp_name']; 
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/'; 
    $targetFile = str_replace('//','/',$targetPath) . $_FILES['Filedata']['name']; 

    imagedestroy($this->dst_r); 
    unlink($targetFile); 
    imagedestroy($this->img_r); 

    } 

Und dann zum Ändern der Größe ich tue:

$tempFile = $_FILES['Filedata']['tmp_name']; 
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/'; 
    $targetFile = str_replace('//','/',$targetPath) . $_FILES['Filedata']['name']; 

    move_uploaded_file ($tempFile, $targetFile); 

    $image = new Image(); 
    $image->setFile($targetFile); 
    $image->setUploadDir($targetPath); 
    $image->resize(200); 
    $image->createFile(md5($id)); 
    $image->flush(); 

Ich bin Strom mit Uploadify, aber es nutzt diese Upload/script ändern. Gibt es trotzdem eine Optimierung dieses Codes, so dass weniger Speicher benötigt wird?

Thanks :)

Antwort

2

ein 5000 x 5000 Pixel Bild wäre 16,7 Zoll bei 300DPI und das würde bei 5,2 Mb kommen. Vielleicht möchten Sie einige vernünftige Erwartungen an die Bildgröße stellen, etwa 10 Megapixel?

ein 14-Megapixel-Bild misst 4672 x 3104 und als JPEG würde gut innerhalb einer 5 MB Bildgröße Einschränkung passen.

auch sehen und sehen, ob es genügend Speichereinsparungen durch Verwendung einer Palleted-Methode wie imagecreate im Gegensatz zu imagecreatetruecolor gibt.

gibt es auch einig Hilfe bereits auf der PHP-Website für Ihre Speicheranforderungen auf Basis von Bildgröße here

+0

Danke, ich dachte, es war nicht die tatsächliche Dateigröße, aber die Dateiauflösung war das Problem. Ich habe den von Ihnen angegebenen Link zur Validierung verwendet. Danke vielmals. Ich habe auch .htaccess verwendet, um das Speicherlimit zu erhöhen, da ich Bilder mit 2848 x 4288 (12mp) nicht hochladen konnte, was für ein Bild mit einer Kamera ziemlich normal ist. – AzaraT

0

Die pragmatische Sache zu tun wäre, um nur ein externes Programm aufrufen, z.B. ImageMagick, um die Größenänderung vorzunehmen.

+0

Danke für die Antwort zu bestimmen, würde GD arbeiten? – AzaraT

+0

Nein. GD ist eine Bibliothek, kein eigenständiges Befehlszeilenprogramm. –

+0

Wenn Sie versuchen, die Speichernutzung zu reduzieren, ist ImageMagick nicht die beste Wahl. Es neigt dazu, mit Speicher- und Datenträgerverwendung zu laufen. Es wird zwar nicht dazu führen, dass das PHP-Skript aufgrund von Speicherbeschränkungen abstürzt, es könnte jedoch möglicherweise den gesamten Speicher auf dem Server verbrauchen, wodurch noch mehr Probleme entstehen. –

0

5 Mb ist eine sehr große Größe für ein Bild auf einer Website. Es kann sich lohnen zu hinterfragen, ob größere Dateien erlaubt und/oder von Ihrer Anwendung benötigt werden.

+1

-1 Dies beantwortet nicht die Frage, was die Reduzierung der Speichernutzung betrifft, und hilft niemandem, der mit Bildern arbeiten muss, die größer als 5 MB sind. – GiantCowFilms

0

Wussten Sie, dass mit imagecreatefromjpeg verwendet viel weniger Speicher als der Eröffnung des ersten in einen String (file_get_contents), um die Datei nach oben öffnen - und dann imagecreatefromstring mit?

Auch würde ich Dateiuploads auf 2-4MB beschränken. Es gibt keinen Grund für Leute, die Bandbreite zu verschwenden, indem sie riesige Dateien senden.

+0

Tue ich das eigentlich? – AzaraT

+0

-1, weil er file_get_contents nicht verwendet. – Craige

+0

@Craige habe ich gesagt, dass er es tat? Warum der Downvote für das Teilen von etwas, was die meisten Leute nicht wissen? – Xeoncross