PHP ImageMagick 将大图像拆分为图块

Posted

技术标签:

【中文标题】PHP ImageMagick 将大图像拆分为图块【英文标题】:PHP ImageMagick split large image to tiles 【发布时间】:2014-08-11 12:14:53 【问题描述】:

我正在尝试将大图像拆分为较小的图块。我使用 php ImageMagick cropImage() 进行了尝试,我可以使用以下代码成功完成。

for($w = 0; $w < ($large_image_width/$tile_width); $w++)
    for($h = 0; $h < ($large_image_height/$tile_height); $h++)
        $X = $w*$tile_width;
        $Y = $h*$tile_height;

        $image = new Imagick($input_file);
        $image->cropImage($tile_width,$tile_height, $X,$Y);
        $image->writeImage("X" . ($w+1) . "Y" . ($h+1) . ".jpg");
    

但它会循环遍历每个图块大小并一次又一次地加载图像。

当我做更多的研究时,我发现了这个link,这是一个使用命令行的单行。

convert -crop $WIDTHx$HEIGHT@ huge_file.png  tile_%d.png

我想知道 PHP ImageMagick 扩展是否有任何功能可以做同样的事情。我也很乐意切换到 Perl 或其他类似 GD 的库。

【问题讨论】:

【参考方案1】:

您可以通过加载一次图像,然后克隆对象来减少$input_file I/O。

$source_image = new Imagick($input_file);
for($w = 0; $w < ($large_image_width/$tile_width); $w++)
    for($h = 0; $h < ($large_image_height/$tile_height); $h++)
        $X = $w*$tile_width;
        $Y = $h*$tile_height;

        $image = clone $source_image;
        $image->cropImage($tile_width,$tile_height, $X,$Y);
        $image->writeImage("X" . ($w+1) . "Y" . ($h+1) . ".jpg");
    

您还可以优化和减少 for 循环,或者直接调用一个 liner。

system("convert -crop $WIDTHx$HEIGHT@ $input_file  tile_%d.png");

【讨论】:

非常感谢克隆方式。是的,我知道系统命令。我的意思是,PHP ImageMagick 扩展本身有什么方法吗? PECL 扩展本身没有。您可以通过组合 Imagick::cropImage 和 Imagick::setImagePage 来模仿该行为,但您已经在做的是最简单的。【参考方案2】:

libvips 现在有一个php binding,它只需很少的内存就可以非常快速地完成这项任务。

例如:

#!/usr/bin/env php
<?php

require __DIR__ . '/vendor/autoload.php';

use Jcupitt\Vips;

$im = Vips\Image::newFromFile($argv[1]);
$im->dzsave($argv[2], ["overlap" => 0, "tile-size" => 256, "depth" => "one"]);

在这台带有 10k x 10k jpeg 图像的笔记本电脑上,我看到了:

$ time ./try260.php ~/pics/wtc.jpg x
real    0m2.262s
user    0m3.596s
sys 0m1.256s

它在x_files中创建了1369个jpeg文件:

$ ls x_files/0/ | wc
   1369    1369   14319

这里有一篇关于 dzsave 运算符(这里使用的 libvips 东西)的博文:

http://libvips.blogspot.co.uk/2013/03/making-deepzoom-zoomify-and-google-maps.html

【讨论】:

以上是关于PHP ImageMagick 将大图像拆分为图块的主要内容,如果未能解决你的问题,请参考以下文章

ImageMagick 平铺因 JPEG 失败

使用 Imagemagick 将大图像裁剪为特定的纵横比,然后调整它们的大小

ImageMagick:转换、裁剪、调整大图像

如何从 Android 中的大位图加载图块?

使用 imagemagick 组合图块以创建图像

将两个透明 gif 合并为图层