C# Colorの使い方を完全解説|RGB・ARGB・HTMLカラー変換から色一覧まで

はじめに

C#で画面の背景色、文字色、ボタンの色、グラフの色、画像処理の色などを扱うときに欠かせないのがColorです。ひとことでColorといっても、Windows Formsでよく使うSystem.Drawing.Color、WPFで使うSystem.Windows.Media.Color、さらにHTMLカラーコードやRGB、ARGBとの相互変換など、用途によって使い方が少しずつ異なります。

この記事では、C# Colorの基本から、RGB・ARGBによる色指定、HTMLカラーコードとの変換、名前付きカラー一覧、WinFormsとWPFでの使い方、よくあるエラーの対処法、実用的なサンプルコードまでまとめて解説します。

1. C#のColorとは?基本概念と使われる場面

1-1. C#におけるColorの役割

C#におけるColorは、赤・緑・青・透明度などの情報を持つ「色」を表すための型です。画面上のUI部品に色を付けたり、画像のピクセル色を取得したり、ユーザーが選択した色を保存したりするときに使います。

たとえば、Windows Formsでは次のようにフォームの背景色を変更できます。

C#
this.BackColor = Color.LightBlue;

このColor.LightBlueは、C#であらかじめ用意されている名前付きカラーです。自分でRGB値を指定して色を作ることもできます。

C#
this.BackColor = Color.FromArgb(173, 216, 230);

Colorを理解すると、アプリケーションの見た目を細かく制御できるようになります。

1-2. System.Drawing.ColorとSystem.Windows.Media.Colorの違い

C#で「Color」と呼ばれる型には、主に次の2種類があります。

C#
System.Drawing.Color
System.Windows.Media.Color

System.Drawing.Colorは、Windows FormsやGDI+系の処理でよく使われるColorです。Color.RedColor.FromArgbColorTranslator.FromHtmlなどを使って色を扱います。Microsoftのドキュメントでも、System.Drawing.ColorはARGB値や名前付きカラーを持つ構造体として説明されています。Microsoft Learn

一方、System.Windows.Media.Colorは、WPFで使われるColorです。WPFでは、背景や文字色に直接Colorを設定するのではなく、多くの場合SolidColorBrushなどのBrushを使います。WPFではSolidColorBrushが単色のColorで領域を塗りつぶすために使われます。Microsoft Learn

違いを簡単にまとめると、次のようになります。

種類主な用途よく使う場面
System.Drawing.ColorWindows Forms、GDI+、一部の画像処理WinFormsの背景色・文字色・ColorDialog
System.Windows.Media.ColorWPFXAML、Brush、SolidColorBrush
HTMLカラーコードWeb系の色指定#FF0000#FFFFFFなどの文字列

同じ「赤」を表す場合でも、WinFormsではSystem.Drawing.Color.Red、WPFではSystem.Windows.Media.Colors.Redのように指定します。

1-3. Colorがよく使われるアプリ開発の例

C# Colorは、次のような場面でよく使われます。

Windows Formsアプリでは、フォーム、ボタン、ラベル、テキストボックス、パネルなどの背景色や文字色を変更するために使います。

C#
button1.BackColor = Color.Green;
button1.ForeColor = Color.White;

WPFアプリでは、SolidColorBrushを使って背景色や文字色を指定します。

C#
label.Foreground = new SolidColorBrush(Colors.Red);

画像処理では、ピクセル単位で色を取得したり変更したりします。

C#
Color pixelColor = bitmap.GetPixel(10, 20);

設定画面では、ユーザーが選んだテーマカラーを保存して、次回起動時に再利用することもあります。

C#
Properties.Settings.Default.ThemeColor = selectedColor.ToArgb();
Properties.Settings.Default.Save();

このように、ColorはUI、画像処理、テーマ管理、カスタマイズ機能など、幅広いアプリ開発で使われます。

1-4. Colorを使う前に必要な名前空間と参照設定

Windows FormsでSystem.Drawing.Colorを使う場合は、次の名前空間を追加します。

C#
using System.Drawing;

Windows Formsのプロジェクトでは通常、最初からSystem.Drawingが使えることが多いです。ただし、プロジェクトの種類や.NETのバージョンによっては、System.Drawing.Commonパッケージの追加が必要になる場合があります。

WPFでSystem.Windows.Media.Colorを使う場合は、次の名前空間を使います。

C#
using System.Windows.Media;

ただし、System.Drawing.ColorSystem.Windows.Media.Colorを同時に使うと、どちらのColorなのか曖昧になることがあります。その場合は、完全修飾名を使います。

C#
System.Drawing.Color drawingColor = System.Drawing.Color.Red;
System.Windows.Media.Color mediaColor = System.Windows.Media.Colors.Red;

または、別名を付ける方法も便利です。

C#
using DrawingColor = System.Drawing.Color;
using MediaColor = System.Windows.Media.Color;
C#
DrawingColor winFormsColor = DrawingColor.Blue;
MediaColor wpfColor = System.Windows.Media.Colors.Blue;

2. C# Colorの基本的な使い方

2-1. Color.FromArgbで色を作成する方法

Color.FromArgbは、RGB値やARGB値からColorを作成する代表的なメソッドです。

RGBで指定する場合は、赤・緑・青の順番で値を指定します。

C#
Color color = Color.FromArgb(255, 0, 0);

このコードは赤色を表します。

C#
Color red = Color.FromArgb(255, 0, 0);
Color green = Color.FromArgb(0, 255, 0);
Color blue = Color.FromArgb(0, 0, 255);
Color white = Color.FromArgb(255, 255, 255);
Color black = Color.FromArgb(0, 0, 0);

透明度を含める場合は、ARGB形式で指定します。

C#
Color semiTransparentRed = Color.FromArgb(128, 255, 0, 0);

第1引数の128が透明度、つまりAlpha値です。Color.FromArgbでは、Alpha、Red、Green、Blueの各成分は8ビット、つまり0〜255の範囲で扱われます。Microsoft Learn

2-2. Color.FromNameで名前付き色を指定する方法

Color.FromNameを使うと、色名の文字列からColorを作成できます。

C#
Color color = Color.FromName("Red");

次のように、ユーザーが入力した色名からColorを作ることもできます。

C#
string colorName = "Blue";
Color color = Color.FromName(colorName);

ただし、存在しない色名を指定しても例外は発生しません。たとえば次のコードはエラーにはなりません。

C#
Color color = Color.FromName("NotExistsColor");

この場合、意図した色にならない可能性があるため、IsKnownColorIsNamedColorを使って判定すると安全です。

C#
Color color = Color.FromName("Red");

if (color.IsKnownColor)
{
Console.WriteLine("定義済みの色です。");
}

2-3. Color構造体の主なプロパティ

System.Drawing.Colorには、色の情報を取得するための便利なプロパティがあります。

