2010-09-15 13 views
6

Ho un enorme volume di thumbnailing da fare. Attualmente sto usando ImageMagick, ma si sta rivelando troppo inefficiente (è troppo lento, usa troppa CPU/memoria, ecc.).Il modo più efficiente per creare miniature?

Ho iniziato a valutare GraphicsMagick, che mi aspettavo di ottenere risultati "wow". Non li ho presi. Qualcuno può dare una rapida occhiata al mio script di riferimento (lo fa la velocità semplice e unico confronto le dimensioni del file; nessuna CPU e memoria assegni):

http://pastebin.com/2gP7Eaxc

Ecco un esempio di output che ho ottenuto:

'gm convert' took 75.0039 seconds to execute 10 iteration(s). 
'convert' took 83.1421 seconds to execute 10 iteration(s). 
Average filesize of gm convert: 144,588 bytes. 
Average filesize of convert: 81,194 bytes. 

GraphicsMagick non è molto più veloce e le dimensioni dei file emessi sono SIGNIFICATAMENTE più elevate di ImageMagick.

+3

È per un grande lotto one-off o stai cercando di integrarlo in un'app Web in tempo reale o qualcosa di simile? – dkamins

+0

Non è una tantum. Otterrò le cose in anteprima in ogni momento. – StackOverflowNewbie

+0

* di quale tipo di file vuoi ottenere le miniature? PDF? –

risposta

1

Se si desidera utilizzare GD2, provare questa funzione che utilizzo. E 'abbastanza facile da usare:

function scaleImage($source, $max_width, $max_height, $destination) { 
    list($width, $height) = getimagesize($source); 
    if ($width > 150 || $height > 150) { 
    $ratioh = $max_height/$height; 
    $ratiow = $max_width/$width; 
    $ratio = min($ratioh, $ratiow); 
    // New dimensions 
    $newwidth = intval($ratio * $width); 
    $newheight = intval($ratio * $height); 

    $newImage = imagecreatetruecolor($newwidth, $newheight); 

    $exts = array("gif", "jpg", "jpeg", "png"); 
    $pathInfo = pathinfo($source); 
    $ext = trim(strtolower($pathInfo["extension"])); 

    $sourceImage = null; 

    // Generate source image depending on file type 
    switch ($ext) { 
     case "jpg": 
     case "jpeg": 
     $sourceImage = imagecreatefromjpeg($source); 
     break; 
     case "gif": 
     $sourceImage = imagecreatefromgif($source); 
     break; 
     case "png": 
     $sourceImage = imagecreatefrompng($source); 
     break; 
    } 

    imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 

    // Output file depending on type 
    switch ($ext) { 
     case "jpg": 
     case "jpeg": 
     imagejpeg($newImage, $destination); 
     break; 
     case "gif": 
     imagegif($newImage, $destination); 
     break; 
     case "png": 
     imagepng($newImage, $destination); 
     break; 
    } 
    } 
} 
+0

Come specificare la risoluzione dei pixel, la compressione da usare, ecc.? – StackOverflowNewbie

+0

Per specificare il 65% di qualità (funziona su 'imagejpeg',' imagegif', ecc.): 'Imagejpeg ($ newImage, $ destination, 65);' –

+0

Non sono sicuro della risoluzione o della compressione dei pixel in modo specifico, ma la modifica della qualità sarà indirettamente controllarli. –

2

io suppone che si abbia una sorta di coda di immagini che richiedono il pollice e la vostra applicazione funziona attraverso di loro? Potresti cercare di sottrarre parte del lavoro a qualcosa come EC2. Se la tua coda supera una determinata dimensione, attiva un'istanza EC2 preparata per elaborare il carico. Potresti persino far partire diverse macchine se la coda fosse massiccia.

Non hai bisogno di queste istanze per eseguire tutto il tempo - ne hai solo bisogno quando il tuo server non è in grado di gestire il carico.

Ovviamente avresti bisogno di prevedere i costi per vedere se ne valesse la pena, ma dato che paghi solo per il tempo che usi e i prezzi partono da 8,5 C/ora potrebbe essere abbastanza economico per le tue esigenze.

+0

Sono sorpreso che non ci sia una AMI pubblica per la generazione di miniature. Sembra un buon progetto per imparare EC2 se qualcuno ne sta cercando uno :-) – dkamins

1

Ti suggerisco di utilizzare ExactImage. Secondo i benchmark è più veloce di ImageMagick.

Problemi correlati