您好我有很大的技术问题我需要裁剪图像到这样的部分:
一个部件是500px x 500px,除了空间较小的情况。
示例图像尺寸为1920px x 1080px总计我有12个部分的图像。
我的问题我有非常大的图像它 30 000px x 20 000px 它有 2800part s。
我尝试使用php imagemagic library
imagemagic命令行代码:http://www.ioncannon.net/linux/81/5-imagemagick-command-line-examples-part-1/
使用此命令我可以裁剪图像位置:convert flower.jpg -crop 500×500+0+0 flower_crop.jpg
第一个和第二个参数零件宽度高度:500;
第三个和第四个参数是从位置开始裁剪;
如果我需要得到2800个我需要的部分,我测试每20秒裁剪一个部分:2800 x 20 / 60 / 60 = 15-16~ hours
我需要得到最快的结果。我该怎么做..
完整的PHP代码:
public function cutImgIntoPieces($imgPieceSizeWidth, $imgPieceSizeHeight, $outputDir) {
$pieceWidth = $imgPieceSizeWidth;
$pieceHeight = $imgPieceSizeHeight;
$divWidth = floor($this->getImgWidth() / $pieceWidth);
$modWidth = $this->getImgWidth() % $pieceWidth;
$divHeight = floor($this->getImgHeight() / $pieceHeight);
$modHeight = $this->getImgHeight() % $pieceHeight;
for ($i = 0; $i <= $divWidth; $i++) {
for ($j = 0; $j <= $divHeight; $j++) {
$pieceWidth = ($i == $divWidth ? $modWidth : $imgPieceSizeWidth);
$pieceHeight = ($j == $divHeight ? $modHeight : $imgPieceSizeHeight);
exec("cd ". $this->getDirName() . " & convert " . $this->getFullFileName() . " -crop " . $pieceWidth . "x" . $pieceHeight . "+" . $imgPieceSizeWidth * $i . "+" . $imgPieceSizeHeight * $j . " " . $i . "_" . $j . ".jpg");
}
}
}
$img->cutImgIntoPieces(500, 500, 'C:/xampp/htdocs/');
答案 0 :(得分:1)
在命令行(在中型iMac上)我可以使用以下命令在2分44秒内完成您尝试执行的操作:
convert -crop 500x500 image.jpg tile%04d.jpg
通过这种方式,您只需阅读一次图像,并且只执行convert
一次,并为您计算出所有图块,每个图块为500x500,其名称为tile1799.jpg
。
<强>更新强>
为了更快地完成它,我做到了这一点。首先,将图像平铺为4个象限,称为quad00.jpg
,quad01.jpg
,quad02.jpg
和quad03.jpg
,如下所示 - 请注意最后的@
指定的图块数量而不是大小:
convert -crop 2x2@ image.jpg quad%02d.jpg
现在我可以运行4个并行进程将象限分成500x500个磁贴并保持所有CPU内核忙碌:
#!/bin/bash
convert -crop 500x500 quad00.jpg tile0-%04d.jpg &
convert -crop 500x500 quad01.jpg tile1-%04d.jpg &
convert -crop 500x500 quad02.jpg tile2-%04d.jpg &
convert -crop 500x500 quad03.jpg tile3-%04d.jpg &
wait
将原始图像分成4个象限需要52秒,然后将所有四个象限平行分成500x500个图块再花7秒,总时间为59秒。
在回答您关于不平等地调整原始4个象限的进一步问题时,您可以自由地做最初的四个象限但是你喜欢 - 你知道你的图像比我更好!事实上,根据您的CPU,您可能最好使用8个初始图块,或者可能是2.无论如何,您需要进行实验。为了做到这一点,你可以像这样计算你的图像的大小(宽度和高度),然后做一些数学来决定你想要如何做初始象限,或一半或其他:
# Get width
w=$(identify -format %w image.jpg)
echo $w
30000
# Get height
h=$(identify -format %h image.jpg)
echo $h
20000