来自图像的PHP图片部分(CROP)

时间:2014-10-14 10:39:49

标签: php image crop imagick

您好我有很大的技术问题我需要裁剪图像到这样的部分:

enter image description here 一个部件是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/');

1 个答案:

答案 0 :(得分:1)

在命令行(在中型iMac上)我可以使用以下命令在2分44秒内完成您尝试执行的操作:

convert -crop 500x500 image.jpg tile%04d.jpg

通过这种方式,您只需阅读一次图像,并且只执行convert一次,并为您计算出所有图块,每个图块为500x500,其名称为tile1799.jpg

<强>更新

为了更快地完成它,我做到了这一点。首先,将图像平铺为4个象限,称为quad00.jpgquad01.jpgquad02.jpgquad03.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