今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

色をアルファブレンドする

先日このブログで 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,
    );
}

特に言うことが無いですね。。。