爲了讓這個函數更加靈活以支持任意大小的圖片和不同的分割大小,我們可以將函數的參數稍作調整,使其接受目標分割尺寸(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
的剩餘部分。
來自文心一言的回答