2010-09-15 3 views
6

У меня огромный объем миниатюр. В настоящее время я использую ImageMagick, но он оказался слишком неэффективным (он слишком медленный, использует слишком много CPU/памяти и т. Д.).Самый эффективный способ создания миниатюр?

Я начал оценивать GraphicsMagick, от которого я ожидал получить «вау» результаты. Я не получил их. Может кто-то быстрый взгляд на мой эталонный сценарий (делает простой скорость и только сравнение размера файла, нет CPU и памяти проверяет пока):

http://pastebin.com/2gP7Eaxc

Вот пример вывода я получил:

'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 работает не так быстро - и размер файлов, выводимых на печать, существенно превосходит ImageMagick.

+3

Это для большой одноразовой партии, или вы пытаетесь интегрировать это в веб-приложение в реальном времени или что-то подобное? – dkamins

+0

Это не одноразовый. Я всегда буду делать вещи в миниатюре. – StackOverflowNewbie

+0

* какой * тип файла вы хотите эскизы из? PDF? –

ответ

1

Я хочу использовать GD2, попробуйте эту функцию, которую я использую. Это очень просто в использовании:

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

Как указать разрешение пикселей, сжатие и т. Д.? – StackOverflowNewbie

+0

Чтобы указать качество 65% (работает с 'imagejpeg',' imagegif' и т. Д.): 'Imagejpeg ($ newImage, $ destination, 65);' –

+0

Не уверен в отношении разрешения или сжатия пикселей, но изменение качества будет косвенно контролируйте их. –

2

Я предполагаю, что у вас есть какое-то очередь изображений, которые требуют большого пальца и ваше приложение работает через них? Вы могли бы взглянуть на сифонирование некоторых работ на что-то вроде EC2. Если ваша очередь превышает определенный размер, запустите предварительно подготовленный экземпляр EC2 для обработки нагрузки. Вы могли бы даже запустить несколько машин, если очередь была массивной.

Вам не нужны эти экземпляры для запуска все время - вам нужны только они, когда ваш собственный сервер не способен обрабатывать нагрузку.

Очевидно, что вам нужно будет прогнозировать свои расходы, чтобы убедиться, что это того стоит, но если вы платите только за время, которое вы используете, а цены начинаются с 8.5c/hour, это может быть достаточно экономичным для ваших нужд.

+0

Я удивлен, что нет публичного AMI для генерации миниатюр. Кажется, хороший проект, чтобы изучить EC2, если кто-то ищет один :-) – dkamins

1

Я предлагаю вам использовать ExactImage. В соответствии с эталонами он быстрее, чем ImageMagick.

Смежные вопросы