2017-10-16 29 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; 
} 

私が発見したのは、最初の圧縮後にファイルサイズを取得できないため、不定期なループが発生することです。以下は出力のスナップショットへのリンクです。私は、不定ループを制御するためだけにカウンタを追加する必要がありました。

link to image showing output after executing code

+0

'filesize'の結果がキャッシュされるので、各繰り返しで[' clearstatcache'](http://php.net/manual/en/function.clearstatcache.php)を呼び出す必要があります。 – CBroe

+0

ありがとうございます。魅力のように働いた。 – user3667989

答えて

1

私が発見したすべては私が最初に圧縮した後filesizesを得る傾けるためには、無期限ループに入ったということです。

filesizeの結果はキャッシュに入れられます。 (つまり、基礎となるファイルシステムの呼び出しの結果はもっと正確でしょう;これはファイルサイズだけでなくファイル/フォルダに関する情報も取得するいくつかの関数にも影響します)

各反復でclearstatcacheを呼び出してください。そのあとでファイルサイズを確認すると、実際の現在の値が得られます。

関連する問題