调整图像大小并裁剪为新的纵横比
Resize image and crop to new aspect ratio
使用此代码,上传的图像正在缩小以适应设置的最大尺寸,同时保持初始纵横比。效果不错。
现在我的目标是它也可以裁剪图像,因此它将宽高比更改为 4:3 (horizontal/vertical)。两种方式的最大尺寸也不超过 800 像素。
我已经尝试了各种 code/ideas 我可以在网上找到的,但它们似乎破坏了图像,只能裁剪或根本不起作用。我已有的代码中如何包含方面裁剪?
$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:拜托,问题是关于这段代码的
不确定,无论您是 运行 它是在共享服务器上还是在某些托管或专用服务器上,但 imagemagick 是完成所有这些任务的非常好的工具。
经过大量摆弄后,这有效。
它会调整大小和裁剪,因此图像会变成 4:3 或 3:4,具体取决于显性首字母 width/height。
当使用非常小的图像时,还应该进行一些检查 and/or 绕过,这样它们就不会被放大等。
$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);
使用此代码,上传的图像正在缩小以适应设置的最大尺寸,同时保持初始纵横比。效果不错。
现在我的目标是它也可以裁剪图像,因此它将宽高比更改为 4:3 (horizontal/vertical)。两种方式的最大尺寸也不超过 800 像素。
我已经尝试了各种 code/ideas 我可以在网上找到的,但它们似乎破坏了图像,只能裁剪或根本不起作用。我已有的代码中如何包含方面裁剪?
$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:拜托,问题是关于这段代码的
不确定,无论您是 运行 它是在共享服务器上还是在某些托管或专用服务器上,但 imagemagick 是完成所有这些任务的非常好的工具。
经过大量摆弄后,这有效。
它会调整大小和裁剪,因此图像会变成 4:3 或 3:4,具体取决于显性首字母 width/height。
当使用非常小的图像时,还应该进行一些检查 and/or 绕过,这样它们就不会被放大等。
$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);