PHP - 色を偏移させる - 補色を求める

 クラウディア
1. 概要
2. 補色を求める

1. 概要

 次へ行く前に「16進数カラーコードから補色を算出する」という話がなんか役に立ちそうなので・・・。  補色とは、なんだか、小学校の図工の授業で習ったような記憶があるのです。  実際には学校で習ったのはきっと絵の具の三原色だな。  補色同士を合わせるとくっきり映えて見えるとかなんとか・・・。  光の三原色と絵の具の三原色については「光と絵の具の三原色(色とは何か)」に詳しそう。

2. 補色を求める

 でまぁ、先頭で紹介したサイトによれば・・・。  RGB 3つの要素の最小値と最大値の合計から 現在の RGB それぞれの要素の値を引けば・・・補色になるという・・・。  う~ん、文字で説明する方が難しい。  下記のフォームを書いて

<form  name="form" action="./03.html" method="POST">
赤 <input type="text" style="width: 3em; text-align: right;" id="first"  name="reqr" value="{{ $reqr }}" /> 
緑 <input type="text" style="width: 3em; text-align: right;" id="second" name="reqg" value="{{ $reqg }}" /> 
青 <input type="text" style="width: 3em; text-align: right;" id="third"  name="reqb" value="{{ $reqb }}" />
 <input type="submit" class="page" value="展 開" OnClick="JavaScript: func();" />
<script type="text/javascript">
document.getElementById('first').focus();
</script>
</form>
 こんな感じに表示
  緑   青  

 上の赤・緑・青に 0~255 の値をいれて「展開」をクリックするとそれに対応する色とその補色を下に表示します。
 ほんとはボタンを押したときに JavaScript で範囲チェックをしたかったのですが。
 うまく動かせなかったので、0~255 の範囲を超えたら、範囲内に収めるように強制しています。

 #FF0000 
 #00FFFF 

 これを展開するのは、下記のソースで


$reqr = 255;
$reqg = 0;
$reqb = 0;

if (isset($value['reqr']))
{
	$reqr = $value['reqr'];
	$reqg = $value['reqg'];
	$reqb = $value['reqb'];
}

$colorclass = new colorClass();
$reqr = $colorclass->optimize($reqr);
$reqg = $colorclass->optimize($reqg);
$reqb = $colorclass->optimize($reqb);

$forwardcolor = '#'.sprintf("%02X", $reqr).sprintf("%02X", $reqg).sprintf("%02X", $reqb);

$total = max($reqr, $reqg, $reqb) + min($reqr, $reqg, $reqb);

$revr = $total - $reqr;
$revg = $total - $reqg;
$revb = $total - $reqb;

$reversecolor = '#'.sprintf("%02X", $revr).sprintf("%02X", $revg).sprintf("%02X", $revb);

$color   = ' '.$forwardcolor.' <button type="button" style="background-color: '.$forwardcolor.'; width: 50%; height: 1em;"></button>'."\n";
$reverse = ' '.$reversecolor.' <button type="button" style="background-color: '.$reversecolor.'; width: 50%; height: 1em;"></button>';
 「$value」は、「POST」で与えられる引数。  「$reqr」「$reqg」「$reqb」「$color」「$reverse」の変数を、適切な位置に配置することにより、展開します。  色の値を補正するクラスとして下記のソースを使用しています。

/**
 * 色設定スクラス
 * @author private
 *
 */
class colorClass
{
	/**
	 * コンストラクタ
	 */
    public function __construct()
    {
    }

    /**
     * デストラクタ
     */
    public function __destruct()
    {
    }

    /**
     * 色の最適化	色の値を 0~255 におさめる
     * @param integer $color
     * @return integer
     */
    public function optimize($color)
    {
		if ($color < 0)
    	{
    		$color = 0;
    	}

        if ($color > 255)
    	{
    		$color = 255;
    	}

    	return $color;
    }

    /**
     *	RGB の入力成分により #RRGGBB の文字列を返す
     * @param int $R
     * @param int $G
     * @param int $B
     * @return number
     */
    public function forward($R, $G, $B)
    {
		$R = $this->optimize($R);
		$G = $this->optimize($G);
		$B = $this->optimize($B);

    	return '#'.sprintf("%02X", $R).sprintf("%02X", $G).sprintf("%02X", $B);
    }

    /**
     * RGB の入力成分の補色を求めて #RRGGBB の文字列を返す
     * @param int $R
     * @param int $G
     * @param int $B
     * @return string
     */
	public function reverse($R, $G, $B)
	{
		$R = $this->optimize($R);
		$G = $this->optimize($G);
		$B = $this->optimize($B);

		$total = max($R, $G, $B) + min($R, $G, $B);

		$revr = $total - $R;
		$revg = $total - $G;
		$revb = $total - $B;

    	return '#'.sprintf("%02X", $revr).sprintf("%02X", $revg).sprintf("%02X", $revb);
	}
}
ハイスピードプランメンズミレット