- - PR -
虹色のようなカラーパレットを作成したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-12-06 10:19
{質問}
虹色のようなカラーパレットを表現できる計算式を教えてください。 [詳細] 赤→橙→黄→緑→青と徐々に変化する256個のカラーパレットを作成したいので、 RGBの割合(R=8bit/G=8bit/B=8bitの各値)を変化させる計算式をあれこれ自作して実験しましたが、 (センスが悪いのか)うまく虹色のように変化させることができませんでした。 C#によるカラーパレット作成方法が分からないという意味では無く、 計算式が見つからないという意味の質問です。 インターネットで「色見本」等で検索すると複数のサイトが出てきますが、 カラーパレットを作成するためのRGBの配合率の計算式を見つけることができませんでした。 直感的におおよそ虹のように変化しているように見えればいいレベルで、 色彩工学的な厳密性はあまり要求していません。 [背景] 物体の温度分布や、等高線図等、様々な現象を視覚化することに取り組んでいます。 今は、グレースケールのカラーパレットを使っていますが、 虹色のほうが効果的なので、虹色のようなカラーパレットを作成したいです。 {補足} この質問は計算式についてであり、.NET特有の質問では無いので、 掲示板の趣旨とは外れるかも知れませんが、同じようなことを検討している方も いらっしゃるかと思い、投稿しました。 | ||||
|
投稿日時: 2006-12-06 10:44
おおよそといっているので素人案ですが、
[1 - 192] の範囲は 赤 FF→00 緑 00→FF [193 - 256] の範囲は 緑 FF→00 青 00→FF とやって見るのはどうでしょう。 あとは、 色空間(Wikipedia) マンセル・カラー・システム(Wikipedia) あたりが参考になりそうです。 #編集:リンクを修正 [ メッセージ編集済み 編集者: 杏仁豆腐(旧MechanicalLife 編集日時 2006-12-06 10:48 ] | ||||
|
投稿日時: 2006-12-06 10:49
赤 R255 G0 B0
橙 R255 G128 B0 黄 R255 G255 B0 緑 R0 G255 B0 シアン R0 G255 B255 青 R0 G0 B255 ポイントの色がわかっていれば間を適当に補完すればいいのではないでしょうか | ||||
|
投稿日時: 2006-12-06 11:39
HSV[wikipedia]をベースにして、色相・彩度・明度のうち、色相だけを変化させれば綺麗な虹色になると思いますよ。
C#については無知なので、C#のライブラリにHSVを扱うメソッド等があるかは知りませんが(多分あると思います)、なくてもRGBへの変換はwikipediaにも載っているので、試してみてください。 #修正 輝度→明度 #追記 特にC#という訳じゃなかったですね。斜め読みしたら逆にとってしまいました [ メッセージ編集済み 編集者: sawat 編集日時 2006-12-06 11:41 ] [ メッセージ編集済み 編集者: sawat 編集日時 2006-12-06 12:00 ] | ||||
|
投稿日時: 2006-12-06 12:11
ですね。 ちょっと捕捉しておくと、必ずしも256階調で表現できるとは限らないことは承知して置いてください。HSVにおいて色相を256段階に変化させたとしても、それをRGBに変換した時点では50段階しか無くなってしまうと言う事が普通に起こります。つまり「きれいな虹色」と「256個のカラーパレット」は両立できない場合があります。 256段階で変化を表現する事が必要条件なら、色相を変化させるのではなく白黒で明度を変化させるほうが楽です。あくまで256段階で色相を変化させたいなら、計算でパレットを作るのではなく、自分で一つ一つ適切な色をピックアップしていく必要があるでしょう。 それから人間の視覚は輝度の変化には敏感だけど、色相の変化には鈍感と言う問題があります。色相の変化で表現した場合、高度の変化がわずかだと、見ている人には分からないという状況になります。 | ||||
|
投稿日時: 2006-12-07 20:13
ご回答ありがとうございます。
ポイントとなる色の間を補完しました。 下記のメソッドでそれらしい256色の組み合わせができました。 public static Color[] CreatePalette() { Color[] _ans = new Color[256]; // 青→緑 for (int i = 0; i < 64; i++) { int _green = i * 4; _ans[i] = Color.FromArgb(255, 0, _green, 255 - _green); } // 緑→黄 for (int i = 0; i < 64; i++) { int _red = i * 4; _ans[i+64] = Color.FromArgb(255, _red, 255, 0); } // 黄→赤 for (int i = 0; i < 128; i++) { int _green = 255 - i * 2; _ans[i + 128] = Color.FromArgb(255, 255, _green, 0); } return _ans; } | ||||
|
投稿日時: 2006-12-08 22:33
下記のサイトを参考にされるとよろしいかと思います。
http://santamartadotnet.hp.infoseek.co.jp/documents/dotnettips/tips033.html |
1