質問: PHPでアップロードしたJPEG画像をimagerotateした後にimagejpegしているのですが imagejpegの第3引数の値を決めれないでいます.... できる限りアップロードした画像のサイズ(容量)と同等な状態で出力したいのですが そのような指定はできないのでしょうか? または、ベストなqualityはどのように算出すればいいでしょうか? ご教授お願いいたします。 テキトーな画像でサイズが変わらないqualityを調べてみたのですが以下の結果となりました。 qualityが90以降では見た目に影響はでないとどこかのサイトで書かれておりましたが..... 106,314byteの画像 -------------- | quality | 圧縮後 | | --- | --- | | 97 | 114,809 | | 96 | 101,654 | | 95 | 91,938 | 64,712byteの画像 ------------- | quality | 圧縮後 | | --- | --- | | 95 | 127,548 | | 90 | 84,951 | | 85 | 66,812 | | 84 | 64,896 | | 83 | 63,028 | 235,734byteの画像 -------------- | quality | 圧縮後 | | --- | --- | | 95 | 445,991 | | 90 | 320,735 | | 85 | 259,654 | | 83 | 245,223 | | 82 | 236,743 | | 81 | 230,756 | 228,421byteの画像 -------------- | quality | 圧縮後 | | --- | --- | | 95 | 316,441 | | 92 | 235,979 | | 91 | 224,856 | | 90 | 212,414 | | 85 | 164,018 |
回答: 不可逆圧縮の JPEG だと、今使われている正確な圧縮時のパラメータを知る方法は無かったように思います。また、EXIF など外部のメモ情報として品質パラメータが付与されていたとしても、その内容が必ずしも正しい保証もありませんし、正しかったとして、圧縮に使用した画像ライブラリに特化した圧縮パラメータであるために、自分達の処理系において意図した値ではないことも十分考えられます。 そのため、元の画像を何度か保存し直して近いサイズになったものから保存時の品質パラメータを推測する。というのが実現可能な方法だと思われます。無駄に負荷がかかるのは間違いないので、規模によっては躊躇してしまう方法ですが、システムに対して初回の画像登録時に品質パラメータを推測して、画像と紐付ける処理にしておけば、毎回計算する必要も無くなりますので、その流れにしてしまえば、なんとかなりそうにも思います。 しかし、登録時点でシステム固有の品質変換と縦横のサイズが大きすぎる場合のリサイズを行い、以後全てその設定で扱う。というような仕様にしておく方が無駄に巨大なファイルを投げられた時に、トラブルを避けられるため、その方が一般的な仕様だと思いますが『元の品質を維持した上での加工』が重要な要件であれば、上記に挙げた方法も適用できるかもしれません。 以上、ご参考になれば幸いです。