先日このブログで relColors という関連色を表示するための自作ツールをローンチしたこと書いたので、それについての話題です。
関連色を簡単に見つけられるツール「relColors」作ってみました。 - 今日も適当ダイアリー
当初の予定では、PHPのソースを公開するつもりだったのですが、勢いで作った感じで、なんとも汚いソースだったので、公開はいったん見送って、一部をここに書いていこうと思います。
(自分を含めて)なんかの時に使えるかもしれないし。てことで、今回は色をアルファブレンドしてみます。
アルファブレンドって、なんとなく特殊な処理をするのかなー、なんて思っていたりしたのですが、アルファブレンド - Wikipediaにもあるとおり、非常に単純明快なアルゴリズムで計算できました。
Value = Value0 × (1.0 − α) + Value1 × α
ただし、Value0が背景でValue1が前景である。αはα値と呼ばれる0〜1の値を取る係数でどれくらい透過させるかを表わす値である。αが、1のとき完全な不透過であり、0のとき完全な透明となる。このαがアルファチャンネルまたはマスク画像に相当する。
拍子抜けするほど、簡単です。
PHPで関数として書くと下記のような感じになります。
<?php /** * 色をアルファブレンドする * * @param array $frontColor 前景色 (array(r, g, b) : rgb は 0〜255) * @param array $backColor 背景色 (array(r, g, b) : rgb は 0〜255) * @param int $alpha アルファ値 (0 : 透明 〜 255 : 不透明) * @return array アルファブレンドされた色 (array(r, g, b) : rgb は 0〜255) */ function alphaBrend($frontColor, $backColor, $alpha) { // アルファ率を 0..1 に変換 $a = $alpha / 255; // 0..1の範囲に無い場合は、納める if ($a > 1) { $a = 1; } else if ($a < 0) { $a = 0; } return array( (int) $backColor[0] * (1 - $a) + $frontColor[0] * $a, (int) $backColor[1] * (1 - $a) + $frontColor[1] * $a, (int) $backColor[2] * (1 - $a) + $frontColor[2] * $a, ); }
特に言うことが無いですね。。。