LED用のカラーピッカー作ったぽよ
概要
まだまだLEDを光らせている私です.フルカラーのLEDだといろんな色を出せて最高なので,全然飽きません.でも,RGBの出力をシークバーで「えいやー!」って決める感じだと,実際にどんな色が出るかは直感的に分からないので,よくないなぁと思い始めました.最悪な感じがします.ってことで,もっといい感じに色を設定できるようにカラーピッカーを作ってることにしました.
成果物
解決した問題点
直感的なカラーピッカーといえばHSV色空間を用いたものだと思う.ヒトとしてはまず色相を決めたい感じがするからね.光源色を設定するためにHSV色空間を用いてよいかは,ここでは深く議論しない*1けど,ディスプレイ上の色をLEDに反映させるにはいくつかの問題点がある.
表現可能な色の範囲が異なる
ディスプレイにはカラーモデルがある.つまり,いくつかの予め決められた原色を足しあわせることで多様な色を表現する.そして,その原色の波長が異なると,表現可能な色も違ってくる.現行のディスプレイはsRGB/D65のカラーモデルを採用しているのが多い.以下のサイトでsRGBのカラーモデルと今回用いるLEDのカラーモデルを比較してみた.
CIE XYZ表色系(10): XYZ / RGB 変換マトリックスの計算
ちなみに,LEDの三原色の波長の色度座標は以下の本の巻末の付表を用いて求めた.(ヒトの色の知覚に関する大まかな知識を得たり各表色系を理解するのによい本だと思う.)
- 作者: 篠田博之,藤枝一郎
- 出版社/メーカー: 森北出版
- 発売日: 2007/04/19
- メディア: 単行本
- この商品を含むブログを見る
[sRGBが表現可能な色]
ヒトが視れる色の内,sRGBのディスプレイでは上記の三角形の内側だけしか表現できないことになる.よって,少なくとも色域(三角形)の外側の色については正確ではない.
[LEDが表現可能な色(ただしホワイトポイントはD65のまま)]
比較すると緑と赤の原色の色度座標がかなり異なっていることが分かる.緑色周辺の色弁別閾値は他の領域に比べて大きいとはいえ,ディスプレイのRGBの数値をそのままLEDの各原色の発光強度に当てはめてもよい結果にならないだろう.
雑感
プログラミングに関することだけど,ViewとかListenerとか独自に作ったのは初めてだった.というか,いつのまにやらAndroidではFragmentと呼ばれるものを中心にプログラミングするようになっててビビった.
面白いほど楽に色を設定できるようになったので,ますますLED光らせるのが好きになったのだけれど,LED側からするとあんまり嬉しくないことがいくつかあったので最後に書いておく.
LEDのホワイトポイントよくわからんちん
色度計とかもってないのでよくわからんちん.でも,ホワイトポイント自体,何を白とするかを決めるための色度なので,私が白だと思えばそこが白になるのだろう!
LEDで表現可能な全ての色を表現できるわけではない
LEDは緑色の波長とその光度の高さに特徴があるが,ディスプレイ側の緑色周辺の色域が広くないので,そもそも設定不可能になってしまう領域があったようだ.
LEDの色の深度を活かしきれてないかも
ハードウェアの実装では,LEDのRGBは12bit,4096階調で設定できるようになっている.それに対して,ディスプレイのRGBはそれぞれ8bit,256階調である.計算の過程で,複数回の一次変換とガンマ変換がかかるので,設定先の解像度が高いことは有利ではあるものの,階調の深さが活かしきれていない感じがしなくもない.
これからも楽しくLチカするのです!
おつかれさまでしたッ )^o^(