C#
Color color = Color.FromArgb(128, 255, 100, 50);

int a = color.A;
int r = color.R;
int g = color.G;
int b = color.B;

主なプロパティは次のとおりです。

プロパティ意味
AAlpha値。透明度を表す
RRed値。赤成分を表す
GGreen値。緑成分を表す
BBlue値。青成分を表す
Name色の名前またはARGB値の文字列表現
IsKnownColor定義済み色かどうか
IsNamedColor名前付き色かどうか
IsSystemColorシステムカラーかどうか

たとえば、色のRGB値を表示するには次のように書きます。

C#
Color color = Color.Orange;

Console.WriteLine($"R={color.R}, G={color.G}, B={color.B}");

2-4. 作成したColorをコントロールに設定する方法

Windows Formsでは、多くのコントロールにBackColorForeColorプロパティがあります。

背景色を設定する場合はBackColorを使います。

C#
this.BackColor = Color.White;
panel1.BackColor = Color.LightGray;
button1.BackColor = Color.RoyalBlue;

文字色を設定する場合はForeColorを使います。

C#
label1.ForeColor = Color.Red;
button1.ForeColor = Color.White;
textBox1.ForeColor = Color.DarkBlue;

RGBで作った色も同じように設定できます。

C#
Color customColor = Color.FromArgb(30, 144, 255);
button1.BackColor = customColor;

ユーザーが選択した色をそのまま反映することもできます。

C#
using (ColorDialog dialog = new ColorDialog())
{
if (dialog.ShowDialog() == DialogResult.OK)
{
this.BackColor = dialog.Color;
}
}

3. RGB・ARGBを使った色指定

3-1. RGBとは何か

RGBとは、Red、Green、Blueの3つの色成分で色を表す方法です。

それぞれの値は通常0〜255で指定します。

色成分意味値の範囲
R0〜255
G0〜255
B0〜255

たとえば、赤は次のように表します。

C#
Color red = Color.FromArgb(255, 0, 0);

白はすべての成分が最大です。

C#
Color white = Color.FromArgb(255, 255, 255);

黒はすべての成分が最小です。

C#
Color black = Color.FromArgb(0, 0, 0);

RGBでは、各成分の組み合わせによってさまざまな色を表現できます。

3-2. ARGBとは何か

ARGBとは、Alpha、Red、Green、Blueの4つの成分で色を表す方法です。

RGBに透明度を表すAlpha値を加えたものです。

色成分意味値の範囲
A透明度0〜255
R0〜255
G0〜255
B0〜255

Alpha値は、0に近いほど透明、255に近いほど不透明になります。

C#
Color transparent = Color.FromArgb(0, 255, 0, 0);
Color semiTransparent = Color.FromArgb(128, 255, 0, 0);
Color opaque = Color.FromArgb(255, 255, 0, 0);

ただし、透明度が実際に画面に反映されるかどうかは、設定先のコントロールや描画方法によって異なります。

3-3. RGB値からColorを作成するコード例

RGB値からColorを作成する基本コードは次のとおりです。

C#
int red = 70;
int green = 130;
int blue = 180;

Color color = Color.FromArgb(red, green, blue);

この例では、SteelBlueに近い色を作成しています。

メソッド化すると再利用しやすくなります。

C#
private Color CreateColor(int r, int g, int b)
{
return Color.FromArgb(r, g, b);
}

使い方は次のとおりです。

C#
Color myColor = CreateColor(255, 165, 0);
this.BackColor = myColor;

RGB値が文字列で渡される場合は、数値に変換してから使います。

C#
string rText = "255";
string gText = "100";
string bText = "50";

int r = int.Parse(rText);
int g = int.Parse(gText);
int b = int.Parse(bText);

Color color = Color.FromArgb(r, g, b);

実際のアプリでは、int.Parseよりもint.TryParseを使うと安全です。

C#
if (int.TryParse(rText, out int r) &&
int.TryParse(gText, out int g) &&
int.TryParse(bText, out int b))
{
Color color = Color.FromArgb(r, g, b);
}

3-4. 透明度を含むARGBの指定方法

透明度を指定する場合は、Color.FromArgb(alpha, red, green, blue)を使います。

C#
Color color = Color.FromArgb(128, 255, 0, 0);

これは半透明の赤を表します。

Alpha値の目安は次のとおりです。

Alpha値状態
0完全に透明
64かなり透明
128半透明
192やや透明
255完全に不透明

たとえば、半透明の青を作成する場合は次のように書きます。

C#
Color semiTransparentBlue = Color.FromArgb(128, 0, 0, 255);

既存の色に透明度だけを追加することもできます。

C#
Color baseColor = Color.Blue;
Color transparentBlue = Color.FromArgb(100, baseColor);

この書き方では、元の色のRGB値を維持したままAlpha値だけを変更できます。

3-5. RGB・ARGB指定でよくあるエラーと注意点

RGBやARGBを指定するときによくあるエラーは、値の範囲外指定です。

C#
Color color = Color.FromArgb(300, 0, 0);

このように255を超える値を指定すると、例外が発生します。

安全に使うには、値を0〜255に収める処理を入れるとよいでしょう。

C#
private int ClampColorValue(int value)
{
return Math.Max(0, Math.Min(255, value));
}
C#
int r = ClampColorValue(300);
int g = ClampColorValue(-10);
int b = ClampColorValue(100);

Color color = Color.FromArgb(r, g, b);

また、ARGBの順番を間違えるケースも多いです。

C#
Color color = Color.FromArgb(128, 255, 0, 0);

この場合、順番はA, R, G, Bです。R, G, B, Aではありません。

HTMLカラーコードの#80FF0000のような表記では、ARGBやRGBAの順番がライブラリによって異なることもあります。C#で扱うときは、どの順番で値が並んでいるかを必ず確認しましょう。

4. HTMLカラーコードとC# Colorの変換方法

4-1. HTMLカラーコードとは

HTMLカラーコードとは、Webページなどで使われる色の表記方法です。

代表的な形式は次のとおりです。

#FF0000
#00FF00
#0000FF
#FFFFFF
#000000

#FF0000は赤、#00FF00は緑、#0000FFは青を表します。

HTMLカラーコードは、RGB値を16進数で表したものです。

HTMLカラーコードRGB
#FF0000255, 0, 0
#00FF000, 255, 0
#0000FF0, 0, 255
#FFFFFF255, 255, 255
#0000000, 0, 0

C#では、ColorTranslatorを使うとHTMLカラーコードとColorを簡単に変換できます。

4-2. ColorTranslator.FromHtmlの使い方

HTMLカラーコードからColorを作成するには、ColorTranslator.FromHtmlを使います。

C#
Color color = ColorTranslator.FromHtml("#FF0000");

このコードでは、#FF0000をC#のColorに変換しています。

