Самый эффективный способ создания миниатюр? - PullRequest
6 голосов
/ 16 сентября 2010

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

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

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 ]

2 голосов
/ 16 сентября 2010

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

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

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

1 голос
/ 19 августа 2011

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

1 голос
/ 16 сентября 2010

Если вы хотите использовать 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;
    }
    }
}
...