3. php - 色を偏移させる - 補色を求める

 
3.1 概要
3.2 補色を求める

3.1 概要

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

3.2 補色を求める

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

<form  name="form" action="./03.php" method="POST">
赤 <input type="text" style="width: 3em; text-align: right;" id="first"  name="reqr" value="255" /> 
緑 <input type="text" style="width: 3em; text-align: right;" id="second" name="reqg" value="0" /> 
青 <input type="text" style="width: 3em; text-align: right;" id="third"  name="reqb" value="0" />
 <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 

 この上には {$color} と {$reverse} というテンプレート変数を記述しています。

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

<?php
	require_once("../sample/MySmarty.php");
	require_once("./colorClass.php");

	$smarty = new MySmarty();													//	Smartyのインスタンスを作成
	$smarty->caching = false;													//	キャッシュしない

	$value = array();

	foreach($_GET as $get => $get_value)
	{
		$value["$get"] = $get_value;
	}

	foreach($_POST as $post => $post_value)
	{
		$value["$post"] = $post_value;
	}

	$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);

	$smarty->assign('reqr', $reqr);
	$smarty->assign('reqg', $reqg);
	$smarty->assign('reqb', $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: 100%; height: 1em;"></button>'."\n";
	$reverse = ' '.$reversecolor.' <button type="button" style="background-color: '.$reversecolor.'; width: 100%; height: 1em;"></button>';

	$smarty->assign('color', $color);
	$smarty->assign('reverse', $reverse);

	$smarty->display('06/03.tpl');												// テンプレートを指定し表示
?>

 色の値を補正するクラスとして下記のソースを使用しています。
<?php
/**
 * データベースアクセスクラス
 * @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);
	}

}
?>