2010-09-15 4 views
6

J'ai un énorme volume de thumbnailing à faire. Actuellement, j'utilise ImageMagick, mais cela s'avère trop inefficace (c'est trop lent, il y a trop de CPU/mémoire, etc.).Façon la plus efficace de créer des miniatures?

J'ai commencé à évaluer GraphicsMagick, dont je m'attendais à obtenir des résultats «wow». Je ne les ai pas eu. Quelqu'un peut-il prendre un coup d'oeil à mon script de référence (fait vitesse simple et comparaison de la taille du fichier uniquement, aucun contrôle CPU et mémoire encore):

http://pastebin.com/2gP7Eaxc

Voici un exemple de sortie que je suis:

'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 n'est pas beaucoup plus rapide - et les tailles de fichiers en sortie sont significativement plus élevés que ImageMagick.

+3

S'agit-il d'un gros lot unique, ou essayez-vous d'intégrer cela dans une application Web en temps réel ou quelque chose de similaire? – dkamins

+0

Ce n'est pas unique. Je vais mettre les choses en miniature à tout moment. – StackOverflowNewbie

+0

* De quel type de fichier voulez-vous les miniatures? PDF? –

Répondre

1

Si vous voulez utiliser GD2, essayez cette fonction que j'utilise. Il est assez facile à utiliser:

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

Comment spécifier la résolution en pixels, la compression à utiliser, etc. – StackOverflowNewbie

+0

Pour spécifier 65% de qualité (fonctionne sur 'imagejpeg',' imagegif', etc.): 'imagejpeg ($ newImage, $ destination, 65);' –

+0

Vous n'êtes pas sûr de la résolution de pixels ou de la compression, mais modifiez indirectement la qualité contrôler ceux-ci. –

2

Je suppose que vous avez une sorte de file d'attente d'images qui nécessitent les pouces et votre application fonctionne à travers eux? Vous pourriez envisager de siphonner une partie du travail vers quelque chose comme EC2. Si votre file d'attente dépasse une certaine taille, lancez une instance EC2 pré-préparée pour traiter la charge à la place. Vous pourriez même lancer plusieurs machines si la file d'attente était massive.

Vous n'avez pas besoin de ces instances pour s'exécuter tout le temps - vous en avez seulement besoin lorsque votre propre serveur n'est pas capable de gérer le chargement. Il est évident que vous devez prévoir vos coûts pour voir si cela en valait la peine, mais étant donné que vous ne payez que pour le temps que vous utilisez et que les prix commencent à 8.5c/heure, cela pourrait être assez économique pour vos besoins.

+0

Je suis surpris qu'il n'y ait pas d'AMI publique pour la génération de vignettes. On dirait un bon projet pour apprendre EC2 avec si quelqu'un en cherche un :-) – dkamins

1

Je vous suggère d'utiliser ExactImage. Selon les benchmarks, il est plus rapide que ImageMagick.

Questions connexes