创建缩略图最有效的方法是什么?

8
我有大量的缩略图需要处理。目前,我正在使用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快很多,而且输出的文件大小显著高于ImageMagick。


3
这是针对一次性大批量的生产,还是您正尝试将其集成到实时Web应用程序或类似的东西中? - dkamins
这不是一次性的。我将始终使事物缩略图化。 - StackOverflowNewbie
你想要从哪种文件类型生成缩略图?PDF文件吗? - Kurt Pfeifle
3个回答

2
我假设你有一些需要生成缩略图的图片队列,并且你的应用程序会逐个处理它们?你可以考虑将部分工作转移到像 EC2 这样的东西上。如果你的队列超过了某个大小,就启动一个预先准备好的 EC2 实例来处理负载。如果队列非常大,甚至可以启动多台机器。
你不需要让这些实例一直运行-只有在你自己的服务器无法处理负载时才需要它们。
显然,你需要预测成本来确定是否值得,但是由于你只支付使用时间,而价格从每小时 8.5 美分开始,所以可能对你的需求经济实惠。

我很惊讶没有公共AMI用于缩略图生成。如果有人正在寻找一个好的EC2项目来学习,这似乎是一个不错的选择 :-) - dkamins

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;
    }
    }
}

我该如何指定像素分辨率、压缩方式等? - StackOverflowNewbie
要指定65%的质量(适用于imagejpegimagegif等):imagejpeg($newImage, $destination, 65); - Chris Laplante
不确定像素分辨率或压缩方面的具体情况,但修改质量将间接控制这些内容。 - Chris Laplante

1
我建议您使用ExactImage。根据基准测试,它比ImageMagick更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接