フォームの背景色に設定する場合は次のように書けます。

C#
this.BackColor = ColorTranslator.FromHtml("#87CEEB");

HTMLで使われる色名も指定できます。

C#
Color color = ColorTranslator.FromHtml("Red");

ただし、入力文字列が不正な場合は例外が発生する可能性があります。そのため、ユーザー入力を扱う場合はtry-catchで囲むと安全です。

C#
try
{
Color color = ColorTranslator.FromHtml(textBox1.Text);
this.BackColor = color;
}
catch (Exception)
{
MessageBox.Show("正しいHTMLカラーコードを入力してください。");
}

4-3. ColorTranslator.ToHtmlの使い方

ColorをHTMLカラーコードに変換するには、ColorTranslator.ToHtmlを使います。

C#
Color color = Color.Red;
string htmlColor = ColorTranslator.ToHtml(color);

Console.WriteLine(htmlColor);

名前付きカラーの場合、Redのような名前で返される場合があります。

C#
Color color = Color.Red;
string html = ColorTranslator.ToHtml(color); // Red

常に#RRGGBB形式で取得したい場合は、自分で16進数文字列を作る方法がおすすめです。

C#
Color color = Color.Red;
string hex = $"#{color.R:X2}{color.G:X2}{color.B:X2}";

Console.WriteLine(hex); // #FF0000

4-4. #FFFFFF形式の文字列をColorに変換する方法

#FFFFFF形式の文字列をColorに変換する基本コードは次のとおりです。

C#
string html = "#FFFFFF";
Color color = ColorTranslator.FromHtml(html);

入力値を検証してから変換する場合は、正規表現を使う方法があります。

C#
using System.Text.RegularExpressions;
C#
private bool IsHtmlColorCode(string value)
{
return Regex.IsMatch(value, "^#[0-9A-Fa-f]{6}$");
}

使い方は次のとおりです。

C#
string input = "#336699";

if (IsHtmlColorCode(input))
{
Color color = ColorTranslator.FromHtml(input);
this.BackColor = color;
}
else
{
MessageBox.Show("#RRGGBB形式で入力してください。");
}

3桁の短縮形式、たとえば#FFFを許可したい場合は、別途変換処理を用意します。

C#
private string NormalizeShortHtmlColor(string value)
{
if (Regex.IsMatch(value, "^#[0-9A-Fa-f]{3}$"))
{
char r = value[1];
char g = value[2];
char b = value[3];

return $"#{r}{r}{g}{g}{b}{b}";
}

return value;
}
C#
string input = "#F0A";
string normalized = NormalizeShortHtmlColor(input);
Color color = ColorTranslator.FromHtml(normalized);

4-5. Colorを16進数カラーコードに変換する方法

Color#RRGGBB形式に変換するには、RGBをそれぞれ2桁の16進数にします。

C#
Color color = Color.FromArgb(255, 128, 64);
string hex = $"#{color.R:X2}{color.G:X2}{color.B:X2}";

Console.WriteLine(hex); // #FF8040

Alpha値も含めて#AARRGGBB形式にしたい場合は、次のようにします。

C#
Color color = Color.FromArgb(128, 255, 0, 0);
string argbHex = $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}";

Console.WriteLine(argbHex); // #80FF0000

逆に#AARRGGBB形式の文字列からColorを作る場合は、次のように変換できます。

C#
private Color FromArgbHex(string hex)
{
hex = hex.Replace("#", "");

if (hex.Length != 8)
{
throw new ArgumentException("#AARRGGBB形式で指定してください。");
}

int a = Convert.ToInt32(hex.Substring(0, 2), 16);
int r = Convert.ToInt32(hex.Substring(2, 2), 16);
int g = Convert.ToInt32(hex.Substring(4, 2), 16);
int b = Convert.ToInt32(hex.Substring(6, 2), 16);

return Color.FromArgb(a, r, g, b);
}
C#
Color color = FromArgbHex("#80FF0000");

5. C#で使える色一覧と名前付きカラー

5-1. KnownColorとは

KnownColorとは、C#で定義済みの色を表す列挙型です。RedBlueWhiteBlackのような一般的な色だけでなく、ControlWindowHighlightのようなシステムカラーも含まれます。

System.Drawing.Colorの定義済みカラーは、KnownColor列挙型の要素として表現されます。Microsoft Learn

C#
KnownColor knownColor = KnownColor.Red;
Color color = Color.FromKnownColor(knownColor);

ColorがKnownColorかどうかは、IsKnownColorで確認できます。

C#
Color color = Color.Red;

if (color.IsKnownColor)
{
Console.WriteLine("KnownColorです。");
}

5-2. Color.RedやColor.Blueなど定番カラー一覧

C#では、よく使う色が静的プロパティとして用意されています。

C#
Color red = Color.Red;
Color blue = Color.Blue;
Color green = Color.Green;
Color white = Color.White;
Color black = Color.Black;

定番カラーの例は次のとおりです。

C#の色名RGBHTMLカラーコード
Color.Black0, 0, 0#000000
Color.White255, 255, 255#FFFFFF
Color.Red255, 0, 0#FF0000
Color.Green0, 128, 0#008000
Color.Blue0, 0, 255#0000FF
Color.Yellow255, 255, 0#FFFF00
Color.Orange255, 165, 0#FFA500
Color.Purple128, 0, 128#800080
Color.Gray128, 128, 128#808080
Color.Transparent255, 255, 255, Alpha 0透明

名前付きカラーを使うと、コードの意味が分かりやすくなります。

C#
label1.ForeColor = Color.DarkRed;
panel1.BackColor = Color.LightYellow;

ただし、細かいデザイン指定が必要な場合は、RGBやHTMLカラーコードで管理したほうが正確です。

5-3. KnownColorを列挙して色一覧を取得する方法

KnownColorを列挙すると、C#で使える名前付きカラーの一覧を取得できます。

C#
foreach (KnownColor knownColor in Enum.GetValues(typeof(KnownColor)))
{
Color color = Color.FromKnownColor(knownColor);
Console.WriteLine($"{knownColor}: R={color.R}, G={color.G}, B={color.B}");
}

Windows Formsのコンボボックスに色名を表示する場合は、次のように書けます。

C#
foreach (KnownColor knownColor in Enum.GetValues(typeof(KnownColor)))
{
comboBox1.Items.Add(knownColor.ToString());
}

選択された色名からColorを作るには、Color.FromNameを使います。

C#
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string colorName = comboBox1.SelectedItem.ToString();
Color color = Color.FromName(colorName);

panel1.BackColor = color;
}

システムカラーを除外して、通常の色だけを表示したい場合は、IsSystemColorで判定します。

C#
foreach (KnownColor knownColor in Enum.GetValues(typeof(KnownColor)))
{
Color color = Color.FromKnownColor(knownColor);

if (!color.IsSystemColor)
{
comboBox1.Items.Add(knownColor.ToString());
}
}

