调整图像大小并裁剪为新的宽高比

时间:2015-07-26 16:51:32

标签: php crop image-resizing aspect-ratio

使用此代码,上传的图像正在缩小尺寸以适应设定的最大尺寸,同时保留初始宽高比。这很好。

现在我的目标是也裁剪图像,因此它将宽高比改为4:3(水平/垂直)。最大尺寸也是800px。

我已经尝试过我可以在网上找到的各种代码/想法,但它们看起来像是图像,只是裁剪或根本不工作。如何将方面裁剪包含在我已有的代码中?

$max_width = 800;
$max_height = 800;

$image_size_info = getimagesize($image_temp);
$image_width = $image_size_info[0];
$image_height = $image_size_info[1];

$image_res = imagecreatefromjpeg($image_temp);

$image_scale = min($max_width/$image_width, $max_height/$image_height);
$new_width = ceil($image_scale * $image_width);
$new_height = ceil($image_scale * $image_height);

$canvas = imagecreatetruecolor($new_width, $new_height);

imagecopyresampled($canvas, $image_res, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height);

imagejpeg($canvas, 'images/image.jpg', 85);

imagedestroy($image_res);

PS:请问,问题是这个代码

2 个答案:

答案 0 :(得分:0)

经过大量的摆弄,这很有效。

它调整大小并裁剪,因此图像变为4:3或3:4,具体取决于主要的初始宽度/高度。

当使用非常小的图像时,还应该进行一些检查和/或绕过,因此它们不会升级等。

$max_width = 800;
$max_height = 800;

$image_size_info = getimagesize($image_temp);
$image_width = $image_size_info[0];
$image_height = $image_size_info[1];

$image_res = imagecreatefromjpeg($image_temp);

if ($image_height < $image_width) {

    $cropfactor = $image_height / $image_width;
    $cropfactor = ($cropfactor > 0.75) ? $cropfactor : 0.75;
    $max_height = ceil($max_height * $cropfactor);

} elseif ($image_width < $image_height) {

    $cropfactor = $image_width / $image_height;
    $cropfactor = ($cropfactor > 0.75) ? $cropfactor : 0.75;
    $max_width = ceil($max_width * $cropfactor);

}

$new_width = $image_height * $max_width / $max_height;
$new_height = $image_width * $max_height / $max_width;

$canvas = imagecreatetruecolor($max_width, $max_height);

if ($new_width > $image_width) {

   $cut_x = 0;
   $cut_y = (($image_height - $new_height) / 2);
   $new_width_canvas = $image_width;
   $new_height_canvas = $new_height;

} else {

   $cut_x = (($image_width - $new_width) / 2);
   $cut_y = 0;
   $new_width_canvas = $new_width;
   $new_height_canvas = $image_height;

}

imagecopyresampled($canvas, $image_res, 0, 0, $cut_x, $cut_y, $max_width, $max_height, $new_width_canvas, $new_height_canvas);

imagejpeg($canvas, 'images/image.jpg', 85);

imagedestroy($image_res);

答案 1 :(得分:-1)

不确定,您是在共享服务器或某些托管服务器还是专用服务器上运行它,但imagemagick对于所有这些任务来说都是非常简洁的工具。