PHP GD で画像ファイルの壁紙化
画像によっては、そのまま壁紙にすると明る過ぎて、アイコンが見えにくかったり、目立ち過ぎて周りの人の目が気になったりします。
- よくない例
この画像を目立たなくするツールを作りました。
- 適用例
お試しページ。
- お試しページ > http://awm.jp/~yoya/php/image/wallpaperize.php
- 画像ファイルをPOSTで渡すと暗くした画像を返します。
重たいので、画像を沢山処理したい場合は、コマンドラインでお願いします。
コマンドライン
Windows や Macintosh の壁紙機能は、画像の入っているフォルダを指定して、順繰りに表示する機能があるので、フォルダ毎変換したくなるはずです。
% 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 です。