それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ob_gzhandler が 画像に効かないので強引にやる

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%とかにしたほうが節約量圧倒的なので、できれば幅を変えたほうが良いよね。

webP も考えたのだけれど、iOS Safari非対応だし、アプリ側でlibwebp 組み込めばできるけど・・・