[PHP]imagepng()のqualityのデフォルト値

Read More

PHP関数のimagepng()の第3引数のqualityのデフォルト値が公式マニュアルに書いてなかったので調べてみた。


調べたところ 6 がデフォルト値のようだ。


ついでなのでimagepng()について色々と調べてみた。
検証結果でちょっと注意したいところもあったのでそこだけ気になる人はページの最後らへんを見て欲しい。


--
imagepng()を使う上でまず最初に注意しなくてはならないのが、
imagepng()の第3引数のqualityimagejpeg()の第3引数のquality全然違う
ということ。


以下はimagepng()のqualityについての説明文。
圧縮レベル。0 (圧縮しない) から 9 までの値です。 
公式マニュアルより原文ママ


以下はimagejpeg()のqualityについての説明文。
quality はオプションであり、0(品質は最低 ですが、ファイルはより小さい)から100(品質は最高ですが、ファイルは 最大)の範囲で指定します。
デフォルトは IJG 品質値(75)です。
原文ママ


それぞれを見てもらえばわかるように、第3引数に指定する値の単位が違う
そしてそれより問題なのは値の大小が逆ということ。

imagejpeg()は0が最大の圧縮率なのに対してimagepng()は0は無圧縮となっている。


というかimagejpeg()は引数の名前がquality、説明文は「品質」となっているのに対し、imagepng()の方は引数の名前がqualityで説明文は「圧縮レベル」となっている。

圧縮レベルなんだったら引数の名前はqualityじゃなくてcompressionとかcompactionにしろと言いたい。
これ見たら皆迷うだろうが。



--
さて冒頭でimagepng()のqualityのデフォルト値が6というのは書いたが、圧縮レベルの0~9の値でどのくらい圧縮率が違うのか調べてみた。

■imagepng()による圧縮率の違い
500046バイトのpng画像に対してそれぞれ圧縮。
0: 952621Byte: x1.905 ←!
1: 411468Byte: x0.823
2: 404549Byte: x0.809
3: 393794Byte: x0.788
4: 374211Byte: x0.748
5: 367057Byte: x0.734
6: 360435Byte: x0.721 
7: 357549Byte: x0.715
8: 353925Byte: x0.708
9: 352461Byte: x0.705

無指定:360435Byte: x0.721
null:952621Byte: x1.905 ←!! 
左が圧縮レベルで真ん中がバイト数、右が圧縮率。


先述したようにimagepng()の第3引数無指定の時と圧縮レベル6とが同じバイト数となった。
デフォルト値が6であるのは間違いないようだ。

驚いたのは圧縮レベル0のときのバイト数。
他のレベルの時の容量は全て元ファイルより小さくなっているのに対し圧縮レベルが0の時だけ元ファイルの2倍近くになっている。
途中で行う処理にもよるだろうが圧縮レベルに0は使わない方が良いと思われる。

また圧縮レベルにnull値を使った時のバイト数にも注目したい。
圧縮レベル0の時と同じ値となっている。
このことから圧縮レベルのnull指定はvoid(無指定)扱いとはならず、0を指定したのと同じ結果を返すことがわかった。


プログラムを書く上で気をつけたい。






Comments(2)

1    2013/03/21 (木) 19:36 ID:aA2nbzO15
PNGは圧縮レベル0~9
Jpegは品質0~100が仕様で、
画像形式に従った仕様なんで画像関係をそこそこ弄ってる人なら間違わないでしょうね。

とはいえ、PNGの第三引数「quality」が非常に気持ち悪い…
PNGは可逆圧縮なんでクオリティも糞もないだろうと

>500046バイトのpng画像に対してそれぞれ圧縮。
少なく見積もっても400kByte後半になると思うのですが、
圧縮1でも400kByteですか…
要らないデータがどのくらいあったかにもよりますが、結構削れてますね

2  シラサヤ  2013/03/21 (木) 21:18 ID:YqhslY615
>PNGは可逆圧縮なんでクオリティも糞もないだろうと
その通りだね。
そう考えると余計qualityって単語はおかしいね。

>少なく見積もっても400kByte後半になると思うのですが
それは元画像が無圧縮で作ってあったか圧縮レベル9で作ってあったかとかによるんじゃないの?