php - 按建议调整图像大小,直到满足所需的文件大小

标签 php image image-processing

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

调整图片大小

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 总是获得第一个值并且在执行...而即使我将其设置为更改它也不会更新。

最佳答案

$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

免责声明:一切正常,但图像质量会受到一些影响。需要努力解决这个问题。

关于php - 按建议调整图像大小,直到满足所需的文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829838/

相关文章:

php - 将 Vue js 前端和 laravel 后端(api 路由)托管到共享服务器?

php - 为什么我使用 PHP 上传的图片没有正确存储在 longblob 中

php - Facebook 图形 API + PHP SDK : get the URL of the large user picture

python - 尝试规范化 Python 图像时出现错误 - RGB 值必须在 0..1 范围内

php - Magento:忘记密码返回空白浏览器页面

php - Mysql 帮助更新具有其他 ID 的价格的行

php - 如何在 Mac OS X 10.5 Leopard 上设置 PEAR

javascript - 如何抓取单个图像并将其放入 localStorage?

c - 使用 cvSmooth() 函数进行双边过滤

c# - 无论如何使用 asp.net mvc 从 3 个图像 URL 中制作一个图像?