仕様
状態:-
閲覧数:2,821
投稿日:2016-04-16
更新日:2016-06-18
RGB からHSL への変換アルゴリズムは、 W3Cの仕様 CSS カラーモジュール Level 3には記載されていない
※HSL から RGBへの変換アルゴリズムは記載されている
RGB → HSL を 色モデルで考える
最も一般的な単位
・この他にも任意で設定可能
RGB
HSL
※HSL から RGBへの変換アルゴリズムは記載されている
RGB → HSL の意味
RGB → HSL を 色モデルで考える
単位
最も一般的な単位
・この他にも任意で設定可能
RGB
名前 | R | G | B | 備考 |
---|---|---|---|---|
- | 0~255 | 0~255 | 0~255 | - |
名前 | H | S | L | 備考 |
---|---|---|---|---|
- | 0°~360° | 0%~100% | 0%~100% | - |
色相H
2種類の計算式
・「RGB各成分の基準値」を「最大値」とするか「最小値」とするか、で大きく2種類に分かれる
・RGB → HSL 方式の違い
最も大きな値
・MAX
最も小さな値
・MIN
・「RGB各成分の基準値」を「最大値」とするか「最小値」とするか、で大きく2種類に分かれる
・RGB → HSL 方式の違い
最小値基準の色相H
最も大きな値
・MAX
最も小さな値
・MIN
彩度S
円柱モデルを使用
彩度の定義は2種類
・双円錐モデル … 使用しない。用途不明
・円柱モデル … 使用
双円錐モデル
・彩度 … 最大値と最小値の差
円柱モデル
・彩度 … 「最大値と最小値の差」の「255-|最大値と最小値の和-255|」に対する割合
円柱モデル 2種類の計算式比較
Wikipedia
・最終的にはこの式だけ覚えておけばよい
・変形させた結果なので、この式自体からは意味を読み取れない
(MAX-MIN) ÷ (1-|MAX+MIN-1|)
RGBとHSLの相互変換ツールと変換計算式
・上記と比較するとこちらの方がより本来の意味に近い
・しかしそれでも一部変形しているところがある(510=2×255)
・前提が255なので、異なるビットカラーでは値を変更しなくてはいけない
収束値 CNT = (MAX + MIN) ÷ 2
収束値 CNTが127以下の場合 彩度 S = (MAX - MIN) ÷ (MAX + MIN)
収束値 CNTが128以上の場合 彩度 S = (MAX - MIN) ÷ (510 - MAX - MIN)
収束値 CNTが127以下の場合 彩度 S = (MAX - MIN) ÷ (MAX + MIN)
収束値 CNTが128以上の場合 彩度 S = (MAX - MIN) ÷ (510 - MAX - MIN)
var MAX = 243;
var MIN = 33;
(MAX-MIN)/(255-Math.abs(MAX+MIN-255)); //0.8974358974358975
RGBからHSLのSを求める計算式。(MAX-MIN)/(1-|MAX+MIN-1|)
彩度Sの意味
・RGBの3値が同じ状態を0%
・彩度上昇にあわせて均等に広がっていく
・RGBの何れかが0もしくは255に到達した段階で100%となる
最初に0%と100%を求める
→ 現在の値が変動幅のうちの何%になるのかを調べれば彩度が求まる
RGB → HSL 変換式 / 約分対応
約分対応
約分とは?
・分数の分母と分子を同じ数でわって,分母の小さい分数にすること
対象
(8/4+16/4)/2 = 3
分数の「分母」と「分子」に4を掛ける
・(8+16)/(2×4) = 3
()がないと結果は異なるので注意が必要
・(8+16)/2×4 = 48
RGB → HSL 約分変換式
0≦ (dR,dG,dB) ≦ m のとき、dR,dG,dBの最大値をdMAX,最小値をdMINとすると
・R=dR/m
・G=dG/m
・B=dB/m
・MAX=dMAX/m
・MIN=dMIN/m
Hの式
・分子と分母のmが約分されるので、 dR,dG,dB のまま計算しても同じ値が出る
Sの式
(MAX-MIN)/(1-|MAX+MIN-1|)
=(dMAX/m-dMIN/m)/(1-|dMAX/m+dMIN/m-1|)
=(dMAX-dMIN)/(m-|dMAX+dMIN-m|)
=(dMAX/m-dMIN/m)/(1-|dMAX/m+dMIN/m-1|)
=(dMAX-dMIN)/(m-|dMAX+dMIN-m|)
Lの式
(MAX+MIN)/2
=(dMAX/m+dMIN/m)/2
=((dMAX+dMIN)/m)/2
=(dMAX+dMIN)/2m
=(dMAX/m+dMIN/m)/2
=((dMAX+dMIN)/m)/2
=(dMAX+dMIN)/2m
RGB範囲0 ~ 255
0≦ (dR,dG,dB) ≦ 255 のとき、dR,dG,dBの最大値をdMAX,最小値をdMINとすると
・R=dR/255
・G=dG/255
・B=dB/255
・MAX=dMAX/255
・MIN=dMIN/255
Hの式
・分子と分母の255が約分されるので、 dR,dG,dB のまま計算しても同じ値が出る
Sの式
(MAX-MIN)/(1-|MAX+MIN-1|)
(dMAX/255-dMIN/255)/(1-|dMAX/255+dMIN/255-1|)
(dMAX-dMIN)/(255-|dMAX+dMIN-255|)
(dMAX/255-dMIN/255)/(1-|dMAX/255+dMIN/255-1|)
(dMAX-dMIN)/(255-|dMAX+dMIN-255|)
Lの式
(MAX+MIN)/2
(dMAX/255+dMIN/255)/2 … 単位変換
((dMAX+dMIN)/255)/2 … 分子の分母を255でまとめる
(dMAX+dMIN)/(2×255) … 分母と分子へ255を掛ける
(dMAX/255+dMIN/255)/2 … 単位変換
((dMAX+dMIN)/255)/2 … 分子の分母を255でまとめる
(dMAX+dMIN)/(2×255) … 分母と分子へ255を掛ける
RGB → HSL 計算例 最小値基準 / RGB 33, 150, 243 → HSL 206.6°, 89.7%, 54.1%
RGB 33, 150, 243
R(red) : 赤色 0~255の数値
G(green): 緑色 0~255の数値
B(blue) : 青色 0~255の数値
R33, G150, B243
0.RGBの最大値最小値を求める
確認事項
・最大値と最小値は=ではない
最大値
・B243
最小値
・R33
1.Hを求める
最小値Rの式に値を当てはめていく
60×(B-G/MAX-MIN)+180
・60×((243-150)/(243-33))+180=206.571428571→ 206.6
2.Sを求める
Sの式に値を当てはめていく
(MAX-MIN)/(1-|MAX+MIN-1|)
・(243/255-33/255)/(1-|243/255+33/255-1|)=0.89743589743%(0~100)表示へ変更
→ 89.7
条件分岐で計算していく方式
収束値 CNT
・(MAX+MIN)/2=138
CNT≧(255/2)の場合のS
・255×(MAX-MIN)/{2×255-(MAX+MIN)}
・(255×(243-33)/(2×255-(243+33))) ÷ 255) × 100=89.7435897436
%(0~100)表示へ変更
→ 89.7
3.Lを求める
Lの式に値を当てはめていく
(MAX+MIN)/2
・(243+33)/2=138→ 138
%表示へ変更
・「0~255」範囲の値である138を、%(0~100)表示へ変更
・(138 ÷ 255) × 100 =54.1176470588
→ 54.1
今回はたまたま割り切れたけれども本来であればこうすべき
・(243/255+33/255)/2 =0.54117647058
%(0~100)表示へ変更
→ 54.1
RGB → HSL 変換式 / 最大値基準
前提
最も大きな値
・MAX
最も小さな値
・MIN
H
Rが最大値の場合
・色相 H = 60 × ((G - B) ÷ (MAX - MIN))
Gが最大値の場合
・色相 H = 60 × ((B - R) ÷ (MAX - MIN)) +120
Bが最大値の場合
・色相 H = 60 × ((R - G) ÷ (MAX - MIN)) +240
3つとも同じ値の場合
・色相 H = 0
※求められた色相がマイナス値だった場合
・360を加算して0~360の範囲に収める
S
収束値
収束値 CNT = (MAX + MIN) ÷ 2
変動幅収束値 CNTが127以下の場合 変動幅 = CNT
収束値 CNTが128以上の場合 変動幅 = 255 - CNT
計算式収束値 CNTが128以上の場合 変動幅 = 255 - CNT
・0%から100%までの変動幅が分かれば、後は(現在値-収束値)/変動幅で彩度を求めることが可能
収束値 CNTが127以下の場合 彩度 S = (CNT - MIN) ÷ CNT
= 2(CNT - MIN) ÷ 2CNT
= (MAX + MIN - 2MIN) ÷ (MAX + MIN)
= (MAX - MIN) ÷ (MAX + MIN)
収束値 CNTが128以上の場合 彩度 S = (MAX - CNT) ÷ (255 - CNT)
= 2(MAX - CNT) ÷ 2(255 - CNT)
= 2MAX - MAX - MIN ÷ (510 - MAX - MIN)
= (MAX - MIN) ÷ (510 - MAX - MIN)
= 2(CNT - MIN) ÷ 2CNT
= (MAX + MIN - 2MIN) ÷ (MAX + MIN)
= (MAX - MIN) ÷ (MAX + MIN)
収束値 CNTが128以上の場合 彩度 S = (MAX - CNT) ÷ (255 - CNT)
= 2(MAX - CNT) ÷ 2(255 - CNT)
= 2MAX - MAX - MIN ÷ (510 - MAX - MIN)
= (MAX - MIN) ÷ (510 - MAX - MIN)
最終的な彩度計算式
収束値 CNT = (MAX + MIN) ÷ 2
収束値 CNTが127以下の場合 彩度 S = (MAX - MIN) ÷ (MAX + MIN)
収束値 CNTが128以上の場合 彩度 S = (MAX - MIN) ÷ (510 - MAX - MIN)
収束値 CNTが127以下の場合 彩度 S = (MAX - MIN) ÷ (MAX + MIN)
収束値 CNTが128以上の場合 彩度 S = (MAX - MIN) ÷ (510 - MAX - MIN)
L
輝度 L = (MAX + MIN) ÷ 2
・RGBとHSLの相互変換ツールと変換計算式
RGB → HSL 最大値基準 / RGB 33, 150, 243 → HSL 206.6°, 89.7%, 54.1%さ
0.最大値と最小値を求める
最大値
・B
・243
最小値
・R
・33
H
最大値はB
60 × ((R - G) ÷ (MAX - MIN)) +240
・60 × ((33 - 150) ÷ (243 - 33))+240 = 206.571428571≒ 206.6S
収束値
・CNT = (243 + 33) ÷ 2 = 138
収束値が128以上で計算
彩度 S = (MAX - MIN) ÷ (510 - MAX - MIN)
・S = (243 - 33) ÷ (510 - 243 - 33) = 0.89743589743≒ 89.7%L
輝度 L = (MAX + MIN) ÷ 2
・(243 + 33) ÷ 2 = 138明度範囲が0~100の場合
・(138 ÷ 255) × 100 = 54.1176470588≒ 54.%