我一直在尝试从HTML表单获取文件,然后创建一个新文件,并使用“imagecopyresampled”从中获取中央方形,拟合X或Y,取决于哪个更小。PHP GD上传前调整大小/裁剪图像
不幸的是,我对处理这么多的图像和临时名称感到有点困惑,我一直有麻烦将文件复制到系统上的用户文件。 的代码如下:
所有的if($_FILES){
$valid = validate_image("avatar");
if ($valid){
list($width, $height, $type) = getimagesize($_FILES['avatar']['tmp_name']);
$scale = $width/$height;
$pixels = 150;
$tmp_name = $_FILES['avatar']['tmp_name'];
switch ($type) {
case IMAGETYPE_GIF:
$source = imagecreatefromgif($tmp_name);
break;
case IMAGETYPE_JPEG:
case IMAGETYPE_JPG:
$source = imagecreatefromjpeg($tmp_name);
break;
case IMAGETYPE_PNG:
$source = imagecreatefrompng($tmp_name);
break;
}
$upload = imagecreatetruecolor($pixels, $pixels);
//sketchy image math: Get whichever coordinate is smaller and that will be 150 on the thumbnail from top to bottom (or left to right).
//Then for the other one you know the size will be 150, but only for the part starting at (Coordinate/2)-SMALLERCOORD/2 to (coord/2)+SMALLERCOORD/2
if ($width>$height){
imagecopyresampled ($upload, $source, 0, 0, 0, ($width-$height/2), 150, 150, $height, $height);
} else if ($width<=$height){
imagecopyresampled ($upload, $source, 0, 0, 0, ($height-$width/2), 150, 150, $width, $width);
}
$name = "./users/$id/avatar.png";
imagepng($upload, $tmp_name);
if (!(move_uploaded_file($tmp_name, $name))) $fail .= "<h3>ERROR UPLOADING AVATAR. TRY AGAIN LATER OR CONTACT US.</h3><br>";
}
}
首先让我看看,如果我理解这些代码是如何工作的正确: 我得到的文件,检查它是否与我的功能有效。然后我得到它的大小和类型。我检查类型并在服务器内存上创建一个映像,并在另一个空间上创建一个我想要的映像。然后,我实际上复制了我创建的上传图像上调整大小和裁剪后的图像。 如果我想要,我可以用imagedestroy删除临时的“源”图像,对吧? 接下来,我尝试从服务器内存的“上传”图像中创建一个png文件。 这里是我认为我错了,我不能覆盖临时文件,我可以吗? 然后我尝试将图像临时图像放在应该上传但不起作用的地方。
我是否正确?我怎样才能解决这个问题? 感谢您的关注。
我的错误。它不是“/users/$id/avatar.png”。编辑代码时,我删除得太多了,它应该是相对于PHP文件的路径。 “./users/$id/avatar.png”。因此,PHP代码所在的同一目录中的用户文件夹。 –