記事「色を反転する」の中で
パソコンソフトのイラストレーターの機能「反転」について
書きました。
「反転」という機能の下に
「補色」という機能が付いています。
この「補色」は、どんな仕組みになっているか調べてみました。
まずは、分かっていること…
赤の補色がシアンになることを確かめる。
RGB(255, 0, 0) → RGB(0, 255, 255)
これは、「反転」と同じ結果です。
次に、R255に加えてG100を加えてみる。
RGB(255, 100, 0) → RGB(0, 155, 255)
これも、「反転」と同じ結果です。
今度は、R255G100に加えてB50も加えてみる。
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)の場合
RGB(200, 150, 100) → RGB(100, 150, 200)の場合
つまり、
まず、任意の色の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 |
実行後、
左端の長い四角の色が任意の色でその隣が補色。
以下、交互につづく
ちなみに「反転」だとこうなります。
なんで縞々にしたかというと
補色同士は加法混色でグレイに見えるようになるからです。
上の画像を少し離れたところから見てみてください。
次に、任意の色とその補色のグラデーションに
カラーパレットを変更します。
任意の色とその補色のグラデーションカラーパレット: 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 |
実行後の任意の色とその補色のグラデーションカラーパレットです。
「補色」の求め方から考えると
「補色」は明度を調節して「反転」する
みたいなことのようですね。
コメント