2017-10-16 47 views
2

我有這段代碼我寫遞歸壓縮圖像,直到它落在我想要的大小範圍內。由於某種原因,它不會工作。幫幫我!!!遞歸壓縮imagejpeg,來自gd庫的imagetruecolor

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; 
} 

所有我發現的是,進入一個無限循環,因爲我無法獲得第一次壓縮後的文件大小。下面是一個輸出的snapshop的鏈接。我不得不添加一個計數器來控制無限循環。

link to image showing output after executing code

+0

'filesize'的結果被緩存,所以你應該在每次迭代中調用['clearstatcache'](http://php.net/manual/en/function.clearstatcache.php)。 – CBroe

+0

謝謝。像魅力一樣工作。 – user3667989

回答

1

所有我發現的是,在進入一個無限循環,因爲我不能在第一次壓縮後得到的filesizes。

文件大小的結果被緩存。 (或者說,底層文件系統調用的結果可能會更準確;這不僅影響文件大小,而且影響文件/文件夾的其他幾個函數)。

所以你應該請在每次迭代中調用clearstatcache,以便在您以後檢查文件大小時獲取實際當前值。