WordPressのサムネイルサイズがオリジナルより増える問題の改善パッチ

WordPressでは、画像をアップロードするとサムネイルが自動的に作成されます。このとき、256色以下のPNG(インデックスカラーPNG)をアップすると、サムネイルのファイルサイズがオリジナルよりも増えてしまうのです。これは、画像を綺麗に縮小してサムネイルを作成するために、一旦、内部でフルカラーに変換してしまうのが原因です。問題なのは、この変換したフルカラー画像を、そのままサムネイルとして保存してしまうことです。

転送量を気にしてインデックスカラーのPNGをアップしたと言うのに、オリジナルよりも肥大化したフルカラーのサムネイルが生成されてしまっては、減色した意味がないですよね?これなら、元の画像をそのまま貼り付けて、imgタグのwidthとheightを小さくした方が遥かに利口です。ただでさえ、複数のサムネイルが作成されてサーバ容量が圧迫されるというのに、このままでは使わないゴミが増えていくばかりです。

そこで、インデックスカラーPNGがアップされたときは、同じ色数に減色したサムネイルを作成する改善パッチを書いてみました。

Index: wp-includes/media.php
===================================================================
--- media.php    (revision 11404)
+++ media.php    (working copy)
@@ -352,6 +352,10 @@

     imagecopyresampled( $newimage, $image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

+    // convert from full colors to index colors, like original PNG.
+    if( IMAGETYPE_PNG == $orig_type && !imageistruecolor( $image ) )
+        imagetruecolortopalette( $newimage, false, imagecolorstotal( $image ) );
+
     // we don't need the original in memory anymore
     imagedestroy( $image );

これを適用すれば、インデックスカラーPNGを多用する人も、ファイルサイズで泣かされる事が無くなります。

サムネイルのファイルサイズが増える問題の改善前後の比較

もっと煮詰めるなら、ディザの有無をユーザが選べるように、imagetruecolortopaletteの第二引数を管理画面で設定出来るようにしたほうが良いかもしれません。ディザ無し決め打ちにしてあるのは、そのほうがファイルサイズが小さくなる傾向にあったからと言う理由です。

一応、本家Tracに投げておきました。

Ticket #9887 Problem that PNG thumbnail size increases more than original (WordPress Trac)

改善案があったら、上記チケットにパッチをアップして下さい。Milestoneが変更されたので、もしかしたら、2.9に取り込まれるかもしれません。余裕があればテストをして、Tracにコメントを残しておいてくれると嬉しいです。