

無限ループしてしまいます。  
ImageJpegで保存した際、キャッシュ関係か何かわかりませんが、反映されていないということでしょうか？

[code]

     $q = 75;
     do {
         ImageJpeg($out, $savefile, $q);
         $q = $q - 5;
     } while(filesize($savefile) > 9000);
    
[/code]


CC BY-SA 3.0
2016-01-22T12:00:01.553
21194
2016-01-23T08:38:09.943
7973
question
php
PHPで画像ファイルサイズ圧縮


原因は2つ考えられて、1つはあなたのおっしゃるように  
_キャッシュ関係か何かわかりませんが、反映されていない_  
と言うことです。  
<http://php.net/manual/ja/function.filesize.php>  
_注意: この関数の結果は キャッシュされます。詳細は、clearstatcache() を参照してください。_

もうひとつは、コメントにもありますが、こちらです。  
<http://php.net/manual/ja/function.imagejpeg.php>  
_quality はオプションであり、0(品質は最低 ですが、ファイルはより小さい)から100(品質は最高ですが、ファイルは
最大)の範囲で指定します。デフォルトは IJG 品質値(75)です。_  
ImageJpeg関数の3番目の引数qualityは0〜100と定義されており、負の数を指定した時の動作は未定義です。(失敗したり、値が0の時より大きなファイルができたりします。)

filesize()を呼ぶ前にclearstatcache()を呼ぶようにした上で、quality(あなたのコードでは$q)の値が0でも所望のサイズに収まらなかったらあきらめる、と言った形に修正する必要があるでしょう。


CC BY-SA 3.0
2016-01-22T12:48:45.797
21197
2016-01-22T12:48:45.797
13972
21194
answer


既に疑問は解決されてるようなので、  
どうロジックを変更するか意見してみます。

Jpeg画像の品質対ファイルサイズですが、  
0～85はファイルサイズが若干増えていく程度でほぼ横這い、  
そこから反比例するかのように一気に急上昇するという特性があります。  
<http://mizukama.sakura.ne.jp/ol/article_007.php>

今回のロジックを見ると初期の時点で75で、5ずつ減らすロジックですので、  
画像がガビガビになる割に効果が薄く、  
品質0～1だとしてもファイルサイズ9KBは相当厳しいハードルです。

* * *

スマホで撮った風景画等は解像度が極めて高い（旧型のスマホですら数百万画素）です。  
ブロックノイズの多さから察するに品質85程度でもファイルサイズは、ゆうに100～200KB以上だったりします。

目安としては  
品質85(1920*1080)：308KB  
品質1(1920*1080)：51KB  
品質85(910*540)：118KB  
品質85(455*270)：36KB  
品質85(240*135)：11KB

基本的には品質を1まで落としてしまうのであれば、  
キャンバスサイズを削って縦横1/4にし画面表示する時に引き伸ばした方が  
ファイルサイズ見た目共に満足する結果が得られやすいです。

* * *

上記の早見表を元に240*135（32,400画素）程度にさえすれば、  
質問者さんが作成したロジックが有効に働くかと思います。

ライブラリが必要PHPは画像の横幅や縦幅が簡単に見れます。  
<http://php.net/manual/ja/function.getimagesize.php>

画素数は画像の縦*横で計算出来るので  
閾値30,000画素に収まるようにしてしまえば良いかと思います。


CC BY-SA 3.0
2016-01-23T08:38:09.943
21226
2016-01-23T08:38:09.943
13999
21194
answer