命题调整图像大小,直到符合所需的文件大小
目前有一个简单的功能,但它允许用户添加大图像。我希望让所有的图片上传,但应该有,直到某些文件的大小满足(如在200KB例如))命题调整图像大小,直到符合所需的文件大小
if($_FILES['file']['size'] != 0){
$uploadOk = 0;
//image object
$image = $_FILES['file'];
//create unique name for file
$imageRandomName = substr(md5(time()), 0, 5) . "-" . $image['name'];
//upload dir
$target_dir = "rest/user" . $_SESSION["username"] . "/events/" . $_SESSION["event_id"] . "/people/";
//make folder for user if non exists
if(!file_exists($target_dir)){
mkdir($target_dir, 0777, true);
}
//file to be upload
$target_file = $target_dir . base($imageRandomName);
//get file type
$imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
$check = getimagesize($image["tmp_name"]);
if($check !== false){
$uploadOk = 1;
} else {
$uploadOk = 0;
}
if($uploadOk == 0){
echo "noupload";
} else {
if (move_uploaded_file($image["tmp_name"], $target_file)) {
//get file size on server
$filesizeonserver = filesize($target_file);
echo "file: ".$target_file." size: ".$filesizeonserver;
$times = 0;
if($filesizeonserver > 100000){
do{
$resized = resizeImage($target_file, "0.1");
$filesizeonserver = filesize($target_file);
$times++;
} while ($filesizeonserver > 100000);
echo "resized ".$times." times";
} else {
}
//mysql query
} else {
echo "Sorry, there was an error uploading your file.";
}
}
} else {
//do mysql query
}
resizeImage(
function resizeImage($file, $percent){
list($width, $height) = getimagesize($file);
$newwidth = $width-($width*$percent);
$newheight = $height-($height*$percent);
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($file);
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
$newImage = imagejpeg($thumb, $file, 100);
return $newImage;
}
现在调整图像大小的功能我我想我真的很接近实现它,但由于一些奇怪的原因,我得到的图像尺寸为1px宽,4px高,尺寸为4kb。完全黑色的图像。
如果你在想什么图像时增加了这个功能: 1232055字节,1220×1829,为72dpi,JPEG
编辑:好的,现在我觉得有什么不妥的resizeImage功能。因为它只在第一次运作。出于某种原因,它无法获得图像,并呈现出黑色和微小。
编辑2:现在我正在获取图像大小调整功能,它没有任何问题。我注意到该函数不断调整图像的大小直到其结束。我可以看到它如何缩小。
编辑3:我找到了问题。现在看来,$ filesizeonserver始终是第一个值,并在做...而它不更新,即使你是我设置它改变。
$allowedFileTypes = ['image/png', 'image/gif', 'image/jpeg', 'image/jpg'];
if (in_array($_FILES['image']['type'], $allowedFileTypes)) {
$imageType = $_FILES['image']['type'];
//allow file size under 10mb
if($_FILES['file']['size'] < 10000000){
//image object
$image = $_FILES['file'];
//so there is no same name files
$imageRandomName = substr(md5(time()), 0, 5) . "-" . $image['name'];
//place where image is uploaded
$target_dir = 'rest/user/' . $_SESSION['username'] . '/events/' . $_SESSION['event_id'] . '/people/';
//make folder for users
if (!file_exists($target_dir)) {
mkdir($target_dir, 0777, true);
}
//file to be uploded
$target_file = $target_dir . basename($imageRandomName);
//get file type
//$imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
$check = getimagesize($image["tmp_name"]);
if ($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
//check if upload is ok
if ($uploadOk == 0) {
echo "Sorry cant upload";
} else {
if (move_uploaded_file($image["tmp_name"], $target_file)) {
//get file size on server
$filesizeonserver = filesize($target_file);
$times = 0;
if($filesizeonserver > 300000){
do{
clearstatcache();
$resized = resizeImage($target_file, 0.05, $imageType);
$filesizeonserver = filesize($target_file);
$times++;
} while ($filesizeonserver > 300000);
echo "resized ".$times." times";
} else {
}
//sql query
} else {
echo "Sorry, there was an error uploading your file.";
}
}
} else {
//sql query
}
} else {
echo "wrongimagetype";
}
resizeImage()
function resizeImage($file, $percent, $imageType){
list($width, $height) = getimagesize($file);
$newwidth = $width-($width*$percent);
$newheight = $height-($height*$percent);
$thumb = imagecreatetruecolor($newwidth, $newheight);
switch($imageType){
case 'image/png':
$background = imagecolorallocate($thumb, 0, 0, 0);
imagecolortransparent($thumb, $background);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
$source = imagecreatefrompng($file);
break;
case 'image/gif':
$background = imagecolorallocate($thumb, 0, 0, 0);
imagecolortransparent($thumb, $background);
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
$source = imagecreatefromgif($file);
break;
case 'image/jpeg':
case 'image/jpg':
$source = imagecreatefromjpeg($file);
break;
}
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
switch($imageType){
case 'image/png':
$image = imagepng($thumb, $file, 0);
break;
case 'image/gif':
$image = imagegif($file);
break;
case 'image/jpeg':
case 'image/jpg':
$image = imagejpeg($thumb, $file, 100);
break;
}
return $image;
}
OUTPUT:
File is an image - image/jpeg.resized 17 times
免责声明:所有的东西你作品的图像质量受些影响。需要努力。
对问题的最后评论是通过在调整大小之前追加clearstatcache()来解决的。 –
添加allowedFileTypes png,gif,jpg和jpeg。 –
现在它支持透明度,图像质量不匹配Photoshop:D –
要限制文件大小上传吗?你可以简单地检查 $ _FILES ['file'] ['size'] –
你已经显示的代码片段开始于_检查上传文件的大小是否不是0,并且你不能拿出任何东西? – CBroe
当你明白你不明白这一点时,立即对问题进行评级是非常不合理的。我需要的是调整图像大小的函数,我不知道如何继续。 –