5-4. 名前付きカラーとRGB値の対応表

よく使う名前付きカラーとRGB値の対応は次のとおりです。

名前付きカラーRGBHTML
Black000#000000
White255255255#FFFFFF
Red25500#FF0000
Lime02550#00FF00
Blue00255#0000FF
Yellow2552550#FFFF00
Cyan0255255#00FFFF
Magenta2550255#FF00FF
Silver192192192#C0C0C0
Gray128128128#808080
Maroon12800#800000
Olive1281280#808000
Green01280#008000
Purple1280128#800080
Teal0128128#008080
Navy00128#000080
Orange2551650#FFA500
Pink255192203#FFC0CB
Brown1654242#A52A2A
Gold2552150#FFD700

このような対応表をアプリ内で持っておくと、色選択画面やテーマ設定画面を作るときに便利です。

5-5. WebカラーとC#の名前付き色の違い

WebカラーとC#の名前付き色は似ていますが、完全に同じものとして扱わないほうが安全です。

HTMLでは、redbluewhiteblackなどの色名や#RRGGBB形式のカラーコードが使われます。一方、C#のSystem.Drawing.Colorには、通常の色だけでなく、Windowsのシステムカラーも含まれます。

たとえば、Color.ControlColor.Windowは、アプリやOSのテーマによって見え方が変わる可能性があります。

C#
Color systemColor = Color.Control;

固定色として管理したい場合は、Color.Redのような名前付きカラーや、Color.FromArgbで明示的にRGB値を指定するほうが分かりやすくなります。

C#
Color fixedColor = Color.FromArgb(240, 240, 240);

Webデザインと同じ色を再現したい場合は、HTMLカラーコードを基準にして変換するのがおすすめです。

C#
Color brandColor = ColorTranslator.FromHtml("#1E90FF");

6. Windows FormsでColorを使う方法

6-1. フォームの背景色を変更する方法

Windows Formsでフォームの背景色を変更するには、BackColorプロパティを使います。

C#
this.BackColor = Color.LightBlue;

RGB値で指定する場合は次のように書きます。

C#
this.BackColor = Color.FromArgb(240, 248, 255);

フォームのロード時に設定する例です。

C#
private void Form1_Load(object sender, EventArgs e)
{
this.BackColor = Color.FromArgb(245, 245, 245);
}

ボタンをクリックしたときに背景色を変更することもできます。

C#
private void button1_Click(object sender, EventArgs e)
{
this.BackColor = Color.LightGreen;
}

HTMLカラーコードから設定する場合は、ColorTranslator.FromHtmlを使います。

C#
this.BackColor = ColorTranslator.FromHtml("#F0F8FF");

6-2. ボタンやラベルの文字色を変更する方法

文字色を変更するには、ForeColorプロパティを使います。

C#
label1.ForeColor = Color.Red;
button1.ForeColor = Color.White;

背景色と文字色を組み合わせると、見やすいボタンを作れます。

C#
button1.BackColor = Color.RoyalBlue;
button1.ForeColor = Color.White;
button1.FlatStyle = FlatStyle.Flat;

ラベルの色を状態によって変える例です。

C#
private void SetStatus(bool isError)
{
if (isError)
{
labelStatus.Text = "エラーが発生しました";
labelStatus.ForeColor = Color.Red;
}
else
{
labelStatus.Text = "正常です";
labelStatus.ForeColor = Color.Green;
}
}

入力チェックの結果によってテキストボックスの背景色を変更することもできます。

C#
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(textBox1.Text))
{
textBox1.BackColor = Color.MistyRose;
}
else
{
textBox1.BackColor = Color.White;
}
}

6-3. ColorDialogでユーザーに色を選ばせる方法

Windows Formsでは、ColorDialogを使うと、ユーザーに色を選択してもらえます。

C#
using (ColorDialog dialog = new ColorDialog())
{
if (dialog.ShowDialog() == DialogResult.OK)
{
this.BackColor = dialog.Color;
}
}

選択前の初期色を設定することもできます。

C#
using (ColorDialog dialog = new ColorDialog())
{
dialog.Color = this.BackColor;

if (dialog.ShowDialog() == DialogResult.OK)
{
this.BackColor = dialog.Color;
}
}

フルオープン状態で表示したい場合は、FullOpenを使います。

C#
using (ColorDialog dialog = new ColorDialog())
{
dialog.FullOpen = true;

if (dialog.ShowDialog() == DialogResult.OK)
{
panelPreview.BackColor = dialog.Color;
}
}

選択した色をボタンやラベルに反映することもできます。

C#
private void buttonSelectColor_Click(object sender, EventArgs e)
{
using (ColorDialog dialog = new ColorDialog())
{
if (dialog.ShowDialog() == DialogResult.OK)
{
label1.ForeColor = dialog.Color;
}
}
}

6-4. 選択した色を保存・再利用する方法

選択した色を保存するには、ToArgbで整数値に変換する方法が便利です。

C#
int colorValue = selectedColor.ToArgb();

保存した整数値からColorに戻すには、Color.FromArgbを使います。

C#
Color color = Color.FromArgb(colorValue);

アプリケーション設定に保存する例です。

C#
Properties.Settings.Default.ThemeColor = selectedColor.ToArgb();
Properties.Settings.Default.Save();

次回起動時に読み込む例です。

C#
int savedColor = Properties.Settings.Default.ThemeColor;
this.BackColor = Color.FromArgb(savedColor);

HTMLカラーコードとして保存する方法もあります。

C#
string colorCode = $"#{selectedColor.R:X2}{selectedColor.G:X2}{selectedColor.B:X2}";

読み込むときは次のように変換します。

C#
Color color = ColorTranslator.FromHtml(colorCode);

設定ファイルやJSONに保存する場合は、#RRGGBB形式のほうが人間にも読みやすく、編集しやすいというメリットがあります。

7. WPFでColorを使う方法

7-1. WPFにおけるColorとBrushの関係

WPFでは、Colorそのものを直接UIの背景色や文字色に設定するのではなく、多くの場合Brushを使います。

たとえば、TextBlockの文字色を赤にする場合は次のように書きます。

C#
textBlock1.Foreground = new SolidColorBrush(Colors.Red);

背景色を設定する場合も同様です。

C#
grid1.Background = new SolidColorBrush(Colors.LightBlue);

WPFのSolidColorBrushは、単色のColorで領域を塗りつぶすためのBrushです。Microsoft Learn

つまり、WPFでは次のような関係で考えると分かりやすいです。

Color = 色そのもの
Brush = その色を使って描画するための道具
SolidColorBrush = 単色で塗るBrush

7-2. SolidColorBrushを使った色設定

C#コードでSolidColorBrushを作るには、次のように書きます。

