为了让这个函数更加灵活以支持任意大小的图片和不同的分割大小,我们可以将函数的参数稍作调整,使其接受目标分割尺寸(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
的剩余部分。
来自文心一言的回答
标签:分割,截图,1w,递归,4w,targetSize
From: https://www.cnblogs.com/anniu1122/p/18176524