代码之家  ›  专栏  ›  技术社区  ›  Wyatt Jackson

ImageMagick是覆盖图像的最快方法吗?我该如何提高速度,还是有一种我不知道的更快的技术?

  •  2
  • Wyatt Jackson  · 技术社区  · 6 年前

    我正在构建一个图像处理Nginx-CDN/cache服务器,将数百万个独特的SVG设计文件覆盖在服装jpeg上。此处有类似教程: http://sumitbirla.com/2011/11/how-to-build-a-scalable-caching-resizing-image-server/

    我在这里编写了一个测试脚本:

    <?php
    
    $cmd = "composite GOSHEN.svg blank-tshirt.jpg -geometry 600x700+456+335 JPG:-";
    
    header("Content-type: image/jpeg");
    passthru($cmd);
    exit();
    
    ?>
    

    以下是一个示例结果:

    我的问题是ImageMagick太慢了。除了更多的CPU/内存,还有什么诀窍可以让它更快吗?是否有其他技术可以更快地覆盖图像?

    非常感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  5
  •   jcupitt    5 年前

    php-vips 可以比imagick快一点。我为您制作了一个测试程序:

    #!/usr/bin/env php
    <?php
    
    require __DIR__ . '/vendor/autoload.php';
    use Jcupitt\Vips;
    
    for($i = 0; $i < 100; $i++) {
        $base = Vips\Image::newFromFile($argv[1], ["access" => "sequential"]);
        $overlay = Vips\Image::newFromFile($argv[2], ["access" => "sequential"]);
    
        // centre the overlay on the image, but lift it up a bit    
        $left = ($base->width - $overlay->width) * 0.5;
        $top = ($base->height - $overlay->height) * 0.45;
    
        $out = $base->composite2($overlay, "over", ["x" => $left, "y" => $top]);
    
        // write to stdout with a mime header
        $out->jpegsave_mime();
    }       
    

    使用服务器中的测试映像:

    http://build9.hometownapparel.com/pics/

    然后在我的台式机(Ubuntu 17.10,一种快速i7 CPU)上运行,我看到:

    $ time ./overlay.php blank-tshirt.jpg GOSHEN.svg > /dev/null
    real    0m2.488s
    user    0m13.446s
    sys 0m0.328s
    

    因此,每幅图像约25ms。我看到了这个结果(显然是从第一次迭代中得到的):

    sample output

    我尝试了imagemagick示例的循环版本:

    #!/usr/bin/env php
    <?php
    
    header("Content-type: image/jpeg");
    
    for($i = 0; $i < 100; $i++) {
        $cmd = "composite GOSHEN.svg blank-tshirt.jpg -geometry 600x700+456+335 JPG:-";
    
        passthru($cmd);
    }     
    

    在IM-6.9.7-4(为Ubuntu打包的版本)上运行它,我看到:

    $ time ./magick.php > /dev/null
    real    0m29.084s
    user    0m42.289s
    sys 0m4.716s
    

    或每幅图像290ms。所以在这个测试中,php VIP的速度快了10倍以上。这有点不公平:imagick可能比单纯的炮制合成要快一点。

    这里还有另一个基准:

    https://github.com/jcupitt/php-vips-bench

    在这方面,php VIP的速度大约是imagick的4倍,所需内存减少了8倍。

    以下是打包为Dockerfile的整个内容,您应该能够在任何地方运行:

    https://github.com/jcupitt/docker-builds/tree/master/php-vips-ubuntu-16.04