2010-09-15 10 views
6

Ich habe eine große Menge Thumbnailing zu tun. Derzeit verwende ich ImageMagick, aber es erweist sich als zu ineffizient (es ist zu langsam, verwendet zu viel CPU/Speicher, etc.).Die effizienteste Möglichkeit, Thumbnails zu erstellen?

Ich habe begonnen, GraphicsMagick zu evaluieren, von denen ich erwartete, dass "wow" Ergebnisse von erhalten. Ich habe sie nicht verstanden. Kann jemand einen kurzen Blick auf meine Benchmark-Skript nehmen (tut einfache Geschwindigkeit und Größe Vergleichsdatei nur, keine CPU und Speicher überprüft noch):

http://pastebin.com/2gP7Eaxc

Hier ist ein Beispiel für die Ausgabe Ich habe:

'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 ist nicht viel schneller - und die ausgegebenen Dateigrößen sind SIGNIFICANTly höher als ImageMagick.

+3

Ist dies für einen großen einmaligen Batch oder versuchen Sie, dies in eine Echtzeit-Web-App oder etwas Ähnliches zu integrieren? – dkamins

+0

Es ist nicht einmalig. Ich werde die Dinge immer auf Miniatur sehen. – StackOverflowNewbie

+0

* Aus welchem ​​Dateityp sollen Thumbnails erstellt werden? PDF? –

Antwort

1

Ich möchte GD2 verwenden, versuchen Sie diese Funktion, die ich verwende. Es ist ziemlich einfach zu bedienen:

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

Wie lege ich die Pixelauflösung, die zu verwendende Komprimierung usw. fest? – StackOverflowNewbie

+0

Um 65% Qualität anzugeben (funktioniert auf 'imagejpeg',' imagegif' usw.): 'imagejpeg ($ newImage, $ destination, 65);' –

+0

Nicht sicher über Pixelauflösung oder Komprimierung speziell, aber die Qualität wird indirekt geändert kontrolliere diese. –

2

Ich nehme an, Sie irgendeine Art von Warteschlange von Bildern haben, die Daumen benötigen und Ihre App funktioniert durch sie? Sie könnten etwas von der Arbeit auf etwas wie EC2 abheben. Wenn Ihre Warteschlange eine bestimmte Größe überschreitet, starten Sie eine vorbereitete EC2-Instanz, um die Auslastung zu verarbeiten. Sie könnten sogar mehrere Maschinen anwerfen, wenn die Warteschlange massiv wäre.

Sie müssen diese Instanzen nicht ständig ausführen - Sie brauchen sie nur, wenn Ihr eigener Server die Last nicht verarbeiten kann.

Offensichtlich müssten Sie Ihre Kosten prognostizieren, um zu sehen, ob es das wert war, aber wenn Sie nur für die Zeit bezahlen, die Sie verwenden, und die Preise beginnen bei 8,5c/Stunde, könnte es wirtschaftlich genug für Ihre Bedürfnisse sein.

+0

Ich bin überrascht, dass es kein öffentliches AMI für die Thumbnail-Generierung gibt. Scheint wie ein gutes Projekt, um EC2 zu lernen, wenn jemand nach einem sucht :-) – dkamins

1

Ich würde vorschlagen, dass Sie ExactImage verwenden. Laut den Benchmarks ist es schneller als der ImageMagick.

Verwandte Themen