PHP调整大小并裁剪居中的顶部图像

时间:2013-08-26 12:54:55

标签: php image-processing gd

我正在尝试调整大小(保持纵横比)并裁剪图像的多余部分(缩略图限制之外),但在裁剪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);  

谢谢!

1 个答案:

答案 0 :(得分:1)

您的$image_width$image_height$width$height是静态的,这意味着$width_ratio$height_ratio始终相同(分别为:5.17857142857142.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;