在php上传时,将图像大小调整为相等的宽度和高度

时间:2016-08-27 06:33:15

标签: php

我正在尝试使用此功能在上传时自动调整图像大小:

function ak_img_resize($target, $newcopy, $w, $h, $ext) {
    list($w_orig, $h_orig) = getimagesize($target);
    $scale_ratio = $w_orig / $h_orig;
    if (($w / $h) > $scale_ratio) {
           $w = $h * $scale_ratio;
    } else {
           $h = $w / $scale_ratio;
    }
    $img = "";
    $ext = strtolower($ext);
    if ($ext == "gif"){ 
      $img = imagecreatefromgif($target);
    } else if($ext =="png"){ 
      $img = imagecreatefrompng($target);
    } else { 
      $img = imagecreatefromjpeg($target);
    }
    $tci = imagecreatetruecolor($w, $h);
    // imagecopyresampled(dst_img, src_img, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h)
    imagecopyresampled($tci, $img, 0, 0, 0, 0, $w, $h, $w_orig, $h_orig);
    imagejpeg($tci, $newcopy, 80);
}

然后:

$target_file = "img/".$admit_roll.".".$ext;
$resized_file = "img/".$admit_roll.".".$ext;
$wmax = 200;
$hmax = 200;
ak_img_resize($target_file, $resized_file, $wmax, $hmax, $ext);

但即使$wmax abd $hmax相同,这也不会返回正方形大小的图像。如何让它返回方形图像?

2 个答案:

答案 0 :(得分:2)

您可以使用函数imagecopyresized()来调整大小:

  function img_resize($target, $newcopy, $w, $h, $ext){
    list($w_orig, $h_orig) = getimagesize($target);

    $img = "";
    $ext = strtolower($ext);
    if ($ext == "gif"){
      $img = imagecreatefromgif($target);
    } else if($ext =="png"){
      $img = imagecreatefrompng($target);
    } else {
      $img = imagecreatefromjpeg($target);
    }
    $tci = imagecreatetruecolor($w, $h);
    imagecopyresized($tci, $img, 0, 0, 0, 0, $w, $h, $w_orig, $h_orig);
    imagejpeg($tci, $newcopy);
  }

使用此功能,您无需关心宽高比,function适合您。

编辑:您可以将imagecopyresized()替换为imagecopyresampled(),它会做同样的事情,虽然质量更高,但使用更多的CPU时间

答案 1 :(得分:1)

图像处理很复杂。你可以学习自己做,有趣,有时有用。但是,当你需要了解其他人已经解决的所有问题时,这也很乏味。

另一种选择是使用libraries之一,以便您轻松实现这一目标。

例如:Intervention Image

看一下如何更容易fit image into a frame

// open file a image resource
$img = Image::make('public/foo.jpg');

// crop the best fitting 5:3 (600x360) ratio and resize to 600x360 pixel
$img->fit(600, 360);

// crop the best fitting 1:1 ratio (200x200) and resize to 200x200 pixel
$img->fit(200);

// add callback functionality to retain maximal original image size
$img->fit(800, 600, function ($constraint) {
    $constraint->upsize();
});