Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 调整图像大小并裁剪到新纵横比_Php_Crop_Image Resizing_Aspect Ratio - Fatal编程技术网

Php 调整图像大小并裁剪到新纵横比

Php 调整图像大小并裁剪到新纵横比,php,crop,image-resizing,aspect-ratio,Php,Crop,Image Resizing,Aspect Ratio,使用这段代码,上传的图像将被缩小到设置的最大大小,并保留初始纵横比。那很好 现在我的目标是它也裁剪图像,因此它将纵横比更改为4:3(水平/垂直)。也在800px的最大尺寸范围内 我尝试过在网上找到的各种代码/想法,但它们似乎改变了图像,只是裁剪或根本不起作用。如何在我已有的代码中包含方面裁剪 $max_width = 800; $max_height = 800; $image_size_info = getimagesize($image_temp); $image_width = $ima

使用这段代码,上传的图像将被缩小到设置的最大大小,并保留初始纵横比。那很好

现在我的目标是它也裁剪图像,因此它将纵横比更改为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:拜托,问题是关于这段代码的。

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

经过大量的修改,这是有效的

它会调整大小并进行裁剪,因此图像会变为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);
$max_width=800;
$max_height=800;
$image\u size\u info=getimagesize($image\u temp);
$image\u width=$image\u size\u info[0];
$image\u height=$image\u size\u info[1];
$image\u res=imagecreatefromjpeg($image\u temp);
如果($image\u height<$image\u width){
$cropfactor=$image\u height/$image\u width;
$cropfactor=($cropfactor>0.75)?$cropfactor:0.75;
$max\u height=ceil($max\u height*$cropfactor);
}elseif($image\u width<$image\u height){
$cropfactor=$image\u width/$image\u height;
$cropfactor=($cropfactor>0.75)?$cropfactor:0.75;
$max\u width=ceil($max\u width*$cropfactor);
}
$new_width=$image_height*$max_width/$max_height;
$new_height=$image_width*$max_height/$max_width;
$canvas=imagecreatetruecolor($max\u width,$max\u height);
如果($new\u width>$image\u width){
$cut_x=0;
$cut_y=($image_height-$new_height)/2);
$new\u width\u canvas=$image\u width;
$new\u height\u canvas=$new\u height;
}否则{
$cut_x=($image_width-$new_width)/2);
$cut_y=0;
$new\u width\u canvas=$new\u width;
$new\u height\u canvas=$image\u height;
}
imagecopyresampled($canvas,$image\u res,0,0,$cut\u x,$cut\u y,$max\u width,$max\u height,$new\u width\u canvas,$new\u height\u canvas);
imagejpeg($canvas,'images/image.jpg',85);
图像销毁($image\u res);

是的,我听说了。但我已经非常接近我的目标了,所以坚持下去似乎更好。这就是我的问题,你试过PHP的(>5.5)imagecrop函数了吗?不,但这似乎只是裁剪,而不是调整大小。我确信我可以通过正确的计算,对ImageCopy进行重新采样,使其性能良好。我已经剪得太细了。因此,我只需要正确的算法/计算的方面裁剪。哦,服务器运行的是PHP5.4。你可以试试cloudinary api,你可以发布照片,它们有很好的缩放效果和许多其他好的工具,但是不用了,谢谢。我将坚持这一非常简单和本地的方式。我现在离目标越来越近了是的,我明白,当我遇到同样的问题@mowgli时,我太懒了