我正在尝试将大图片拆分为较小的图块。我尝试使用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这样的库。
答案 0 :(得分:4)
您可以通过加载图像一次,然后克隆对象来减少$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");
}
}
您还可以优化&amp;减少for循环,或直接调用一个衬垫。
system("convert -crop $WIDTHx$HEIGHT@ $input_file tile_%d.png");
答案 1 :(得分:1)
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