PHP GD で画像ファイルの壁紙化

画像によっては、そのまま壁紙にすると明る過ぎて、アイコンが見えにくかったり、目立ち過ぎて周りの人の目が気になったりします。

  • よくない例

この画像を目立たなくするツールを作りました。

  • 適用例


お試しページ。

重たいので、画像を沢山処理したい場合は、コマンドラインでお願いします。

コマンドライン

WindowsMacintosh の壁紙機能は、画像の入っているフォルダを指定して、順繰りに表示する機能があるので、フォルダ毎変換したくなるはずです。

% php wallpaperize.php
Usage: php wallpaperize.php
% php wallpaperize.php img imgwall
imgwall/02b2081.jpg
imgwall/544b7a5.jpg
imgwall/9504c63.png
imgwall/f65f8d0.gif
<略>

上記のように画像フォルダと、変換後の画像を保存するフォルダを指定する事で、まとめて処理できます。

何してるか

  • 渡された画像の RGB 値を減らして暗くし、かつ RGB の値を少し混ぜて彩度も少し落とします。
    • 暗くする際に元画像の明るさを見て、暗くなり過ぎないように調整してます。
  • トゥルーカラーとパレット画像で処理が変わるのが少し面倒でした。後は簡単。

改造したい場合

  • 色変換処理なので、ここを弄ればよいです。
  • / 12 の数値を弄れば明暗調整出来ます。
function  filterValue(&$value, $total, $maxvalue) {
    $ratio = $value / 255;
    $value = ($value * $ratio) + ($value * 127 / $maxvalue) * (1-$ratio);
    $value = ($value * 3 + $total) / 12;
}

function  filterPixel(&$red, &$green, &$blue, $maxvalue) {
    $total = $red + $green + $blue;
    filterValue($red,   $total, $maxvalue);
    filterValue($green, $total, $maxvalue);
    filterValue($blue,  $total, $maxvalue);
}

手こずったところ

  • GD から貰った color index 値を A,R,G,B に分解する所で unack('cCCC', ... としたけど、そういえば color index はバイナリでなく long でした。
  • ファイルPOSTフォームで指定する最大値が小さくて失敗してた。ちなみに error 2 です。

ツッコミ防御

  • imagefilter の IMG_FILTER_BRIGHTNESS 使えと言われそうだけど、自分の思った色味が出せなかったので、PHP のコード側でフィルタ処理を実装しました。重たいけど拘りたいので許して下さい。
  • PHP で画像を変換するのでなく OS の壁紙指定機能にフック出来ると良いのですが、やり方が見つからないです。一番やりたいのは Android の壁紙設定フック。