こんにちは。この頃のエントリーは、アップデート情報ばかりなので、たまには別の話題でも。コメントで画質のことに触れられていたので。
ppBlogでは、ひとつの記事にいくらでも画像を貼り付けることが出来ます。その際に、サイズの大きな画像(デジカメで撮った写真など)は、アップロード時のオプション指定にもよりますが、そのままの大きさでアップロードして保存された後(これはPIXディレクトリへ)、この大きさでは表示するのに大きすぎる場合には、予め指定された大きさ(初期値は350ピクセル)に縮小され、これはPIX/s2ディレクトリへ保存されます。
記事中に表示されるデジカメの写真などは、最初はこのPIX/s2ディレクトリにある縮小された写真が表示されている場合が多いかと思います。そして、それをクリックすると、PIXディレクトリにある元の大きさの画像を表示するという流れになっています。
一昔前は、(コンパクト)デジカメの写真一枚のファイルサイズは、せいぜい1MB(メガバイト)程度だったんですが、この頃は、画素数の増大に伴い、3-4MBを超えることも珍しくありません。ppBlogでは、3-4MB程度のファイルサイズでもアップロード可能な処置を入れていますが、これを頻発させるとサーバーに負担をかけうるので、予めお使いのパソコンで写真のファイルサイズを小さくしてアップロードすべきでしょう。個人的には、フリーのソフトである「縮小専用。 」を使っています。一括処理も出来て重宝しています。Vistaであれば、標準でついているWindowsフォトギャラリーにある「修正」で、適当に修正を施した後、それを閉じれば自動的に修正されたもので上書き保存されますが、これでもそれなりにファイルサイズが小さくなります(縦横サイズはそのままで、例えば3.49MBが1.2MBになったりとか。まぁ、これでもまだアップロードするには大きいんですが)。
さて、ここからが本題ですが、もともとファイルサイズが大きい写真をリサイズなどをしてファイルサイズを落とすと、当然ながら写真のクオリティーは低下します。更に、それをppBlogを介してサーバーにアップロードすると、そこで更にリサイズされて、画質が低下することになります。気になる方には気になる部分でしょう。
ppBlogでは、画像のリサイズは、utils_admin.phpにあるcreate_thumbnail()関数(462行目あたり)が担っています。その中に、
case 2 : ImageJPEG($img_out, $output); break;という行(500行目あたり)がありますが、これはJPEG画像を出力する関数です。実は、この関数の第三引数(ひきすう)に、出力する画像の品質を指定できます。
quality はオプションであり、0(品質は最低 ですが、ファイルはより小さい)から100(品質は最高ですが、ファイルは 最大)の範囲で指定します。デフォルトは IJG 品質値(75)です。
- 引用元: PHP: imagejpeg - Manual
現状、ppBlogでは、この部分の指定はしていないので、初期値である75というクオリティーで保存されていることになります。じゃ、他の値ではどうなるのかな?という疑問が出てきます。なので、簡単に調べてみました。Vistaに初めから付いているサンプルピクチャー(「フランジパニのクローズアップ。」by Kevin Forest氏)を元画像として、Qualityオプションを小さい方から順に10, 30, 75, 80, 85, 90, 100と指定していって、それぞれの画像を保存、そのままのファイルサイズでアップロードしたのが以下です。
まずは元の画像です。350ピクセルにリサイズされていて(品質75)、クリックするとオリジナルのサイズで表示されます。
以下、色んな品質でリサイズしていった画像を載せます。低い品質から。
これから言えることは、JPEGの性質上、元の写真による部分もあると思うけれど、デフォルト値の75では、ノイズが少し目立ち、品質85だと明らかな改善が見られる。ファイルサイズは、15.6KBが20.4KBと約1.3倍。品質90-100は、見た目のクオリティーはほぼ変わらないにも拘わらず、品質100でのファイルサイズ増大が顕著(90で25.2KBなのが100だと70.9KB。ちなみにオリジナルは105KB)。
なので、結論としては、初期値の75での品質が気になる方は、85-90あたりの値を指定すると、リサイズしても満足した画質が得られるんじゃないでしょうか。たった一枚のサンプル画像からの帰結ではあるけれど、まぁ妥当なところであると思います。
というわけで縮小された写真の画質が気になる方は、utils_admin.phpの500行目あたりを、
case 2 : ImageJPEG($img_out, $output, 85); break; // あるいは90
としてみては如何でしょうか。
将来的には、画像アップロード時に、指定できるようにしても良いですね。
Comments