上へ G0001 色名一覧 G0002 アルファブレンド G0003 カラーマップを作る G0101 曲線の数値化 G0102 曲線長を測る G0103 曲線の接線・法線 G0104 曲線のスムージング G0201 図形の回転 G0202 領域の認識 G0301 文字の線形変換 G0302 文字の自由変形 G0303 文字の極座標変換 G0304 曲線に沿った文字列 G0305 飾文字-中抜き G0306 飾文字-縁取り G0307 飾文字-ドロップダウンシャドウ G0501 画像の線形変換 G0502 画像の透明化 G0503 画像の任意形状切出し G0504 画像の回転 G0505 画像の高速処理化
| |
VB.NET2005 TIPS / グラフィックス系 |
G0003 カラーマップを作る |
最終更新:2006/11/12 再掲 |
●解説
色のピックアップに用いられる色分布で、横軸に色相、縦軸に明度または彩度とする二次元のマップ。ここでは、色相対彩度で、明度を中間にしたマップを紹介する。
●原理
このようなマップはRGB系から生成するのは不可能で、HSB系より生成する。
HSBからRGBに変換する関数を用い、色相 H を 0 から 359、彩度 S を 0 から 1 まで。明度 B は 0.5(中間値) 一定でスキャンする。
●方法
マップの利用やマップ上への描画などを考慮し、PictureBoxのImageとして生成するのが良い。
- 空白のBitmapを生成する。サイズは必要とするカラーマップのピクセルサイズとする。
- そのBitmapにピクセル単位で色を埋めてゆく
- できたBitmapをPictureBoxのImageにコピーする
- Bitmapを破棄する
- 恒久化したい時はBitmapをファイルとして保存すれば良い。
●実例
picMはPictureBox
横360、縦201のマップを生成し、picMのImageにする例
Dim cmap As New Bitmap(360, 201, Imaging.PixelFormat.Format32bppRgb)
Dim C As Color, RR As Integer
Dim h As Integer
Dim s As Integer
For h = 0 To 359
For s = 0 To 200
HSBToRGB(h, s / 200, 0.5, C)
cmap.SetPixel(h, 200 - s, C)
Next
Next
・・・・・・・・・・・・・・・・・・
picM.Image = cmap.Clone
'Cloneとすると、コピーが作成される。無指定だと参照になるので注意。
cmap.Dispose()
'既にコピーしたので用済み
明度が0.5のカラーマップの例(上端がビビッド、下端がグレー)
HSBからRGBに変換する良く知られている関数
Public Sub HSBToRGB(ByVal sH As Single, ByVal sS As Single, ByVal sB As Single,
ByRef cRGB As Color)
Dim M1 As Single, M2 As Single
Dim cR As Single, cG As Single, cB As Single
If sB <= 0.5 Then
M2 = sB * (1 + sS)
Else
M2 = sB + sS - sB * sS
End If
M1 = 2 * sB - M2
If sS = 0 Then
cR = sB : cG = sB : cB = sB
Else
cR = pGetRGB(sH + 120, M1, M2)
cG = pGetRGB(sH, M1, M2)
cB = pGetRGB(sH - 120, M1, M2)
End If
If cR > 1 Then cR = 1
If cG > 1 Then cG = 1
If cB > 1 Then cB = 1
cRGB = Color.FromArgb(255, CInt(cR * 255), CInt(cG * 255), CInt(cB
* 255))
End Sub
Private Function pGetRGB(ByVal hh As Single, ByVal mm1 As Single, ByVal mm2 As
Single) As Single
While hh < 0
hh = hh + 360
End While
While hh > 360
hh = hh - 360
End While
If hh < 60 Then pGetRGB = mm1 + (mm2 - mm1) * hh / 60
If hh >= 60 And hh < 180 Then pGetRGB = mm2
If hh >= 180 And hh < 240 Then pGetRGB = mm1 + (mm2 - mm1) * (240 -
hh) / 60
If hh >= 240 And hh <= 360 Then pGetRGB = mm1
End Function
|