C#
SolidColorBrush brush = new SolidColorBrush(Colors.Blue);

コントロールに設定する例です。

C#
button1.Background = new SolidColorBrush(Colors.RoyalBlue);
button1.Foreground = new SolidColorBrush(Colors.White);

RGB値からWPFのColorを作る場合は、Color.FromRgbを使います。

C#
var color = System.Windows.Media.Color.FromRgb(30, 144, 255);
button1.Background = new SolidColorBrush(color);

透明度を含める場合は、Color.FromArgbを使います。

C#
var color = System.Windows.Media.Color.FromArgb(128, 255, 0, 0);
rectangle1.Fill = new SolidColorBrush(color);

WPFでは、Brushesクラスに定義済みのBrushも用意されています。

C#
label1.Foreground = Brushes.Red;

毎回new SolidColorBrushを書く必要がない場合は、Brushes.Redのような定義済みBrushを使うと簡潔です。

7-3. XAMLで色を指定する方法

WPFでは、XAML上で直接色を指定できます。

XML
<Button Content="OK"
Background="RoyalBlue"
Foreground="White" />

HTMLカラーコードのような形式でも指定できます。

XML
<Button Content="OK"
Background="#4169E1"
Foreground="#FFFFFF" />

透明度を含める場合は、#AARRGGBB形式を使います。

XML
<Rectangle Fill="#80FF0000" Width="200" Height="100" />

リソースとしてBrushを定義しておくと、複数箇所で再利用できます。

XML
<Window.Resources>
<SolidColorBrush x:Key="PrimaryBrush" Color="#4169E1" />
</Window.Resources>

使う側では次のように参照します。

XML
<Button Content="保存"
Background="{StaticResource PrimaryBrush}"
Foreground="White" />

アプリ全体のテーマカラーを管理する場合は、色やBrushをリソース化しておくと保守しやすくなります。

7-4. System.Drawing.Colorとの変換方法

Windows FormsとWPFを併用する場合、System.Drawing.ColorSystem.Windows.Media.Colorを相互変換したいことがあります。

System.Drawing.ColorからSystem.Windows.Media.Colorへ変換する例です。

C#
System.Drawing.Color drawingColor = System.Drawing.Color.FromArgb(128, 255, 0, 0);

System.Windows.Media.Color mediaColor =
System.Windows.Media.Color.FromArgb(
drawingColor.A,
drawingColor.R,
drawingColor.G,
drawingColor.B);

System.Windows.Media.ColorからSystem.Drawing.Colorへ変換する例です。

C#
System.Windows.Media.Color mediaColor = System.Windows.Media.Colors.Blue;

System.Drawing.Color drawingColor =
System.Drawing.Color.FromArgb(
mediaColor.A,
mediaColor.R,
mediaColor.G,
mediaColor.B);

拡張メソッドにしておくと便利です。

C#
public static class ColorExtensions
{
public static System.Windows.Media.Color ToMediaColor(this System.Drawing.Color color)
{
return System.Windows.Media.Color.FromArgb(
color.A,
color.R,
color.G,
color.B);
}

public static System.Drawing.Color ToDrawingColor(this System.Windows.Media.Color color)
{
return System.Drawing.Color.FromArgb(
color.A,
color.R,
color.G,
color.B);
}
}

使い方は次のとおりです。

C#
System.Drawing.Color drawingColor = System.Drawing.Color.Red;
System.Windows.Media.Color mediaColor = drawingColor.ToMediaColor();

7-5. WinFormsとWPFでColorの扱いが異なる点

WinFormsとWPFでは、Colorの扱い方が大きく異なります。

WinFormsでは、多くのコントロールがBackColorForeColorSystem.Drawing.Colorを直接受け取ります。

C#
button1.BackColor = System.Drawing.Color.Blue;
button1.ForeColor = System.Drawing.Color.White;

WPFでは、背景色や文字色にBrushを設定します。

C#
button1.Background = new SolidColorBrush(Colors.Blue);
button1.Foreground = new SolidColorBrush(Colors.White);

この違いにより、WPFで次のように書くとエラーになります。

C#
// WPFではこれは不可
button1.Background = Colors.Blue;

正しくは次のように書きます。

C#
button1.Background = new SolidColorBrush(Colors.Blue);

また、名前空間の違いにも注意が必要です。

C#
System.Drawing.Color
System.Windows.Media.Color

同じファイルで両方を使う場合は、完全修飾名または別名を使って明確にしましょう。

8. C# Colorの変換・比較・判定テクニック

8-1. ColorからRGB値を取得する方法

ColorからRGB値を取得するには、RGBプロパティを使います。

C#
Color color = Color.FromArgb(70, 130, 180);

int r = color.R;
int g = color.G;
int b = color.B;

Console.WriteLine($"R={r}, G={g}, B={b}");

メソッド化する場合は次のように書けます。

C#
private string GetRgbText(Color color)
{
return $"RGB({color.R}, {color.G}, {color.B})";
}
C#
Color color = Color.Orange;
string text = GetRgbText(color);

Console.WriteLine(text);

HTMLカラーコードに変換したい場合は、RGB値を16進数にします。

C#
string html = $"#{color.R:X2}{color.G:X2}{color.B:X2}";

8-2. ColorからARGB値を取得する方法

Alpha値を含めて取得するには、Aプロパティを使います。

C#
Color color = Color.FromArgb(128, 255, 100, 50);

int a = color.A;
int r = color.R;
int g = color.G;
int b = color.B;

Console.WriteLine($"A={a}, R={r}, G={g}, B={b}");

32ビット整数のARGB値を取得するには、ToArgbを使います。

C#
int argb = color.ToArgb();

保存したARGB値からColorに戻すには、Color.FromArgbを使います。

C#
Color restored = Color.FromArgb(argb);

設定保存やデータベース保存では、この方法がシンプルです。

C#
int savedValue = color.ToArgb();
Color loadedColor = Color.FromArgb(savedValue);

8-3. Color同士を比較する方法

Color同士を比較するには、==演算子を使えます。

C#
Color color1 = Color.Red;
Color color2 = Color.Red;

if (color1 == color2)
{
Console.WriteLine("同じ色です。");
}

ただし、名前付きカラーとARGBで作った色では、見た目が同じでも内部情報の違いにより比較結果が期待と異なる場合があります。

C#
Color namedRed = Color.Red;
Color argbRed = Color.FromArgb(255, 255, 0, 0);

Console.WriteLine(namedRed == argbRed);

見た目のRGB値だけで比較したい場合は、ToArgbで比較するのが分かりやすいです。

C#
if (namedRed.ToArgb() == argbRed.ToArgb())
{
Console.WriteLine("ARGB値は同じです。");
}

Alpha値を無視してRGBだけ比較したい場合は、次のようにします。

