我一直在嘗試從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代碼所在的同一目錄中的用戶文件夾。 –