假設每次截圖有個命令 shotimg ,每次只能處理最大1w高 1w寬的圖,現在有一張4w*4w的圖需要截圖,php遞歸怎麼寫

爲了讓這個函數更加靈活以支持任意大小的圖片和不同的分割大小,我們可以將函數的參數稍作調整,使其接受目標分割尺寸(targetSize)作爲參數,而不是硬編碼爲10000。同時,我們可以使用整數除法(//)來確保分割的尺寸是整數,並且使用模數運算符(%)來檢查是否需要進行最後一次不完全的分割。

以下是修改後的函數:

function splitAndProcessImage($imagePath, $outputDir, $startX = 0, $startY = 0, $width, $height, $targetSize) {
    // 檢查當前區域是否小於或等於目標分割尺寸
    if ($width <= $targetSize && $height <= $targetSize) {
        // 處理這個區域
        // 調用shotimg命令或其他截圖邏輯
        // 示例:shell_exec("shotimg --region {$startX},{$startY},{$width},{$height} {$imagePath} {$outputDir}/output_{$startX}_{$startY}_{$width}_{$height}.png");
        echo "Processing region {$startX},{$startY},{$width},{$height}\n";
    } else {
        // 計算水平和垂直方向上的分割數量
        $horizontalSplits = ceil($width / $targetSize);
        $verticalSplits = ceil($height / $targetSize);

        // 遍歷所有子區域
        for ($i = 0; $i < $horizontalSplits; $i++) {
            $subWidth = ($i == $horizontalSplits - 1) ? $width - $i * $targetSize : $targetSize;
            for ($j = 0; $j < $verticalSplits; $j++) {
                $subHeight = ($j == $verticalSplits - 1) ? $height - $j * $targetSize : $targetSize;

                $subStartX = $startX + $i * $targetSize;
                $subStartY = $startY + $j * $targetSize;

                // 遞歸調用處理子區域
                splitAndProcessImage($imagePath, $outputDir, $subStartX, $subStartY, $subWidth, $subHeight, $targetSize);
            }
        }
    }
}

// 使用示例
$imagePath = 'path/to/your/large/image.png';
$outputDir = 'path/to/output/directory/';
$targetSize = 10000; // 你可以根據需要設置這個值
$width = 60000; // 假設圖片寬度爲6w
$height = 60000; // 假設圖片高度爲6w
splitAndProcessImage($imagePath, $outputDir, 0, 0, $width, $height, $targetSize);

在這個修改後的版本中,函數會遞歸地將圖片分割成多個不超過$targetSize的小塊,並處理這些小塊。注意,在計算子區域的寬度和高度時,我們使用了三元運算符來檢查是否是最後一次分割(即最後一個子區域),以確保能夠處理那些可能小於$targetSize的剩餘部分。

來自文心一言的回答
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章