裁剪上传的图像为1:1比例PHP

时间:2016-05-15 10:44:33

标签: php

我有自己的PHP功能,允许用户更新他们的个人资料图片。

一切正常,但是,我遇到一个问题,用户可以上传他们想要的任何尺寸的图像;即:564 x 346

我不希望这种情况发生。我希望他们选择上传的图片裁剪为1:1比例并居中;即:它从564 x 346变为346 x 346并居中于图像的中间。

我找到的所有脚本似乎都不适合我的网站(至少我希望他们这样做)。

这是我目前用于更新其头像的代码。它包括检查他们是否有正确的文件扩展名&如果图像大小小于256kb:

    $ext = array('jpg', 'jpeg', 'png');
    $file       = $_FILES['avatar']['name'];
    $fileext    = strtolower(end(explode('.', $file)));
    $filetmp    = $_FILES['avatar']['tmp_name'];

    if(!in_array($fileext, $ext)){
        $errors[] = 'Please select a valid file type. (JPG, JPEG or PNG)';  }
    if($_FILES['avatar']['size'] > 256000){
        $errors[] = 'Avatars cannot exceed a 256kb file size.';
    }

    if(empty($errors)){
        updateAvatar($conn, $username, $filetmp, $fileext);
    } else if(!empty($errors)){
        echo output_errors($errors);
    }
    if(isset($_SESSION['updateAvat'])){
        flash('You have successfully updated your avatar.');
        unset($_SESSION['updateAvat']);
    }

这是我制作的updateAvatar()函数,在第13行调用:

function updateAvatar($conn, $username, $filetmp, $fileext){
    $file = md5(microtime() . $filetmp) . '.' . $fileext;
    $filepth = './data/user_data/img/udid/prof/' . $file;
    move_uploaded_file($filetmp, $filepth);
    if(mysqli_query($conn, "UPDATE users SET profile = '$file' WHERE username = '$username'")){
        $_SESSION['updateAvat'] = md5(microtime() . $filetmp);
    } else {
        $errors[] = 'There was a problem updating your avatar. Please try again.';
    }
}

然而,这还不够,并且不允许我的用户个人资料页面工作或看起来应该如此,我正在寻找谷歌或Twitter如何做他们的化身的事情。

感谢所有帮助。 欢呼声。

2 个答案:

答案 0 :(得分:2)

php中有imagecrop()函数:

$tmpfile = $_FILES['avatar']['tmp_name'];

switch ($fileext) {
 case 'jpg':
 case 'jpeg':
   $image = imagecreatefromjpeg($tmpfile);
   break;
 case 'png':
   $image = imagecreatefrompng($tmpfile);
   break;
 default:
   die("wtf is this extension??");
}

list($w, $h) = getimagesize($imgfile);
// get width $w and height $h for the image

if ($w < $h) // then keep the width and scale the height
 $image = imagecrop($image, array(
                              "x" => 0,
                              "y" => ($w - $h) / 2,
                              "width" => $w,
                              "height" => $w
                              ));
else if ($h < $w) // then keep the height and scale the width
 $image = imagecrop($image, array(
                              "x" => ($w - $h) / 2,
                              "y" => 0,
                              "width" => $h,
                              "height" => $h
                              ));

我还没有尝试过这段代码,但我确信它是对的。试一试,告诉我它是否有用。

<强>更新 然后,您可以使用$imageimagejpeg()保存资源imagepng()以保存具有相同扩展名的图片,这样您就不会遇到数据库问题:

imagejpeg($image, "/path/to/your/image.jpg");

答案 1 :(得分:0)

  

这是对过程如何工作的解释,这不是副本   并粘贴代码,但描述了您需要的逻辑过程   了解在PHP中调整图像大小

您希望使用PHP imagecopyresampled拍摄原始图像,然后以数学方式计算边距,使其成为正方形,然后调整该正方形的大小。

过程:

  • 检查上传的图像是真实的图像和真实的文件类型。

  • 使用imagecreatefromjpeg(或类似的PNG等),您可以导入上传的图像文件资源。

  • 使用getimagesize您可以找到尺寸,然后您可以找到the aspect ratio of the image

  • 如果纵横比> 1然后宽度大于高度,因此您需要假设一个与高度相同的正方形(因为它的值越小)。例如:

 Width: 450
 Height: 300
 Ratio = 450/300 = 3/2 = 1.5 = >1
  • 如果纵横比<1,则高度大于宽度。

  • 所以你想要一个300x300的正方形,所以你需要从宽度上切掉多余的150。这称为边距,为了使图像居中,您需要从每一边切掉一半边距,以便:

$fullMargin = (width- height) 
$margin = $fullMargin/2 
  • 在调整大小并保存新图像之前,应生成新的图像资源:

$max_width = $max_height = 256;
$smallestDimensionValue = $originalHeight //(in this example);
$newImage = imagecreatetruecolor($max_width,$max_height);
$sourceHeight = $originalHeight;
$sourceWidth = $originalWidth - $fullMargin;
  • 最后,图像复制和重新采样以及输出应符合预期:

 imagecopyresampled($nwImage, $sourceImage, 0,0,$margin,0,$max_width,$max_height,$sourceWidth,$sourceHeight); 
  • PHP会自动缩放imagecopyresampled中的图片,但要了解它,一旦您为全尺寸图像确定了边距大小,则必须将边距乘以与宽度相同的值以及将整个图像缩放到适当大小的高度。

比方说,您希望头像的最大尺寸为256px:

 maximum_allowed_width /  original_width = scale_factor. 

所以对于上面的例子,这是:

256 / 450 = 0.56888888

这是上面定义的边距值以及目标图像的高度和宽度乘以的值。