【问题标题】:Most Efficient Way to Create Thumbnails?创建缩略图的最有效方法?
【发布时间】:2011-04-12 22:48:15
【问题描述】:

我有大量的缩略图要做。目前,我正在使用 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。

【问题讨论】:

  • 这是一次性的大批量,还是您想将其集成到实时网络应用程序或类似的东西中?
  • 这不是一次性的。我会随时制作缩略图。
  • 什么你想要缩略图的文件类型? PDF?

标签: php graphics image-processing imagemagick graphicsmagick


【解决方案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;
    }
    }
}

【讨论】:

  • 如何指定像素分辨率、要使用的压缩等?
  • 指定 65% 质量(适用于 imagejpegimagegif 等):imagejpeg($newImage, $destination, 65);
  • 不确定像素分辨率或压缩具体,但修改质量将间接控制这些。
【解决方案2】:

我假设您有某种需要拇指的图像队列,并且您的应用程序可以通过它们运行?您可以考虑将一些工作转移到 EC2 之类的东西上。如果您的队列超过一定大小,则启动一个预先准备好的 EC2 实例来处理负载。如果队列很大,您甚至可以启动几台机器。

您不需要一直运行这些实例 - 只有在您自己的服务器无法处理负载时才需要它们。

显然,您需要预测您的成本以查看是否值得,但鉴于您只需按使用时间付费,而且价格从 8.5 美分/小时开始,这可能足以满足您的需求。

【讨论】:

  • 我很惊讶没有用于生成缩略图的公共 AMI。如果有人正在寻找一个,这似乎是一个学习 EC2 的好项目:-)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2019-11-17
    • 2016-11-18
    • 2010-09-09
    • 1970-01-01
    • 2020-10-29
    • 2011-01-18
    相关资源
    最近更新 更多