我正在尝试使用此功能在上传时自动调整图像大小:
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
相同,这也不会返回正方形大小的图像。如何让它返回方形图像?
答案 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之一,以便您轻松实现这一目标。
看一下如何更容易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();
});