调整图像大小并裁剪为新的纵横比

Posted

技术标签:

【中文标题】调整图像大小并裁剪为新的纵横比【英文标题】:Resize image and crop to new aspect ratio 【发布时间】:2015-07-26 16:51:32 【问题描述】:

使用此代码,上传的图片将缩小尺寸以适应设置的最大尺寸,同时保留初始宽高比。效果很好。

现在我的目标是让它同时裁剪图像,因此它将纵横比更改为 4:3(水平/垂直)。无论哪种方式,最大尺寸都在 800 像素以内。

我尝试了可以​​在网上找到的各种代码/想法,但它们似乎扭曲了图像,只是裁剪或根本不起作用。方面裁剪如何包含在我已有的代码中?

$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:拜托,问题是关于这个代码

【问题讨论】:

你可以试试cloudinary cloudinary.com api,你可以发照片,而且尺度非常好 | aspect 和许多其他好工具 谢谢,但不用了。我将坚持这种极其简单和本地化的方式。我现在离目标越来越近了 是的,我明白了,当我遇到同样的问题时我太懒了@mowgli 【参考方案1】:

经过大量的摆弄,这行得通。

它会调整大小和裁剪,因此图像变为 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);

【讨论】:

【参考方案2】:

不确定,您是在共享服务器上运行它还是在一些托管或专用服务器上运行它,但 imagemagick 是一个非常适合所有这些任务的工具。

【讨论】:

是的,我听说过。但我已经非常接近我所拥有的目标了,坚持下去似乎更好。这就是我的问题所在 你试过 php (>5.5) 的 imagecrop 功能了吗? php.net/manual/de/function.imagecrop.php 不,但这似乎只是裁剪,而不是调整大小。而且我确信我可以通过正确的计算得到 imagecopyresampled 以很好地执行它。我已经为缩略图裁剪得太好了。所以我只需要正确的算法/计算来进行切面裁剪。哦,服务器运行 php 5.4

以上是关于调整图像大小并裁剪为新的纵横比的主要内容,如果未能解决你的问题,请参考以下文章

使用 Imagemagick 将大图像裁剪为特定的纵横比,然后调整它们的大小

裁剪 UIImage 的部分以获得新的纵横比并缩小到大小

调整图像大小以使大小与指定的纵横比匹配[重复]

如何使用“包含”选项调整图像的大小,但保留原始尺寸的纵横比?

使用 ImageMagick 调整大小,然后从命令行裁剪图像

将裁剪添加到 PHP 图像调整大小脚本