2009 . 11 . 29

色変換式を活用して動的な色指定を自由に行う

Rainmeter1.1で実装されたDynamicVariablesを使えば、設定値を動的に変更することが可能です。

もちろん色の指定もその例外ではなく、測定値を当てはめたり、!RainmeterSetVariableコマンドを使って適宜変更したりということができます。

しかし、これらのことを実際行おうとすると、そこには大きな障害が立ちはだかっている事に気付くと思います。


それはRainmeterの色指定の形式がRGBでなければならないということ。

このRGBとは赤緑青のそれぞれの原色の配合率にほかなりません。

従来のように手動で設定するのならば、およそどんな形式でも構いませんが、ある測定値を色に割り当てたいと考えた場合このRGBは非常に不便な形式と言わざるを得ません。


色の形式にはRGBのほかHSBというのが有名で、こちらは色合い、彩度、明度からなるものです。

例えば、色合いだけを変えたいとか彩度を変えたいと考えた場合、直接RGBで指定することは難しく、こちらのHSBの形式を使った方がはるかに容易です。


そこで、このHSBの形式をRGBに変換して求められた値を適用するために、一連の変換式を考えてみました。

最初は自力で考えていたものの、そんな必要もなくこれらに関する情報はネットでたくさん紹介されていることを知り、それらを参考にしました。


さて、もっとも注目すべきは色合いで、0から360までの可変域の間で、0から60まではR、G、Bのそれぞれの値はいくつで60から120は・・・という条件が以下のように成り立ちます。


R G B
0-60 MAX MIN+(H-0)*(MAX-MIN)/60 MIN
60-120 MAX-(H-60)*(MAX-MIN)/60 MAX MIN
120-180 MIN MAX MIN+(H-120)*(MAX-MIN)/60
180-240 MIN MAX-(H-180)*(MAX-MIN)/60 MAX
240-300 MIN+(H-240)*(MAX-MIN)/60 MIN MAX
300-360 MAX MIN MAX-(H-300)*(MAX-MIN)/60

ここで、Hは色合い、MAXはB(明度)を0から100までの可変域に直した変数、MINはS(彩度)を0から100までの可変域に直した変数を示します。

この公式をCalcの条件演算子に当てはめていきます。条件演算子は式の部分に条件演算子自体を入れ子にしながら使えるので、R、G、B、それぞれの条件をすべて直列に繋げていき、最終的に下の[RED],[GREEN],[BLUE]の3つの式にまとめます。

以下が実際の基本的な設定例です。



[H]色合い、[S]彩度、[B]明度のそれぞれに指定した値が以降の計算メジャーによって変換され、それが下のメーターのSolidColor=[RED],[GREEN],[BLUE]に適用されると言う具合です。

  • 実際、カラーピッカーなどの値と若干異なる値になることがありますが、これは計算で生じる少数以下の処理によるもののようです。
    繰上げ、繰下げ、四捨五入といろいろ試してみましたが、繰上げが一番誤差が少ないようでした

さて、上の例はあくまで基本であって、手動で[H]、[S]、[B]の値を指定するのでは意味がありません。

最初の趣旨でもあるように、何らかの取得値を割り当てる例として時間を色合いに割り当てる例を挙げてみましょう。



新たに秒を測定するメジャー[SECONDS]を加え、[H]はこれに応じて変化するように変更します。

この式は60秒で360の可変域の色合いを一周する式になっています。

これで、彩度と明度は固定のまま、色合いだけが1秒ごとに変化していくのが確認できると思います。

これを応用して作ったスキンがLinear Clockで、この記事に興味をもたれた方は参考にされてはと思います。

また、最初の基本例はHSBからRGBへの変換メソッドとして、比較的汎用性が高いと思うので、そのままスキンワークの素材としても利用できると思います。