ob_gzhandler が画像を無視する
gz が付いたphpから、content-type: image/jpeg
を設定すると transfer-encoding : chunked
になってしまい、GZipで転送されない・
<?php ob_start("ob_gzhandler"); header("content-type: image/jpeg");//この時点でgz_handler は無視される imagejpeg( $gd_image,); ob_end_flush();
テキストなら、圧縮されるが、画像は警告無しで無条件で無視された。なるほど。
gzipでコンテンツの圧縮をするとかなり削減できる
text 系は本当に小さくなる。画像にはあまり効果がない。画像はHTTP的にGzipを掛けるべきではない。
原則として画像を小さくするには、画質を落とす、幅を小さくするなどして圧縮すべきである。とのこと。
google 曰く
画像をgzip 圧縮するより、画質を落とすことを考えろ
とのことでした。わかるんだけど・・・・・・・・・・・・・・・・・・・・
違うんだ、私は 画像をgzip圧縮したいんだ!
オリジナル画像を少しでも圧縮して転送したい。
画質を劣化させることは本意ではない。gzip を最高圧縮9でやればJPEGでも10〜20%程度は容量を削減できるし。強引にヤってみた。
JPEGを強引に圧縮
<?php header("content-type: image/jpeg; "); ob_start(); imagejpeg($img); $data = ob_get_contents(); ob_end_clean(); $gz_data = gzencode( $data , 9); header('Content-Encoding: gzip'); header("content-type: image/jpeg; "); header("Content-Length: ". strlen($gz_data) ); ob_start(); echo ($gz_data); ob_end_flush(); imagedestroy($img); return ; ?>
これで、ほんの少しだけ節約できるはず。
適用前
Content-Encoding: gzip Content-Length: 855241 Content-Type: image/jpeg;
適用後
Content-Encoding: gzip Content-Length: 749838 Content-Type: image/jpeg;
多少は、小さくなりました。でもやっぱり、幅を50%とかにしたほうが節約量圧倒的なので、できれば幅を変えたほうが良いよね。