【问题标题】:Resize the image propositionally until required file size is met建议调整图像大小,直到满足所需的文件大小
【发布时间】:2018-03-31 11:43:02
【问题描述】:

目前有一个简单的功能,但它允许用户添加大图像。我想允许所有图片上传,但是应该有一个功能可以调整图片的大小,直到满足特定的文件大小(例如小于 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 大小。全黑图像。

如果您正在考虑将什么图像添加到此功能: 1,232,055 字节,1220 × 1829,72dpi,JPEG

编辑:好的,现在我认为 resizeImage 函数有问题。因为它只在第一次时才起作用。由于某种原因,它无法获取图像并将其呈现为黑色和微小的。

EDIT2:现在我正在获得图像大小调整功能,它没有任何问题。我注意到该功能会不断调整图像的大小,直到苦尽甘来。我可以在查找它的收缩方式中看到它。

EDIT3:我找到了问题所在。现在看来 $filesizeonserver 总是得到第一个值并且在做......虽然它没有更新,即使你将它设置为更改。

【问题讨论】:

  • 您想限制上传的文件大小吗?您可以简单地检查 $_FILES['file']['size']
  • 您显示的代码 sn-p 字面意思以开头,检查上传文件的大小是否不为 0 ...您想不出那里有什么?
  • 当您显然不明白这一点时,立即对问题进行评分是非常不合理的。我需要的是可以调整图像大小的功能,但我不知道如何继续。
  • 我有一个sn-p可以帮助你:github.com/kaduev13/image-tools
  • 所以你需要调整图片大小。你试过什么?你是 GD 还是 ImageMagick?您的代码和问题描述中的文件大小和图像大小(即宽度 x 高度)之间存在混淆。你想做什么?限制文件大小或图像大小?你为什么告诉我们你需要调整宽度 x 高度,然后同时讨论文件大小?请澄清问题。您在 cmets 中所说的内容!== 您在问题本身中解释的内容。

标签: php image image-processing


【解决方案1】:
$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;
}

输出:

File is an image - image/jpeg.resized 17 times

免责声明:一切正常,您的图像质量会受到影响。需要努力。

【讨论】:

  • 对问题的最后评论已通过在调整大小之前附加 clearstatcache() 得到修复。
  • 添加了允许的文件类型 png、gif、jpg 和 jpeg。
  • 现在支持透明,画质不匹配photoshop :D
猜你喜欢
  • 2013-06-14
  • 2020-01-27
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多