我正在尝试调整大小(保持纵横比)并裁剪图像的多余部分(缩略图限制之外),但在裁剪x =中心和y =顶部时执行此操作。
我在这里遗漏了一些东西,但是我的最终图像适合缩略图区域,而不是填充它并裁掉多余的部分。希望有人能帮助我。
这是我的代码,到目前为止:
$image_width = 725; // not static, just an example
$image_height = 409; // not static, just an example
// image can be wide or portrait
$width = 140;
$height = 160;
$thumbnail = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($thumbnail, 255, 255, 255);
imagefill($thumbnail, 0, 0, $white);
$width_ratio = $image_width/$width;
$height_ratio = $image_height/$height;
if ($width_ratio>$height_ratio) {
$dest_width=$width;
$dest_height=$image_height/$width_ratio;
}
else{
$dest_width=$image_width/$height_ratio;
$dest_height=$height;
}
$int_width = ($width - $dest_width)/2;
$int_height = ($height - $dest_height)/2;
imagecopyresampled($thumbnail, $original_image, $int_width, $int_height, 0, 0, $dest_width, $dest_height, $image_width, $image_height);
谢谢!
答案 0 :(得分:1)
您的$image_width
,$image_height
,$width
和$height
是静态的,这意味着$width_ratio
和$height_ratio
始终相同(分别为:5.1785714285714
和2.55625
,因此宽高比始终高于高度比。)
在这种情况下,这段代码:
if ($width_ratio>$height_ratio) {
$dest_width=$width;
$dest_height=$image_height/$width_ratio;
}
else{
$dest_width=$image_width/$height_ratio;
$dest_height=$height;
}
将始终运行if
并且永远不会运行else
- 删除它并离开:
$dest_width=$image_width/$height_ratio;
$dest_height=$height;
并且您的图像将根据较高的值进行裁剪 - 在这种情况下,高度将相应地调整为新的高度,并且将切断超出的宽度。
希望这就是你要找的东西!
修改强>
现在脚本如果平均切断边缘。如果您希望从顶部或左侧完全切割它们(取决于比率),那么:
完全删除那部分代码:
$int_width = ($width - $dest_width)/2;
$int_height = ($height - $dest_height)/2;
将之前提及的if
else
条件更改为:
if($width_ratio < $height_ratio) {
$dest_width=$width;
$dest_height=$image_height/$width_ratio;
$int_width = ($width - $dest_width)/2;
$int_height = 0;
} else {
$dest_width=$image_width/$height_ratio;
$dest_height=$height;
$int_width = 0;
$int_height = ($height - $dest_height)/2;
}
编辑2
水平始终相等,垂直始终从顶部开始 - 如您所愿:
if($width_ratio < $height_ratio) {
$dest_width=$width;
$dest_height=$image_height/$width_ratio;
} else {
$dest_width=$image_width/$height_ratio;
$dest_height=$height;
}
$int_width = ($width - $dest_width)/2;
$int_height = 0;