C#
private bool IsSameRgb(Color c1, Color c2)
{
return c1.R == c2.R &&
c1.G == c2.G &&
c1.B == c2.B;
}

8-4. 透明色かどうかを判定する方法

透明色かどうかを判定するには、Alpha値を確認します。

C#
Color color = Color.FromArgb(0, 255, 0, 0);

if (color.A == 0)
{
Console.WriteLine("完全に透明です。");
}

半透明かどうかを判定する場合は、Alpha値が0より大きく255未満かを確認します。

C#
private bool IsSemiTransparent(Color color)
{
return color.A > 0 && color.A < 255;
}

完全に不透明かどうかは、Alpha値が255かどうかで判定できます。

C#
private bool IsOpaque(Color color)
{
return color.A == 255;
}

Color.Transparentと比較することもできます。

C#
if (color.ToArgb() == Color.Transparent.ToArgb())
{
Console.WriteLine("Transparentと同じARGB値です。");
}

ただし、Color.TransparentはRGB値も持っているため、透明度だけを判定したい場合はA == 0で見るのが分かりやすいです。

8-5. 文字列・数値・Color間の変換方法

文字列、数値、Colorの変換は、実用アプリでよく使います。

HTMLカラーコードからColorへ変換する例です。

C#
Color color = ColorTranslator.FromHtml("#FF6347");

ColorからHTMLカラーコードへ変換する例です。

C#
string html = $"#{color.R:X2}{color.G:X2}{color.B:X2}";

Colorから整数値へ変換する例です。

C#
int value = color.ToArgb();

整数値からColorへ変換する例です。

C#
Color color = Color.FromArgb(value);

色名からColorへ変換する例です。

C#
Color color = Color.FromName("SkyBlue");

Colorから色名を取得する例です。

C#
string name = color.Name;

実用的な変換クラスを作るなら、次のようにまとめられます。

C#
public static class ColorHelper
{
public static string ToHex(Color color)
{
return $"#{color.R:X2}{color.G:X2}{color.B:X2}";
}

public static string ToArgbHex(Color color)
{
return $"#{color.A:X2}{color.R:X2}{color.G:X2}{color.B:X2}";
}

public static Color FromHex(string hex)
{
return ColorTranslator.FromHtml(hex);
}

public static int ToInt(Color color)
{
return color.ToArgb();
}

public static Color FromInt(int value)
{
return Color.FromArgb(value);
}
}

9. C# Colorでよくある疑問とトラブル解決

9-1. System.Drawing.Colorが使えない場合の対処法

System.Drawing.Colorが使えない場合、まず名前空間を確認します。

C#
using System.Drawing;

それでも使えない場合は、プロジェクトにSystem.Drawing.Commonが追加されているか確認します。

.NET CLIでは次のように追加できます。

Bash
dotnet add package System.Drawing.Common

ただし、WPFプロジェクトでColorを使いたい場合は、System.Drawing.ColorではなくSystem.Windows.Media.Colorを使うほうが自然です。

C#
using System.Windows.Media;
C#
Color color = Colors.Red;

名前空間が競合している場合は、完全修飾名を使います。

C#
System.Drawing.Color drawingColor = System.Drawing.Color.Red;
System.Windows.Media.Color mediaColor = System.Windows.Media.Colors.Red;

9-2. .NET Core・.NET 5以降でSystem.Drawingを使う際の注意点

.NET Coreや.NET 5以降でSystem.Drawing.Commonを使う場合は、実行環境に注意が必要です。

特に.NET 6以降では、System.Drawing.CommonはWindows固有のライブラリとして扱われ、Windows以外のOSではコンパイル時の警告や実行時の例外が発生する場合があります。Microsoftの互換性情報でも、.NET 6以降ではSystem.Drawing.CommonがWindows向けであることが説明されています。Microsoft Learn+1

Windows FormsアプリのようにWindows上で動かす前提なら問題になりにくいですが、LinuxサーバーやDocker上で画像処理を行う場合は注意が必要です。

クロスプラットフォームで画像処理を行いたい場合は、次のようなライブラリの利用を検討します。

ImageSharp
SkiaSharp
Microsoft.Maui.Graphics

UIの色管理だけであれば、WinFormsではSystem.Drawing.Color、WPFではSystem.Windows.Media.Colorというように、アプリの種類に合ったColorを使いましょう。

9-3. HTMLカラーコード変換で例外が出る原因

ColorTranslator.FromHtmlで例外が出る主な原因は、入力文字列の形式が不正なことです。

正しい例です。

C#
#FF0000
#FFFFFF
Red
Blue

不正な例です。

C#
FF0000
#GG0000
#12345
red blue

#がない、桁数が違う、16進数ではない文字が含まれている、といった場合はエラーの原因になります。

ユーザー入力を変換する場合は、事前にチェックしましょう。

C#
private bool IsValidHtmlColor(string value)
{
return Regex.IsMatch(value, "^#[0-9A-Fa-f]{6}$");
}
C#
string input = textBox1.Text;

if (IsValidHtmlColor(input))
{
Color color = ColorTranslator.FromHtml(input);
panel1.BackColor = color;
}
else
{
MessageBox.Show("正しい形式で入力してください。例: #FF0000");
}

色名も許可したい場合は、Color.FromNameと組み合わせる方法もあります。

C#
Color color = Color.FromName(input);

if (color.IsKnownColor)
{
panel1.BackColor = color;
}

9-4. 透明度が反映されない原因

Color.FromArgbでAlpha値を指定しているのに透明にならない場合、設定先のコントロールが透明度に対応していない可能性があります。

たとえば、Windows Formsの通常のコントロールでは、BackColorに半透明色を設定しても期待どおりに半透明表示されないことがあります。

C#
panel1.BackColor = Color.FromArgb(128, 255, 0, 0);

このような場合、カスタム描画でGraphicsを使って塗りつぶす方法があります。

C#
private void panel1_Paint(object sender, PaintEventArgs e)
{
using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, 255, 0, 0)))
{
e.Graphics.FillRectangle(brush, panel1.ClientRectangle);
}
}

WPFでは、BrushのOpacityを使う方法もあります。

C#
SolidColorBrush brush = new SolidColorBrush(Colors.Red);
brush.Opacity = 0.5;

rectangle1.Fill = brush;

透明度が反映されないときは、Colorの指定が間違っているのではなく、描画先の仕組みがAlpha値をどう扱うかを確認することが重要です。

9-5. ColorとBrushを間違えたときの対処法

WPFでよくあるエラーが、Colorを指定すべきところとBrushを指定すべきところの混同です。

間違った例です。

C#
button1.Background = Colors.Red;

BackgroundBrush型なので、Colorを直接設定できません。

正しい例です。

C#
button1.Background = new SolidColorBrush(Colors.Red);

または、定義済みBrushを使います。

C#
button1.Background = Brushes.Red;

XAMLでは次のように書けば、自動的にBrushとして解釈されます。

