2009-08-13 13 views
6

Quasi sempre ho uno script di ridimensionamento PHP (utilizzando GD) nei siti Web per i miei clienti. Non importa quante volte dico loro di ridimensionare le loro enormi immagini da 7 MP dalla loro fotocamera digitale prima di caricarle, non lo fanno mai. Il risultato è un errore "Memoria insufficiente" dal server e l'immagine non viene ridimensionata, in quanto l'immagine originale era troppo grande per la risoluzione.Ridimensionare le immagini troppo grandi per GD Library sul mio server

C'è un modo migliore per ridimensionare le immagini veramente grandi? Esiste un servizio che offre un'API che potrei sfruttare attraverso il mio script per ridimensionare queste immagini di grandi dimensioni?

+0

ImageMagick consente il ridimensionamento efficiente in fase di caricamento, vedere ulteriori dettagli in questa risposta: http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing-in-php/4613341#4613341 –

risposta

3

È possibile chiamare Imagemagick per ridimensionare l'immagine dalla pagina php, ma c'è un titolo importa allora se si consente chiamate di sistema

Qualsiasi API userà un sacco di memoria, è possibile modificare l'aswell php memory_limit.

1

È possibile eseguire il shell out su un programma esterno, ad esempio utilizzando convert.

1

come circa il caricamento di loro poi in coda il lavoro di ridimensionamento, uno script php riga di comando può quindi prendere e di processo (più veloce e può avere un limite distinto di memoria e tempo di esecuzione)

3

Se si ha a disposizione ImageMagick api nel vostro Configurazione PHP - usalo! ImageMagick non viene conteggiato in PHP memory_limit e quindi può funzionare con file più grandi.

Se avete davvero alcun controllo del server, la soluzione rapida e molto male è - dopo aver ottenuto il file immagine da $ _POST, per prima cosa controllare le dimensioni con:

<?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

Mi è piaciuto il "messaggio di avviso" ":) –

1

Proprio li rendono ridimensionare più piccolo prima di caricarlo. MAX_FILE_SIZE

+0

Questo non è un allenamento. Le immagini potrebbero avere molti pixel (come 2000x5700) anche se sono piuttosto piccole (come 304 KB). – Christian

0

Avevo passato un po 'di tempo a cercare di eseguire il debug del codice PHP che utilizzava GD direttamente, ma non riuscivo su immagini grandi e su un sottoinsieme di immagini che sembravano avere errori minori che ostruivano GD.

Ma poi ho trovato phpThumb (http://phpthumb.sourceforge.net/) e non torno mai indietro. Dopo l'aggiunta di due file PHP alla mia directory web (phpthumb.class.php e phpthumb.functions.php) ero in grado di utilizzare il seguente codice per generare i miei miniature:

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, funziona come un fascino, è abbastanza veloce e non ha problemi con le grandi File. Inoltre, può utilizzare GD o ImageMagick, a seconda di ciò che è disponibile sul server, quindi è relativamente portabile.

+0

ps. C'è anche phpThumb.php, al quale è possibile collegarsi, e che creerà direttamente la miniatura, in base alle informazioni della stringa di query (e di un file di configurazione), ma che non soddisfa le mie esigenze. – Magnus

2

Sono rimasto bloccato per giorni (e notti) con questo problema.

Inoltre, il limite di memoria dei provider differisce da uno all'altro. E cambiare il memory_limit in PHP non funziona su server condivisi, i provider di solito limitano la ram anche se phpinfo() dice che hai 128Mo (1 e 1 limiti di RAM a 60Mo per processo per esempio).

Ma finalmente ho trovato qualcosa di molto efficiente qui: http://www.imagemagick.org/Usage/files/#massive

Ha bisogno imagemagick, ma ho scoperto che la maggior parte dei provider fornisce nativamente presente sui propri server, anche quelli condivisi.

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

Come si dice:

  • env MAGICK_TMPDIR=<tmp_dir> impostare una directory temp per imagemagick per simulare ram (tipo di)

  • nice -5 è anche un comando unix per modificare la priorità di un processo (http://en.wikipedia.org/wiki/Nice_(Unix))

  • convert ... è la linea di comando ImageMagick

Il vero affare è di circa -limit memory 32 e -limit map 32. Questo è il modo in cui limiti la memoria usata dal binario (qui: 32Mo). Probabilmente dovrai adattare i valori per farli corrispondere ai valori del tuo server (in genere PHP ti dice la memoria massima allocata quando ti dà l'errore fatale. Ti suggerisco di dividere questo valore per 2 o 4 per essere confortable).

Ho anche bisogno di mettere un po 'altre linee nel mio PHP per evitare alcuni problemi collaterali:

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 

speranza tutto ciò che vi aiuterà ...


sapere se convert è accessibile il server, è possibile provare questo (in PHP):

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

Quella volontà ti da Pat h del binario, se esiste.

Problemi correlati