質問: JPEGとPNGの画像を圧縮しようとしているのですがJPEGはうまく圧縮されるのに PNGは全く圧縮されません。 試している画像がいけないのか!? 実装方法がいけないのか!? そもそもPNG画像って圧縮できないものなのか!? (可逆圧縮だと圧縮できない!?そのような記述も見た気もしますがいまいち理解できてません。) 開発環境 ---- php:5.5.24 phalcon:1.3.4 JPEG ---- imagerotateなどの処理もあり、imagejpegの第3引数にて圧縮値を設定しています。 PNG --- JPEG同様にimagepngを用いて圧縮をしてみたのですが思うように圧縮されませんでした。 `imagepng($image, $fileName,1);` 第3引数の値をNULL〜最大値(9)まで試してた結果がいかになります。 | 圧縮値 | 圧縮前(byte) | 圧縮後(byte) | 圧縮率 | | --- | --- | --- | --- | | NULL | 336,996 | 342,403 | 1.01604 | | 0 | 336,996 | 1,689,345 | 5.01295 | | 1 | 336,996 | 424,910 | 1.26088 | | 2 | 336,996 | 412,548 | 1.22419 | | 3 | 336,996 | 393,663 | 1.16815 | | 4 | 336,996 | 361,057 | 1.0714 | | 5 | 336,996 | 352,635 | 1.04641 | | 6 | 336,996 | 342,403 | 1.01604 | | 7 | 336,996 | 337,311 | 1.00093 | | 8 | 336,996 | 327,844 | 0.97284 | | 9 | 336,996 | 323,692 | 0.96052 | ### 疑問点 ・今回のケースではなぜ全く圧縮されないのでしょうか? ・pngの圧縮はどのように実装すればいいでしょうか?
回答: 的はずれな点もあるかもしれませんので、ご参考程度に眺めてください... * まず、`imagejpeg` と `imagepng` の圧縮結果を単純比較することは出来ないようです。 imagepng()のqualityのデフォルト値 以下、要点を抜粋 > > imagepng()の第3引数のqualityとimagejpeg()の第3引数のqualityは全然違う > > 第3引数に指定する値の単位が違う。 > > そしてそれより問題なのは値の大小が逆ということ。 > > imagejpeg()は0が最大の圧縮率なのに対してimagepng()は0は無圧縮となっている。 > > > * PNG と JPEG は、そもそも画像の形式が全く異なります。 ミケネコ研究所 > わかりやすい PNG の話 for Web > 第 3 章 PNG のスペック一覧 > 3.3 圧縮 > > PNG 画像は、可逆圧縮です。JPEG のような非可逆圧縮はあり得ません。 > > > * PNGの圧縮テストに使用した画像はどのように作成されたものでしょうか? 既に、ある程度圧縮済みということはありませんか?? たとえば、まだ圧縮の余地があるかどうかを確認するには、オンラインサービスを利用してみるのも一案です。 PNG画像を圧縮するならオンラインWebツールのOptimizillaがおすすめ * PHPで実装する際に参考になりそうな情報について どんな実装方法が最適なのか分かりませんが、以下のようなページを参考にしてみてはいかがでしょうか。 MAMPでzopfliを使ってpng画像を圧縮してみた。 画像ファイルを指定容量ぎりぎりに圧縮する ImageMagickとPHPで、画像サイズを変更する