php - 使用 gd 库中的 imagejpeg、imagetruecolor 进行递归压缩

标签 php recursion gdlib

我编写了这段代码,用于递归压缩图像,直到它落入我想要的大小范围内。由于某种原因它不起作用。救命!!!

public function compress4($src,$dest,$file_size, $count = 1){
    $info = getimagesize($src);
    if($info['mime'] == "image/jpeg"){
        $image = imagecreatefromjpeg($src);
    }
    else if($info['mime'] == "image/png"){
        $image = imagecreatefrompng($src);
    }
    else if($info['mime'] == "image/gif"){
        $image = imagecreatefromgif($src);
    }
    if($file_size > 1000){
        $quality = 50;
    }       
    else {
        echo "file size acceptable <br>";
        return $src;
    }
    echo "file has been compressed at $quality" . "%<br>";
    imagejpeg($image,$dest,$quality);
    imagedestroy($image);
    echo $dest . "<br>";
    $file_size = round(filesize($dest)/1024);
    echo "filesize: $file_size and count: $count<br>";
    if ($file_size > 1000 && $count <= 5){
        echo "file size too large<br>";
        echo "file too big for thumbnail: $file_size" . "kb<br>Starting compression number $count<br><br>";
        $this->compress4($src,$src,$file_size, ++$count);
    }
    return $dest;
}

我发现的是,它进入了无限循环,因为我无法在第一次压缩后获取文件大小。下面是输出快照商店的链接。我必须添加一个计数器来控制无限循环。

link to image showing output after executing code

最佳答案

all i have discovered is that in gets into an indefinite loop because i cant get the filesizes after the first compression.

文件大小的结果被缓存。 (或者说,底层文件系统调用的结果可能会更准确;这不仅影响文件大小,还影响获取有关文件/文件夹信息的其他几个函数。)

所以你应该打电话clearstatcache在每次迭代中,这样当您之后检查文件大小时,您就可以获得实际的当前值。

关于php - 使用 gd 库中的 imagejpeg、imagetruecolor 进行递归压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46768225/

相关文章:

PHP+GD : imagecopymerge not retaining PNG transparencies

php - javascript加密?

PHP 再次为 sql 查询设置变量值不起作用

java - 为什么我的备忘录数组被初始化为 0 java?

c++ - 可以过早地离开递归吗?

php - PHP 中的远程图像大小和尺寸出现 HTTP 错误

php - 按实体对许多关联进行排序的学说

php - 如何使用 mb_detect_encoding 正确检测编码?

javascript - 如何循环对象的javascript对象并查找属性

php - 使用 GD 调整图像大小并将图像裁剪为白色背景的正方形