« 色を反転する | トップページ | Rangeの範囲指定まとめ »

2010年2月27日 (土)

任意の色とその補色

記事「色を反転する」の中で
パソコンソフトのイラストレーターの機能「反転」について
書きました。
「反転」という機能の下に
「補色」という機能が付いています。
Vba20100227a

この「補色」は、どんな仕組みになっているか調べてみました。

まずは、分かっていること…
赤の補色がシアンになることを確かめる。
Vba20100227b

RGB(255, 0, 0) → RGB(0, 255, 255)

これは、「反転」と同じ結果です。

次に、R255に加えてG100を加えてみる。
Vba20100227c

RGB(255, 100, 0) → RGB(0, 155, 255)

これも、「反転」と同じ結果です。

今度は、R255G100に加えてB50も加えてみる。
Vba20100227d

RGB(255, 100, 50) → RGB(50, 205, 255)

これは、「反転」と違います。
なぜなら、
赤が255 + 50 =305、
緑が100 + 205 = 305
青が50 + 255 = 305
になっているからです。

R255G100の条件でBの値をいろいろ変えてみる。

RGB(255, 100, 20) → RGB(20, 174.99, 255)
RGB(255, 100, 71) → RGB(71, 225.99, 255)
RGB(255, 100, 121) → RGB(100.01, 255, 234.01)
RGB(255, 100, 200) → RGB(100, 255, 155.01)

上の4例では、
補色前と後のRの値を足すと
275、326、355、355になります。
GとBについても同様です。
この辺りからわかりそうです。

さて、どんな計算で補色にできるのかというと、
図を描いたら分かりました。
RGB(255, 100, 20) → RGB(20, 174.99, 255)の場合
Vba20100227e

RGB(200, 150, 100) → RGB(100, 150, 200)の場合
Vba20100227f

つまり、
まず、任意の色のRGB3つ値の中で最大値と最小値を求める。
最大値をMAX、最小値をMINとすると、

補色R = MAX - R + MIN
補色G = MAX - G + MIN
補色B = MAX - B + MIN

で補色が求められる。

任意の色とその補色をみるコード:

Sub macro100227a()
'任意の色とその補色
    Sheets.Add
    Dim i, r0, g0, b0, r1, g1, b1 As Integer
    Dim MaxValue, MinValue As Integer
    '任意の色のRGB
    r0 = 205
    g0 = 87
    b0 = 168
    'WorksheetFunctionを使うためにセルに入れる
    Cells(1, 1) = r0
    Cells(2, 1) = g0
    Cells(3, 1) = b0
    'WorksheetFuntionの範囲指定はRangeしかできない。
    '直接変数を入れることができない。
    MaxValue = Application.WorksheetFunction.Max(Range("A1:A3"))
    MinValue = Application.WorksheetFunction.Min(Range("A1:A3"))
    Debug.Print "Max = " & MaxValue & ", Min = " & MinValue
    '補色のRGB
    r1 = MaxValue - r0 + MinValue
    g1 = MaxValue - g0 + MinValue
    b1 = MaxValue - b0 + MinValue
    Debug.Print r1 & ", " & g1 & ", " & b1
    '描画
    For i = 0 To 30
        ActiveSheet.Shapes.AddShape(msoShapeRectangle, 8 * i + 4, 10, 4, 200).Select
        Selection.ShapeRange.Fill.ForeColor.RGB = RGB(r0, g0, b0)
        Selection.ShapeRange.Line.Visible = msoFalse
        ActiveSheet.Shapes.AddShape(msoShapeRectangle, 8 * i + 8, 10, 4, 200).Select
        Selection.ShapeRange.Fill.ForeColor.RGB = RGB(r1, g1, b1)
        Selection.ShapeRange.Line.Visible = msoFalse
    Next i
End Sub

実行後、
左端の長い四角の色が任意の色でその隣が補色。
以下、交互につづく
Vba20100227g

ちなみに「反転」だとこうなります。
Vba20100227h

なんで縞々にしたかというと
補色同士は加法混色でグレイに見えるようになるからです。
上の画像を少し離れたところから見てみてください。

次に、任意の色とその補色のグラデーションに
カラーパレットを変更します。

任意の色とその補色のグラデーションカラーパレット:

Sub macro100227b()
'カラーパレットを変更
'任意の色とその補色までの
'グラデーションカラーパレット
    Sheets.Add
    Dim i, r0, g0, b0, r1, g1, b1 As Integer
    Dim r, g, b As Integer
    Dim MaxValue, MinValue As Integer
    '任意の色のRGB
    r0 = 205
    g0 = 87
    b0 = 168
    'WorksheetFunctionを使うためにセルに入れる
    Cells(1, 1) = r0
    Cells(2, 1) = g0
    Cells(3, 1) = b0
    'WorksheetFuntionの範囲指定はRangeしかできない。
    '直接変数を入れることができない。
    MaxValue = Application.WorksheetFunction.Max(Range("A1:A3"))
    MinValue = Application.WorksheetFunction.Min(Range("A1:A3"))
    Debug.Print "Max = " & MaxValue & ", Min = " & MinValue
    '補色のRGB
    r1 = MaxValue - r0 + MinValue
    g1 = MaxValue - g0 + MinValue
    b1 = MaxValue - b0 + MinValue
    Debug.Print r1 & ", " & g1 & ", " & b1
   
    Dim MyIndex As Variant
    MyIndex = Array(1, 53, 52, 51, 49, 11, 55, 56, _
        9, 46, 12, 10, 14, 5, 47, 16, _
        3, 45, 43, 50, 42, 41, 13, 48, _
        7, 44, 6, 4, 8, 33, 54, 15, _
        38, 40, 36, 35, 34, 37, 39, 2)

    For i = 0 To 39
        r = r0 + Int((r1 - r0) * i / 39)
        g = g0 + Int((g1 - g0) * i / 39)
        b = b0 + Int((b1 - b0) * i / 39)
        ActiveWorkbook.Colors(MyIndex(i)) = RGB(r, g, b)
        Debug.Print r & "," & g & "," & b
    Next i
End Sub

実行後の任意の色とその補色のグラデーションカラーパレットです。
Vba20100227i

「補色」の求め方から考えると
「補色」は明度を調節して「反転」する
みたいなことのようですね。

|

« 色を反転する | トップページ | Rangeの範囲指定まとめ »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 任意の色とその補色:

« 色を反転する | トップページ | Rangeの範囲指定まとめ »