« 遅くに寿司を食ってきた | メイン | へんな時間に目が覚めた »

2005年11月12日

黒と白を決めるサブルーチン

Ads by Goooooogle の色

Google AdSense の代替広告用の CGI を作っています。データは Amazon Web Services を使うことになると思うのですが、デザインを Google AdSense に似せてみようと思います。

Google AdSense は、枠線のカラーを決めると、自動的に Ads by Goooooogle のカラーを #000000 か #FFFFFF に決めてくれます。これは、どういう仕組みで判定しているのだろうかと、調べてみた。

結構、簡単な仕組みでした。

明るさ=R×0.30+G×0.59+B×0.11

この式で明るさが決まるらしい。明るさは、与えられる RGB の範囲で決まりますが、大概は 0〜255 だと思います。

Perl にて、サブルーチンも作成。

sub get_powered_link_color {
    my ($border_color) = @_;
    my ($powered_link_color);

    if ($border_color =~ /^#([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/) {
        my ($r, $g, $b) = (hex $1, hex $2, hex $3);

        if ($r * 0.3 + $g * 0.59 + $b * 0.11 < 127) {
            $powered_link_color = '#FFFFFF';
        } else {
            $powered_link_color = '#000000';
        }
    }

    return $powered_link_color;
}

与える引数は、枠線色のRGB値(ex. #74F17A)です。返り値は、テキスト色に使ったらよいRGB値です。とはいっても、2色しかないんですが。引数の値がおかしいと、返り値は undef となります。

hex を使って、16進数の値を10進数に変換しています。

ついでに、補色を取得するサブルーチンも作ってみた。

sub get_complementary_color {
    my ($before_color) = @_;
    my ($after_color);

    if ($before_color =~ /^#([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/) {
        my ($r, $g, $b) = (hex $1, hex $2, hex $3);

        $after_color = sprintf "#%02lx%02lx%02lx", 255 - $r, 255 - $g, 255 - $b;
    }

    return $after_color;
}

補色っていうのは、ある色の対極にある色です。混ぜると、白色になる色の組み合わせ(絵の具だと灰色かな)が、補色の関係にあります。補色を知ると、どんないいことがあるのか?ということですが、基本的に、背景色の補色をテキストカラーにすると、そのテキストが目立ちます。

自分専用の Amazon Search を作れないかと奮闘中。後ほど、ソースの公開や、サービスとして提供できればいいなと妄想中。

【関連記事】
Google AdSense を導入しました (2005年11月10日)

【関連情報】
・モノクロ(単一色)階調表現への変換
 http://www.sm.rim.or.jp/~shishido/monog.html

2005年11月12日 22:13 | Programming

トラックバック

コメント

灰色の補色は灰色なので、目立ちません。
赤青緑それぞれ2階調にしてから反転すれば目立つのでは?

投稿者 yach : 2005年11月13日 19:18