XML
<Button Background="Red" />

C#コードで書く場合は、ColorBrushの違いを意識する必要があります。

Color: 色そのもの
Brush: 色やグラデーションで描画するためのオブジェクト

WPFで背景色や文字色を変更するときは、基本的にBrushを設定すると覚えておきましょう。

10. C# Colorの実用サンプルコード集

10-1. ランダムな色を生成するサンプル

ランダムな色を生成するには、Randomで0〜255の値を作り、Color.FromArgbに渡します。

C#
private readonly Random _random = new Random();

private Color CreateRandomColor()
{
int r = _random.Next(256);
int g = _random.Next(256);
int b = _random.Next(256);

return Color.FromArgb(r, g, b);
}

ボタンをクリックするたびにフォームの背景色を変える例です。

C#
private void buttonRandomColor_Click(object sender, EventArgs e)
{
this.BackColor = CreateRandomColor();
}

透明度もランダムにする場合は、Alpha値も指定します。

C#
private Color CreateRandomArgbColor()
{
int a = _random.Next(256);
int r = _random.Next(256);
int g = _random.Next(256);
int b = _random.Next(256);

return Color.FromArgb(a, r, g, b);
}

ただし、UIの背景色に完全なランダム色を使うと文字が読みにくくなることがあります。実用アプリでは、明度やコントラストも考慮しましょう。

10-2. RGBスライダーで色を変更するサンプル

Windows FormsでRGBスライダーを使って色を変更する例です。

フォームに次のコントロールがあるとします。

trackBarRed
trackBarGreen
trackBarBlue
panelPreview
labelRgb

初期設定です。

C#
private void Form1_Load(object sender, EventArgs e)
{
trackBarRed.Minimum = 0;
trackBarRed.Maximum = 255;

trackBarGreen.Minimum = 0;
trackBarGreen.Maximum = 255;

trackBarBlue.Minimum = 0;
trackBarBlue.Maximum = 255;

UpdatePreviewColor();
}

色を更新するメソッドです。

C#
private void UpdatePreviewColor()
{
int r = trackBarRed.Value;
int g = trackBarGreen.Value;
int b = trackBarBlue.Value;

Color color = Color.FromArgb(r, g, b);

panelPreview.BackColor = color;
labelRgb.Text = $"RGB({r}, {g}, {b})";
}

各TrackBarのScrollイベントで呼び出します。

C#
private void trackBarRed_Scroll(object sender, EventArgs e)
{
UpdatePreviewColor();
}

private void trackBarGreen_Scroll(object sender, EventArgs e)
{
UpdatePreviewColor();
}

private void trackBarBlue_Scroll(object sender, EventArgs e)
{
UpdatePreviewColor();
}

HTMLカラーコードも表示したい場合は、次のように追加します。

C#
string hex = $"#{r:X2}{g:X2}{b:X2}";
labelRgb.Text = $"RGB({r}, {g}, {b}) {hex}";

10-3. HTMLカラーコード入力から背景色を変えるサンプル

テキストボックスに入力されたHTMLカラーコードから背景色を変更する例です。

C#
private void buttonApplyColor_Click(object sender, EventArgs e)
{
string input = textBoxColorCode.Text.Trim();

try
{
Color color = ColorTranslator.FromHtml(input);
this.BackColor = color;
}
catch
{
MessageBox.Show("正しいHTMLカラーコードを入力してください。例: #FF0000");
}
}

入力チェックを追加すると、より親切です。

C#
private bool IsValidHexColor(string value)
{
return Regex.IsMatch(value, "^#[0-9A-Fa-f]{6}$");
}
C#
private void buttonApplyColor_Click(object sender, EventArgs e)
{
string input = textBoxColorCode.Text.Trim();

if (!IsValidHexColor(input))
{
MessageBox.Show("#RRGGBB形式で入力してください。例: #336699");
return;
}

Color color = ColorTranslator.FromHtml(input);
this.BackColor = color;
}

色名も許可する場合は、次のようにできます。

C#
private void buttonApplyColor_Click(object sender, EventArgs e)
{
string input = textBoxColorCode.Text.Trim();

try
{
Color color = ColorTranslator.FromHtml(input);
panelPreview.BackColor = color;
}
catch
{
MessageBox.Show("色名または#RRGGBB形式で入力してください。");
}
}

10-4. 色一覧をコンボボックスに表示するサンプル

KnownColorを使って、色一覧をコンボボックスに表示するサンプルです。

C#
private void Form1_Load(object sender, EventArgs e)
{
foreach (KnownColor knownColor in Enum.GetValues(typeof(KnownColor)))
{
Color color = Color.FromKnownColor(knownColor);

if (!color.IsSystemColor)
{
comboBoxColors.Items.Add(knownColor.ToString());
}
}
}

選択された色をプレビューに反映します。

C#
private void comboBoxColors_SelectedIndexChanged(object sender, EventArgs e)
{
string colorName = comboBoxColors.SelectedItem.ToString();
Color color = Color.FromName(colorName);

panelPreview.BackColor = color;
}

色名とHTMLカラーコードを表示する場合は、次のようにします。

C#
private void comboBoxColors_SelectedIndexChanged(object sender, EventArgs e)
{
string colorName = comboBoxColors.SelectedItem.ToString();
Color color = Color.FromName(colorName);

panelPreview.BackColor = color;

string hex = $"#{color.R:X2}{color.G:X2}{color.B:X2}";
labelColorInfo.Text = $"{colorName} / {hex}";
}

より本格的にするなら、コンボボックスに色見本を描画するカスタム描画も可能です。

10-5. 選択色を設定ファイルに保存するサンプル

選択した色をアプリ設定に保存する場合は、ARGB整数として保存する方法が簡単です。

まず、色を選択します。

C#
private Color _selectedColor = Color.White;

private void buttonSelectColor_Click(object sender, EventArgs e)
{
using (ColorDialog dialog = new ColorDialog())
{
dialog.Color = _selectedColor;

if (dialog.ShowDialog() == DialogResult.OK)
{
_selectedColor = dialog.Color;
panelPreview.BackColor = _selectedColor;
}
}
}

保存ボタンで設定に保存します。

C#
private void buttonSave_Click(object sender, EventArgs e)
{
Properties.Settings.Default.SelectedColor = _selectedColor.ToArgb();
Properties.Settings.Default.Save();

MessageBox.Show("色を保存しました。");
}

起動時に読み込みます。

C#
private void Form1_Load(object sender, EventArgs e)
{
int savedColorValue = Properties.Settings.Default.SelectedColor;
_selectedColor = Color.FromArgb(savedColorValue);

panelPreview.BackColor = _selectedColor;
}

JSONなどに保存する場合は、HTMLカラーコード形式もおすすめです。

