2009-08-13 3 views
6

Ich habe fast immer eine PHP-Größe ändern Skript (mit GD) in Websites für meine Kunden. Egal, wie oft ich ihnen sage, dass sie ihre riesigen 7-Megapixel-Bilder von ihrer Digitalkamera aus verändern sollen, bevor sie sie hochladen, tun sie es immer noch nicht. Das Ergebnis ist ein "Out of Memory" -Fehler vom Server, und das Bild wird nicht in der Größe geändert, da das ursprüngliche Bild zu groß für die Auflösung war.Größe der Bilder zu groß für GD-Bibliothek auf meinem Server

Gibt es einen besseren Weg, um wirklich große Bilder, um die Größe? Gibt es einen Dienst, der eine API anbietet, die ich über mein Skript anzapfen kann, um die Größe dieser großen Bilder zu ändern?

+0

ImageMagick ermöglicht eine effiziente Größenanpassung bei Belastung, siehe weitere Details in dieser Antwort: http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing-in-php/4613341#4613341 –

Antwort

3

Sie können Imagemagick rufen Sie das Bild von Ihrer PHP-Seite, um die Größe, aber es gibt eine Sicherheits Sache dann, wenn Sie System erlauben Anrufe

Jede API wird viel Speicher verwenden, können Sie Ihre PHP memory_limit aswell ändern.

1

Sie könnten an ein externes Programm berappen, zum Beispiel convert verwenden.

1

wie über sie dann das Hochladen des Resize-Job Queuing, eine PHP-Skript-Befehlszeile kann dann abholen und Prozess (schneller und kann ein separates Speicherlimit und Ausführungszeit hat)

3

Wenn Sie in verfügbar ImageMagick api haben Ihre PHP-Konfiguration - nutze sie! ImageMagick wird nicht in PHP memory_limit gezählt und kann daher mit größeren Dateien arbeiten.

Wenn Sie wirklich keine Kontrolle über den Server haben, die schnell und sehr schlechte Abhilfe ist - nachdem die Bilddatei von $ _POST bekommen, zuerst die Abmessungen überprüfen:

<?php 
$image_size = getimagesize("yourfile.jpg") 
$mem_usage = $image_size[0] * $image_size[1] * 4 //4 bytes per pixel (RGBA) 
if ($mem_usage > $mem_aviable) { 
    die ('Please upload smaller pic. I tell you that all the time. '. 
     'Resize yout huge 7MP images from your digital camera '. 
     'before uploading them.'); //Better put something more polite here. 
} 
+0

Liebte die "Warnmeldung ":) –

1

Gerade sie machen die Größe kleiner bevor sie es hochladen. MAX_FILE_SIZE

+0

Dies wird nicht trainieren. Bilder können viele Pixel (wie 2000x5700) haben, obwohl sie ziemlich klein sind (wie 304KB). – Christian

0

Ich habe einige Zeit damit verbracht, PHP-Code zu debuggen, der GD direkt verwendet hat, aber auf großen Bildern und auf einer Teilmenge von Bildern, die kleinere Fehler zu haben scheinen, die GD ersticken.

Aber dann fand ich phpThumb (http://phpthumb.sourceforge.net/), und ich werde nie wieder. Nach der Zugabe von zwei PHP-Dateien auf dem Web-Verzeichnis (phpthumb.class.php und phpthumb.functions.php) konnte ich den folgenden Code verwenden, um meine Thumbnails zu erzeugen:

include("phpthumb.class.php"); 

// Load data into phpThumb object and set parameters 
$phpThumb = new phpThumb(); 
$phpThumb->setSourceData(file_get_contents($_GET['filename'])); 
$phpThumb->setParameter('w', $width); // Set width 
$phpThumb->setParameter('h', $height); // Set height 
$phpThumb->setParameter('zc', 1);  // Specify zoom-crop (instead of stretch) 
$phpThumb->setParameter('q', 100);  // Specify quality 

// Generate & output thumbnail 
$phpThumb->GenerateThumbnail();  // Generate the thumbnail 
$phpThumb->OutputThumbnail();   // Output it to browser 
$phpThumb->RenderToFile("$thumbname"); // Output it to file 
$phpThumb->purgeTempFiles();   // Clean up 

Boom, wirkt wie ein Zauber, ziemlich schnell und hat keine Probleme mit großen Dateien. Es kann auch entweder GD oder ImageMagick verwenden, je nachdem, was auf dem Server verfügbar ist, daher ist es relativ portabel.

+0

ps. Es gibt auch phpThumb.php, mit dem Sie eine Verknüpfung herstellen können, und die das Thumbnail direkt erstellt, basierend auf Informationen aus der Abfragezeichenfolge (und einer Konfigurationsdatei), aber das entsprach nicht meinen Bedürfnissen. – Magnus

2

habe ich für Tage (und Nächte) mit diesem Problem stecken.

Darüber hinaus unterscheidet sich Anbieter Speichergrenze von einem zum anderen. Und die memory_limit in PHP ändert sich nicht auf gemeinsam genutzten Servern arbeiten, begrenzen Anbieter in der Regel den Widder selbst wenn phpinfo() sagt, dass Sie 128Mo (1und1 Grenzen RAM 60Mo pro Prozess zum Beispiel) bekam.

Aber ich fand schließlich etwas ganz effizient hier: http://www.imagemagick.org/Usage/files/#massive

Es imagemagick braucht, aber ich entdeckte, dass die meisten Anbieter nativ diese auf ihren Servern bietet, auch geteilt diejenigen.

exec('env MAGICK_TMPDIR=<tmp_dir> nice -5 convert -limit memory 32 -limit map 32 -resize 800x600 huge.jpg reasonable.jpg'); 

Wie gesagt:

  • env MAGICK_TMPDIR=<tmp_dir> ein temporäres Verzeichnis für imagemagick RAM zu simulieren einzurichten (Art)

  • nice -5 ist auch ein Unix-Befehl, um die Priorität zu ändern ein Prozess (http://en.wikipedia.org/wiki/Nice_(Unix))

  • convert ... ist die ImageMagick Befehlszeile

The real deal ist über -limit memory 32 und -limit map 32. Auf diese Weise begrenzen Sie den von der Binärdatei verwendeten Speicher (hier: 32Mo). Sie müssen wahrscheinlich die Werte anpassen, um die Werte Ihres Servers zu entsprechen (Im Allgemeinen teilt Ihnen PHP den maximal zugewiesenen Speicher mit, wenn Sie den Fatalen Fehler erhalten. Ich empfehle Ihnen, diesen Wert durch 2 oder 4 zu teilen, um bequem zu sein).

ich brauche auch einige andere Linien in meinem PHP setzen einige Sicherheiten Probleme zu vermeiden:

ignore_user_abort(true); // ignore user abort : let the script finish resizing even if user aborts 
set_time_limit(0); // ignore server timeout 
putenv('MAGICK_THREAD_LIMIT=1'); // limit the number of thread for the binary. Very important in my case 

hoffen, dass alle, die helfen ...


Um zu wissen, ob convert auf verfügbar ist Ihr Server, können Sie versuchen, dies (in PHP):

$out = array(); 
exec('which convert 2>&1', $out); 
print_r($out); 

Das wird Ihnen die pat h der Binärdatei, falls vorhanden.

Verwandte Themen