ホーム ] TIPS ウィンドウズ系 ] TIPS グラフィックス系 ] TIPS メルチメディア系 ] TIPS 理数系 ] TIPS 総覧 ]

上へ
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として生成するのが良い。

  1. 空白のBitmapを生成する。サイズは必要とするカラーマップのピクセルサイズとする。
  2. そのBitmapにピクセル単位で色を埋めてゆく
  3. できたBitmapをPictureBoxのImageにコピーする
  4. Bitmapを破棄する
  5. 恒久化したい時は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