C#
public class AppSettings
{
public string ThemeColor { get; set; } = "#FFFFFF";
}
C#
AppSettings settings = new AppSettings
{
ThemeColor = $"#{_selectedColor.R:X2}{_selectedColor.G:X2}{_selectedColor.B:X2}"
};

読み込むときは次のようにします。

C#
Color color = ColorTranslator.FromHtml(settings.ThemeColor);

11. C# Colorを扱うときのベストプラクティス

11-1. 用途に応じてColorクラスを使い分ける

C#では、アプリの種類に応じて適切なColorを使い分けることが重要です。

Windows Formsでは、基本的にSystem.Drawing.Colorを使います。

C#
this.BackColor = System.Drawing.Color.White;

WPFでは、System.Windows.Media.ColorBrushを使います。

C#
button1.Background = new SolidColorBrush(Colors.Blue);

Webカラーコードを扱う場合は、ColorTranslatorや独自の変換メソッドを使います。

C#
Color color = ColorTranslator.FromHtml("#336699");

画像処理やクロスプラットフォーム用途では、System.Drawing.Commonの対応環境に注意し、必要に応じて別ライブラリを検討します。

用途に合わないColor型を無理に使うと、変換処理が増えたり、名前空間の競合が起きたり、環境依存の問題が発生しやすくなります。

11-2. マジックナンバーを避けて色定義を管理する

次のように、コード中にRGB値を直接書き続けると、後から見たときに何の色か分かりにくくなります。

C#
button1.BackColor = Color.FromArgb(33, 150, 243);
label1.ForeColor = Color.FromArgb(244, 67, 54);

このような値は、定数や専用クラスにまとめるのがおすすめです。

C#
public static class AppColors
{
public static readonly Color Primary = Color.FromArgb(33, 150, 243);
public static readonly Color Danger = Color.FromArgb(244, 67, 54);
public static readonly Color Success = Color.FromArgb(76, 175, 80);
public static readonly Color Warning = Color.FromArgb(255, 193, 7);
}

使う側は次のように書けます。

C#
buttonSave.BackColor = AppColors.Primary;
buttonDelete.BackColor = AppColors.Danger;

色の意味を名前で表せるため、保守性が上がります。

C#
labelStatus.ForeColor = AppColors.Success;

ブランドカラーやテーマカラーも、1箇所で管理しておくと変更が簡単です。

11-3. UIテーマやダークモードを考慮する

アプリの色を固定値だけで決めると、ダークモードやハイコントラスト環境で見づらくなる場合があります。

たとえば、白背景に薄いグレー文字を使うと通常テーマでは問題なくても、テーマ変更時に読みづらくなることがあります。

C#
label1.ForeColor = Color.LightGray;

テーマ対応を考えるなら、用途ごとに色を定義します。

C#
public class ThemeColors
{
public Color Background { get; set; }
public Color Text { get; set; }
public Color Primary { get; set; }
public Color Border { get; set; }
}

ライトテーマとダークテーマを分ける例です。

C#
public static ThemeColors LightTheme = new ThemeColors
{
Background = Color.White,
Text = Color.Black,
Primary = Color.RoyalBlue,
Border = Color.LightGray
};

public static ThemeColors DarkTheme = new ThemeColors
{
Background = Color.FromArgb(32, 32, 32),
Text = Color.White,
Primary = Color.DeepSkyBlue,
Border = Color.Gray
};

適用処理を用意しておくと、テーマ切り替えが簡単になります。

C#
private void ApplyTheme(ThemeColors theme)
{
this.BackColor = theme.Background;
label1.ForeColor = theme.Text;
button1.BackColor = theme.Primary;
}

UIでは、背景色と文字色のコントラストを十分に確保することも大切です。

11-4. 保守しやすいカラー管理クラスの作り方

アプリ全体で色を管理する場合は、カラー管理クラスを作ると便利です。

C#
public static class ColorManager
{
public static Color Primary => ColorTranslator.FromHtml("#1976D2");
public static Color PrimaryDark => ColorTranslator.FromHtml("#0D47A1");
public static Color Accent => ColorTranslator.FromHtml("#FFC107");
public static Color Error => ColorTranslator.FromHtml("#D32F2F");
public static Color Background => ColorTranslator.FromHtml("#FAFAFA");
public static Color Text => ColorTranslator.FromHtml("#212121");
}

使う側では、具体的なRGB値やHTMLカラーコードを意識せずに済みます。

C#
buttonSave.BackColor = ColorManager.Primary;
buttonSave.ForeColor = Color.White;

labelError.ForeColor = ColorManager.Error;
this.BackColor = ColorManager.Background;

WPFの場合は、Brushも合わせて管理できます。

C#
public static class WpfBrushManager
{
public static SolidColorBrush Primary =>
new SolidColorBrush(System.Windows.Media.Color.FromRgb(25, 118, 210));

public static SolidColorBrush Error =>
new SolidColorBrush(System.Windows.Media.Color.FromRgb(211, 47, 47));
}

ただし、WPFではBrushをリソースとしてXAMLに定義する方法も一般的です。

XML
<SolidColorBrush x:Key="PrimaryBrush" Color="#1976D2" />
<SolidColorBrush x:Key="ErrorBrush" Color="#D32F2F" />

色を一元管理すると、デザイン変更、テーマ変更、ブランドカラー変更に強いアプリになります。

まとめ

C#のColorは、UIの見た目を制御するうえで非常に重要な型です。Windows FormsではSystem.Drawing.Color、WPFではSystem.Windows.Media.ColorBrushを中心に使います。

RGBで色を指定する場合は、Color.FromArgb(r, g, b)を使います。透明度を含める場合は、Color.FromArgb(a, r, g, b)を使い、Alpha値を0〜255で指定します。

HTMLカラーコードとの変換には、ColorTranslator.FromHtmlColorTranslator.ToHtmlが便利です。ただし、常に#RRGGBB形式で出力したい場合は、$"#{color.R:X2}{color.G:X2}{color.B:X2}"のように自分で16進数文字列を作る方法が確実です。

名前付きカラーを使う場合は、Color.RedColor.BlueColor.Whiteなどを利用できます。さらにKnownColorを列挙すれば、C#で使える色一覧を取得できます。

WinFormsとWPFではColorの扱いが異なるため、System.Drawing.ColorSystem.Windows.Media.Colorを混同しないことが大切です。特にWPFでは、背景色や文字色にColorを直接設定するのではなく、SolidColorBrushBrushesを使います。

また、.NET 6以降でSystem.Drawing.CommonをWindows以外の環境で使う場合は、対応状況に注意が必要です。クロスプラットフォームの画像処理では、用途に応じて別のライブラリを検討しましょう。

C# Colorを正しく扱えるようになると、UIデザイン、テーマ切り替え、色選択機能、画像処理、設定保存など、さまざまな場面で柔軟な実装ができるようになります。