C#でRGBカラーを扱う方法|Color変換・16進数・画像処理まで初心者向けに解説

はじめに

C#で画面の背景色を変えたり、ボタンの文字色を指定したり、画像のピクセルを加工したりするときによく登場するのがRGBカラーです。

RGBは、赤・緑・青の3つの値を組み合わせて色を表す仕組みです。C#では、WinForms、WPF、.NET MAUI、画像処理など、さまざまな場面でRGBを扱います。ただし、同じ「Color」という名前でも、System.Drawing.ColorSystem.Windows.Media.ColorMicrosoft.Maui.Graphics.Color のように種類が分かれているため、初心者のうちは混乱しやすいポイントでもあります。

この記事では、C#でRGBカラーを扱う方法を、基礎から実践コードまで順番に解説します。RGB値からColorを作る方法、ColorからRGB値を取り出す方法、16進数カラーコードとの変換、UIへの反映、画像処理でのRGB操作まで、実務でよく使うパターンをまとめて確認していきましょう。

1. C#でRGBカラーを扱う前に知っておきたい基礎

1-1. RGBとは?Red・Green・Blueで色を表す仕組み

RGBとは、Red、Green、Blueの頭文字を取った色の表現方法です。日本語では「赤・緑・青」の3色を組み合わせて色を作る方式と考えるとわかりやすいです。

コンピューターの画面では、多くの色がこのRGBの組み合わせで表現されます。たとえば、赤を強くして緑と青を弱くすれば赤色になり、赤・緑・青をすべて最大にすると白になります。

C#でRGBを扱う場合も、基本的には次の3つの値を指定します。

C#
int red = 255;
int green = 0;
int blue = 0;

この例では、赤が最大、緑と青が0なので、結果は赤色になります。

1-2. C#で色を扱う主な場面|画面表示・UI・画像処理

C#でRGBカラーを扱う場面は多くあります。代表的なのは、アプリのUIデザインです。

たとえば、WinFormsではフォームやボタンの背景色にRGBカラーを設定できます。WPFでは、SolidColorBrush を使って背景色や文字色を指定します。.NET MAUIでは、Microsoft.Maui.Graphics.Color を使ってクロスプラットフォームアプリの色を扱います。

また、画像処理でもRGBは重要です。画像の1ピクセルごとの色を取得したり、赤みを強くしたり、グレースケールに変換したり、特定の色だけを抽出したりするときにRGB値を操作します。

つまり、C#でRGBを理解しておくと、画面デザインと画像処理の両方で応用できるようになります。

1-3. RGB値の範囲は0〜255|白・黒・赤・緑・青の例

一般的なRGB値は、それぞれ0〜255の範囲で表します。0はその色成分がまったくない状態、255はその色成分が最大の状態です。

代表的な色は次のようになります。

C#
// 黒
R = 0, G = 0, B = 0

// 白
R = 255, G = 255, B = 255

// 赤
R = 255, G = 0, B = 0

// 緑
R = 0, G = 255, B = 0

// 青
R = 0, G = 0, B = 255

// 黄色
R = 255, G = 255, B = 0

// グレー
R = 128, G = 128, B = 128

C#の System.Drawing.Color.FromArgb でも、赤・緑・青の各成分は8ビット、つまり0〜255の範囲で扱われます。Color.FromArgb(int red, int green, int blue) を使うと、Alpha値は255、つまり完全に不透明な色として作成されます。Microsoft Learn+1

1-4. RGBとARGBの違い|Alpha値による透明度の考え方

RGBは、Red、Green、Blueの3成分で色を表します。一方、ARGBは、Alpha、Red、Green、Blueの4成分で色を表します。

Alphaは透明度を表す値です。C#では多くの場合、Alphaも0〜255で表します。

C#
A = 255 // 完全に不透明
A = 128 // 半透明
A = 0 // 完全に透明

たとえば、半透明の赤を作る場合は、次のようにAlpha値を指定します。

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

ただし、透明度が実際に画面へ反映されるかどうかは、使用しているUIフレームワークや描画対象の設定によって変わります。Alphaを指定したのに透明にならない場合は、コントロール側や描画先が透明度をサポートしているかも確認しましょう。

1-5. C#で使う代表的なColor型|System.Drawing.ColorとWPFのColor

C#で「Color」と書くときは、どの名前空間のColorを使っているかに注意が必要です。

WinFormsや Bitmap を使った画像処理では、主に System.Drawing.Color を使います。

C#
using System.Drawing;

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

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

C#
using System.Windows.Media;

Color color = Color.FromRgb(255, 0, 0);

WPFで画面に色を塗る場合は、Colorそのものではなく、SolidColorBrush のようなBrushを使うことが多いです。WPFでは、アルファ・赤・緑・青の値や16進数表記を使って単色を表現できます。Microsoft Learn+1

.NET MAUIでは、Microsoft.Maui.Graphics.Color を使います。.NET MAUIのColorクラスはRGB、HSL、HSV、色名、Alphaチャンネルなどを扱えます。Microsoft Learn+1

C#
using Microsoft.Maui.Graphics;

Color color = Color.FromRgb(255, 0, 0);

同じ Color という名前でも型が違うため、WinForms、WPF、MAUIをまたいでコードを書くときは、名前空間の違いを意識しましょう。

2. C#でRGB値からColorを作成する方法

2-1. Color.FromArgbでRGBカラーを作る基本コード

WinFormsや System.Drawing を使う場合、RGB値からColorを作るには Color.FromArgb を使います。

C#
using System.Drawing;

Color red = Color.FromArgb(255, 0, 0);
Color green = Color.FromArgb(0, 255, 0);
Color blue = Color.FromArgb(0, 0, 255);

3つの引数を指定する場合は、順番が red, green, blue です。

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

メソッド名は FromArgb ですが、3引数で呼び出した場合はAlpha値を省略しており、Alphaは255として扱われます。つまり完全に不透明な色になります。Microsoft Learn

2-2. Alpha値を指定して半透明カラーを作る方法

透明度を指定したい場合は、4つの引数を指定します。

C#
using System.Drawing;

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

4つの引数の順番は、alpha, red, green, blue です。

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

RGBだけを考えていると、最初の引数を赤だと勘違いしやすいので注意しましょう。

C#
// 間違えやすい例
// Color.FromArgb(255, 0, 0, 128)
// ↑ alpha=255, red=0, green=0, blue=128 なので半透明の赤ではなく、不透明な青系になる

半透明の赤にしたい場合は、Alphaを先頭に置きます。

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

2-3. RGB値を変数で管理してColorに変換する方法

実際のアプリでは、RGB値を固定値で書くよりも、変数として管理することが多いです。

C#
using System.Drawing;

int r = 64;
int g = 128;
int b = 255;

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

ユーザー入力や設定ファイルからRGB値を受け取る場合も同じです。

C#
int red = int.Parse(textBoxRed.Text);
int green = int.Parse(textBoxGreen.Text);
int blue = int.Parse(textBoxBlue.Text);

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

ただし、このコードでは入力値が数値でない場合や、0〜255の範囲を超えた場合にエラーが起きる可能性があります。実務では、int.TryParse と範囲チェックを組み合わせるのがおすすめです。

C#
bool success =
int.TryParse(textBoxRed.Text, out int red) &&
int.TryParse(textBoxGreen.Text, out int green) &&
int.TryParse(textBoxBlue.Text, out int blue);

if (success &&
red >= 0 && red <= 255 &&
green >= 0 && green <= 255 &&
blue >= 0 && blue <= 255)
{
Color color = Color.FromArgb(red, green, blue);
}
else
{
MessageBox.Show("RGB値は0〜255の数値で入力してください。");
}

2-4. RGB値が0〜255を超えたときの注意点

Color.FromArgb に渡すRGB値は0〜255の範囲に収める必要があります。範囲外の値を渡すと例外が発生するため、外部入力を扱う場合は必ずチェックしましょう。

たとえば、次のような値は不正です。

C#
Color color1 = Color.FromArgb(300, 0, 0);  // 300は範囲外
Color color2 = Color.FromArgb(-1, 0, 0); // -1は範囲外

安全に扱うには、値を0〜255に丸める関数を用意しておくと便利です。

C#
static int ClampRgb(int value)
{
if (value < 0) return 0;
if (value > 255) return 255;
return value;
}

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

C#
int r = ClampRgb(inputRed);
int g = ClampRgb(inputGreen);
int b = ClampRgb(inputBlue);

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

C#の新しい書き方に慣れている場合は、Math.Clamp も使えます。

C#
int r = Math.Clamp(inputRed, 0, 255);
int g = Math.Clamp(inputGreen, 0, 255);
int b = Math.Clamp(inputBlue, 0, 255);

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

2-5. WinForms・WPF・MAUIでのColor指定の違い

C#でRGBカラーを指定するときは、フレームワークごとの違いに注意しましょう。

WinFormsでは System.Drawing.Color を使います。

C#
using System.Drawing;

this.BackColor = Color.FromArgb(240, 240, 240);
button1.ForeColor = Color.FromArgb(255, 0, 0);

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

C#
using System.Windows.Media;

var color = Color.FromRgb(240, 240, 240);
this.Background = new SolidColorBrush(color);

.NET MAUIでは Microsoft.Maui.Graphics.Color を使います。Color.FromRgb(byte red, byte green, byte blue) のようにRGB値からColorを作成できます。Microsoft Learn

C#
using Microsoft.Maui.Graphics;

var color = Color.FromRgb(240, 240, 240);

RGB値の考え方は同じですが、使うColor型やUIへ反映する方法が異なります。特に、using System.Drawing;using System.Windows.Media; を同時に書いていると Color が曖昧になることがあるため、必要に応じて完全修飾名を使いましょう。

C#
System.Drawing.Color winFormsColor = System.Drawing.Color.FromArgb(255, 0, 0);
System.Windows.Media.Color wpfColor = System.Windows.Media.Color.FromRgb(255, 0, 0);

3. C#でColorからRGB値を取得する方法

3-1. Color.R・Color.G・Color.Bで各成分を取り出す

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

C#
using System.Drawing;

Color color = Color.FromArgb(64, 128, 255);

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

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

出力結果は次のようになります。

R=64, G=128, B=255

R は赤、G は緑、B は青を表します。画像処理やデバッグでは、この3つの値を取り出して計算することがよくあります。

3-2. Color.Aで透明度を取得する

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

C#
using System.Drawing;

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

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}");

出力結果は次のとおりです。

A=128, R=255, G=0, B=0

Alpha値が255なら完全に不透明、0なら完全に透明、128ならおおよそ半透明です。

3-3. ToArgbで整数値に変換する方法

Color.ToArgb を使うと、Colorを1つの整数値に変換できます。ARGB形式の整数値として保持したい場合に便利です。

C#
using System.Drawing;

Color color = Color.FromArgb(255, 64, 128, 255);

int argb = color.ToArgb();

Console.WriteLine(argb);
Console.WriteLine(argb.ToString("X8"));

ToString("X8") を使うと、8桁の16進数として確認できます。

FF4080FF

この場合、FF がAlpha、40 がRed、80 がGreen、FF がBlueです。

3-4. ARGBの整数値からRGBを分解する方法

ARGBの整数値から各成分を取り出すには、ビットシフトを使います。

C#
int argb = color.ToArgb();

int a = (argb >> 24) & 0xFF;
int r = (argb >> 16) & 0xFF;
int g = (argb >> 8) & 0xFF;
int b = argb & 0xFF;

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

ビット演算に慣れていない場合は難しく見えるかもしれませんが、ARGBの整数値は次のような並びだと考えると理解しやすくなります。

AARRGGBB

つまり、上位から順にAlpha、Red、Green、Blueが並んでいます。

また、ARGB整数値からColorへ戻す場合は、Color.FromArgb(int argb) を使えます。

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

3-5. デバッグ時にRGB値を確認しやすくする出力例

RGB値をデバッグしやすくするには、文字列に整形して出力する関数を作っておくと便利です。

C#
using System.Drawing;

static string ToRgbString(Color color)
{
return $"R={color.R}, G={color.G}, B={color.B}";
}

Alphaも含めたい場合は、次のようにします。

C#
static string ToArgbString(Color color)
{
return $"A={color.A}, R={color.R}, G={color.G}, B={color.B}";
}

16進数も一緒に表示すると、Webカラーコードとの比較がしやすくなります。

C#
static string ToDebugColorString(Color color)
{
return $"A={color.A}, R={color.R}, G={color.G}, B={color.B}, Hex=#{color.R:X2}{color.G:X2}{color.B:X2}";
}

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

C#
Color color = Color.FromArgb(64, 128, 255);
Console.WriteLine(ToDebugColorString(color));

出力例です。

A=255, R=64, G=128, B=255, Hex=#4080FF

4. C#でRGBと16進数カラーコードを変換する方法

4-1. RGBを#RRGGBB形式の16進数に変換する

Webデザインなどでよく使われる #RRGGBB 形式のカラーコードは、RGB値を16進数に変換したものです。

たとえば、RGBが R=255, G=128, B=0 の場合、16進数では次のようになります。

#FF8000

C#では、文字列補間と X2 書式を使うと簡単に変換できます。

C#
int r = 255;
int g = 128;
int b = 0;

string hex = $"#{r:X2}{g:X2}{b:X2}";

Console.WriteLine(hex);

出力結果です。

#FF8000

X2 は、16進数を2桁で表示する指定です。たとえば10は 0A になります。

Color型から直接変換する場合は次のように書けます。

C#
using System.Drawing;

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

4-2. #RRGGBBからRGB値に変換する

#RRGGBB 形式の文字列からRGB値を取り出すには、文字列を分割して16進数として変換します。

C#
using System;
using System.Globalization;
using System.Drawing;

static Color FromHexRgb(string hex)
{
if (string.IsNullOrWhiteSpace(hex))
{
throw new ArgumentException("カラーコードが空です。", nameof(hex));
}

hex = hex.Trim();

if (hex.StartsWith("#"))
{
hex = hex.Substring(1);
}

if (hex.Length != 6)
{
throw new ArgumentException("カラーコードは#RRGGBB形式で指定してください。", nameof(hex));
}

int r = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);

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

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

C#
Color color = FromHexRgb("#FF8000");

Console.WriteLine(color.R); // 255
Console.WriteLine(color.G); // 128
Console.WriteLine(color.B); // 0

ユーザー入力を扱う場合は、int.Parse ではなく int.TryParse を使うと、変換失敗時に安全に処理できます。

4-3. #AARRGGBB形式で透明度も扱う方法

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

#80FF0000

この例では、Alphaが 80、Redが FF、Greenが 00、Blueが 00 です。つまり半透明の赤を表します。

C#で #AARRGGBB をColorに変換する例です。

C#
using System;
using System.Globalization;
using System.Drawing;

static Color FromHexArgb(string hex)
{
if (string.IsNullOrWhiteSpace(hex))
{
throw new ArgumentException("カラーコードが空です。", nameof(hex));
}

hex = hex.Trim();

if (hex.StartsWith("#"))
{
hex = hex.Substring(1);
}

if (hex.Length != 8)
{
throw new ArgumentException("カラーコードは#AARRGGBB形式で指定してください。", nameof(hex));
}

int a = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
int r = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(6, 2), NumberStyles.HexNumber);

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

Colorから #AARRGGBB に変換する場合は、次のように書きます。

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

4-4. ColorTranslator.FromHtmlでHTMLカラーコードをColorに変換する

System.Drawing.ColorTranslator.FromHtml を使うと、HTMLカラー表現を System.Drawing.Color に変換できます。このメソッドはHTMLの色表現をGDI+のColor構造体へ変換するためのものです。Microsoft Learn+1

C#
using System.Drawing;

Color color1 = ColorTranslator.FromHtml("#FF8000");
Color color2 = ColorTranslator.FromHtml("Red");

Console.WriteLine(color1.R); // 255
Console.WriteLine(color1.G); // 128
Console.WriteLine(color1.B); // 0

自分で16進数を分解する処理を書かなくてもよいので、HTMLカラーコードを扱うだけなら便利です。

ただし、入力文字列が不正な場合は例外が発生する可能性があります。ユーザー入力をそのまま変換する場合は、try-catchで囲むか、事前に形式をチェックしましょう。

C#
try
{
Color color = ColorTranslator.FromHtml(inputText);
}
catch (Exception)
{
MessageBox.Show("カラーコードの形式が正しくありません。");
}

4-5. ColorTranslator.ToHtmlでColorを16進数文字列に変換する

ColorTranslator.ToHtml を使うと、ColorをHTMLカラー文字列へ変換できます。ColorTranslator クラスには、HTML色表現との相互変換を行うメソッドが用意されています。Microsoft Learn+1

C#
using System.Drawing;

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

string html = ColorTranslator.ToHtml(color);

Console.WriteLine(html);

出力は、色によって #FF8000 のような16進数になることもあれば、既知の色名になることもあります。

常に #RRGGBB 形式で取得したい場合は、自分で次のように変換したほうが確実です。

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

4-6. 3桁カラーコードや不正な文字列を扱うときの注意点

Webでは、#FFF#0F0 のような3桁カラーコードが使われることがあります。これは、各桁を2回繰り返して6桁に展開する表記です。

#FFF → #FFFFFF
#0F0 → #00FF00
#F80 → #FF8800

自作の変換関数で3桁カラーコードにも対応したい場合は、次のように展開します。

C#
static string NormalizeHexColor(string hex)
{
if (string.IsNullOrWhiteSpace(hex))
{
throw new ArgumentException("カラーコードが空です。", nameof(hex));
}

hex = hex.Trim();

if (hex.StartsWith("#"))
{
hex = hex.Substring(1);
}

if (hex.Length == 3)
{
hex = new string(new[]
{
hex[0], hex[0],
hex[1], hex[1],
hex[2], hex[2]
});
}

if (hex.Length != 6)
{
throw new ArgumentException("カラーコードは#RGBまたは#RRGGBB形式で指定してください。", nameof(hex));
}

return hex;
}

不正な文字列への対策も重要です。

#GGGGGG
redblue
12345
空文字
null

このような値が入力される可能性がある場合は、変換前に形式を検証しましょう。

C#
using System.Text.RegularExpressions;

static bool IsHexRgb(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return false;
}

return Regex.IsMatch(value, "^#?[0-9a-fA-F]{6}$");
}

5. C#でRGBカラーをUIに反映する方法

5-1. WinFormsのBackColor・ForeColorにRGBカラーを設定する

WinFormsでは、コントロールの背景色を BackColor、文字色を ForeColor で指定します。

C#
using System.Drawing;

this.BackColor = Color.FromArgb(240, 240, 240);

button1.BackColor = Color.FromArgb(0, 120, 215);
button1.ForeColor = Color.White;

label1.ForeColor = Color.FromArgb(255, 0, 0);

フォーム全体の背景色を変えたい場合は、フォーム自身の BackColor を変更します。

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

ボタンの色を変更したい場合は、ボタンの BackColor を設定します。

C#
private void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.FromArgb(255, 128, 0);
}

5-2. WPFのBrushにRGBカラーを設定する

WPFでは、背景色や文字色に直接Colorを設定するのではなく、Brushを使う場面が多いです。単色の場合は SolidColorBrush を使います。WPFでは、定義済みブラシを使う方法と、ARGB値を指定して SolidColorBrush を作る方法があります。Microsoft Learn+1

C#
using System.Windows.Media;

this.Background = new SolidColorBrush(Color.FromRgb(240, 240, 240));

button1.Background = new SolidColorBrush(Color.FromRgb(0, 120, 215));
button1.Foreground = new SolidColorBrush(Colors.White);

label1.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0));

Alpha値を指定する場合は、Color.FromArgb を使います。

C#
var color = Color.FromArgb(128, 255, 0, 0);
var brush = new SolidColorBrush(color);

rectangle1.Fill = brush;

XAMLで指定する場合は、次のように書けます。

XML
<Button Background="#0078D7" Foreground="White" Content="保存" />

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

XML
<Rectangle Fill="#80FF0000" />

5-3. ボタン・ラベル・フォーム背景色を変更するサンプル

WinFormsで、フォーム、ボタン、ラベルの色をまとめて変更するサンプルです。

C#
using System;
using System.Drawing;
using System.Windows.Forms;

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

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

button1.BackColor = Color.FromArgb(0, 120, 215);
button1.ForeColor = Color.White;

label1.ForeColor = Color.FromArgb(64, 64, 64);
label1.Text = "RGBカラーを設定しました";
}
}

WPFの場合は次のようになります。

C#
using System.Windows;
using System.Windows.Media;

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

this.Background = new SolidColorBrush(Color.FromRgb(245, 245, 245));

button1.Background = new SolidColorBrush(Color.FromRgb(0, 120, 215));
button1.Foreground = new SolidColorBrush(Colors.White);

label1.Foreground = new SolidColorBrush(Color.FromRgb(64, 64, 64));
label1.Content = "RGBカラーを設定しました";
}
}

5-4. ユーザー入力されたRGB値で画面色を変更する方法

ユーザーが入力したRGB値を使って背景色を変更するには、入力値を取得してColorに変換します。

WinFormsの例です。

C#
private void buttonApply_Click(object sender, EventArgs e)
{
if (!int.TryParse(textBoxR.Text, out int r) ||
!int.TryParse(textBoxG.Text, out int g) ||
!int.TryParse(textBoxB.Text, out int b))
{
MessageBox.Show("RGB値は数値で入力してください。");
return;
}

if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255)
{
MessageBox.Show("RGB値は0〜255の範囲で入力してください。");
return;
}

this.BackColor = Color.FromArgb(r, g, b);
}

入力値をそのまま Color.FromArgb に渡すのではなく、数値チェックと範囲チェックを入れるのがポイントです。

WPFの場合は、Brushに変換してから設定します。

C#
private void ButtonApply_Click(object sender, RoutedEventArgs e)
{
if (!byte.TryParse(textBoxR.Text, out byte r) ||
!byte.TryParse(textBoxG.Text, out byte g) ||
!byte.TryParse(textBoxB.Text, out byte b))
{
MessageBox.Show("RGB値は0〜255の範囲で入力してください。");
return;
}

this.Background = new SolidColorBrush(Color.FromRgb(r, g, b));
}

WPFの Color.FromRgbbyte を受け取るため、byte.TryParse を使うと0〜255の範囲チェックも兼ねられます。

5-5. カラーピッカーとRGB値を連携させる考え方

アプリにカラーピッカーを用意する場合、選択された色からRGB値を取得し、テキストボックスやプレビュー領域に反映すると使いやすくなります。

WinFormsでは、ColorDialog を使うと簡単に色選択ダイアログを表示できます。

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

textBoxR.Text = color.R.ToString();
textBoxG.Text = color.G.ToString();
textBoxB.Text = color.B.ToString();

panelPreview.BackColor = color;
}
}
}

カラーピッカーとRGB値を連携させる場合は、次の流れを意識すると設計しやすくなります。

カラーピッカーで色を選択

ColorからR・G・Bを取得

テキストボックスへ表示

プレビュー領域へ反映

反対に、ユーザーがRGB値を手入力した場合は、次の流れになります。

RGB値を入力

入力値を検証

Colorに変換

プレビュー領域へ反映

6. C#で画像のRGB値を取得・変更する方法

6-1. Bitmap.GetPixelで画像の1ピクセルのRGBを取得する

C#で画像の1ピクセルの色を取得するには、Bitmap.GetPixel を使います。

C#
using System;
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

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

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

このコードでは、画像の座標 (10, 20) にあるピクセルの色を取得しています。

画像の座標は、左上が (0, 0) です。右方向にX座標が増え、下方向にY座標が増えます。

左上: (0, 0)
右方向: xが増える
下方向: yが増える

6-2. Bitmap.SetPixelで指定ピクセルの色を変更する

画像の指定ピクセルの色を変更するには、Bitmap.SetPixel を使います。

C#
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

bitmap.SetPixel(10, 20, Color.FromArgb(255, 0, 0));

bitmap.Save("output.png");

このコードでは、座標 (10, 20) のピクセルを赤に変更し、output.png として保存しています。

複数のピクセルを変更したい場合は、ループ処理と組み合わせます。

C#
for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
bitmap.SetPixel(x, y, Color.Red);
}
}

ただし、画像全体を SetPixel で処理すると非常に遅くなることがあります。小さな画像や学習用のサンプルでは問題ありませんが、実務では LockBits や画像処理ライブラリの利用を検討しましょう。

6-3. 画像全体のRGB値を走査する基本コード

画像全体のRGB値を取得するには、X方向とY方向の二重ループを使います。

C#
using System;
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

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

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

このコードは、画像のすべてのピクセルについてRGB値を出力します。

ただし、画像サイズが大きいと出力が大量になります。実際には、平均色を計算したり、特定条件に合うピクセルだけ処理したりすることが多いです。

6-4. RGB値を変更して画像を加工するサンプル

画像全体の赤成分を強くするサンプルです。

C#
using System;
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

int r = Math.Clamp(color.R + 50, 0, 255);
int g = color.G;
int b = color.B;

Color newColor = Color.FromArgb(color.A, r, g, b);
bitmap.SetPixel(x, y, newColor);
}
}

bitmap.Save("red_strong.png");

このコードでは、各ピクセルのR値に50を加えています。255を超えないように Math.Clamp で範囲を制限しています。

青みを強くしたい場合はB値を増やします。

C#
int b = Math.Clamp(color.B + 50, 0, 255);

全体を暗くしたい場合は、RGBすべてを小さくします。

C#
int r = Math.Clamp(color.R - 50, 0, 255);
int g = Math.Clamp(color.G - 50, 0, 255);
int b = Math.Clamp(color.B - 50, 0, 255);

6-5. GetPixel・SetPixelが遅い理由とLockBitsの必要性

GetPixelSetPixel は簡単に使える反面、画像全体を処理するには遅くなりやすいです。1ピクセルごとにメソッド呼び出しが発生するため、大きな画像や大量の画像を処理する場合は処理時間が長くなります。

たとえば、1920×1080の画像には約207万ピクセルあります。各ピクセルに対して GetPixelSetPixel を呼び出すと、メソッド呼び出しだけでも大きな負荷になります。

高速化したい場合は、Bitmap.LockBits を使って画像データをメモリ上で直接処理する方法があります。

C#
// LockBitsは高速ですが、ポインタやバイト配列の扱いが必要になるため、
// 初心者はまずGetPixel/SetPixelで考え方を理解するのがおすすめです。

実務の画像処理では、次のような選択肢もあります。

小さな画像・学習用 → GetPixel / SetPixel
大きな画像・高速処理 → LockBits
クロスプラットフォーム → ImageSharp / SkiaSharp / OpenCvSharp
高度な画像処理 → OpenCvSharp

6-6. .NET 6以降でSystem.Drawing.Commonを使うときの注意点

.NET 6以降で System.Drawing.Common を使う場合は、実行環境に注意が必要です。Microsoftのドキュメントでは、.NET 6以降の System.Drawing.Common はWindows固有のライブラリとして扱われ、Windows以外では警告や実行時例外の対象になります。Microsoft Learn+2Microsoft Learn+2

特に、Linuxサーバー、Docker、macOSなどで画像処理を行う場合、System.Drawing.Bitmap に依存したコードは問題になる可能性があります。

クロスプラットフォームで画像処理をしたい場合は、次のようなライブラリを検討します。Microsoftの互換性情報でも、クロスプラットフォーム用途ではSkiaSharp、ImageSharp、Aspose.Drawing、Microsoft.Maui.Graphicsなどへの移行が推奨されています。Microsoft Learn

ImageSharp
SkiaSharp
OpenCvSharp
Microsoft.Maui.Graphics

Windows専用のWinFormsアプリで簡単な画像処理をするなら System.Drawing は扱いやすいですが、サーバーサイドやクロスプラットフォームアプリでは別ライブラリの利用も検討しましょう。

7. C#の画像処理でRGBを活用する実践例

7-1. RGBからグレースケール画像に変換する方法

グレースケールとは、画像を白黒の濃淡に変換する処理です。RGB値から明るさを計算し、R・G・Bに同じ値を設定します。

単純な平均を使う場合は次のように書けます。

C#
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

int gray = (color.R + color.G + color.B) / 3;

Color newColor = Color.FromArgb(color.A, gray, gray, gray);
bitmap.SetPixel(x, y, newColor);
}
}

bitmap.Save("grayscale.png");

より自然な明るさにしたい場合は、人間の目が緑に敏感であることを考慮して、重み付きで計算することがあります。

C#
int gray = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);

この計算式を使うと、単純平均より自然なグレースケールになりやすいです。

7-2. RGB値を反転してネガポジ反転する方法

ネガポジ反転は、RGB値を反転する処理です。各成分を 255 - 値 にします。

C#
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

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

Color newColor = Color.FromArgb(color.A, r, g, b);
bitmap.SetPixel(x, y, newColor);
}
}

bitmap.Save("negative.png");

たとえば、黒は白に、白は黒に、赤はシアンに変わります。

黒: R=0, G=0, B=0 → R=255, G=255, B=255
赤: R=255, G=0, B=0 → R=0, G=255, B=255

7-3. 特定の色だけを抽出する方法

特定の色だけを抽出したい場合は、RGB値が条件に合うかどうかを判定します。

たとえば、赤っぽい部分だけを残し、それ以外をグレーにする例です。

C#
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

bool isRed =
color.R > 150 &&
color.G < 100 &&
color.B < 100;

if (!isRed)
{
int gray = (color.R + color.G + color.B) / 3;
Color grayColor = Color.FromArgb(color.A, gray, gray, gray);
bitmap.SetPixel(x, y, grayColor);
}
}
}

bitmap.Save("red_only.png");

条件を変えれば、青だけ、緑だけ、明るい部分だけ、暗い部分だけを抽出できます。

C#
bool isBlue = color.B > 150 && color.R < 100 && color.G < 100;
bool isBright = color.R + color.G + color.B > 600;
bool isDark = color.R + color.G + color.B < 100;

7-4. 明るさ・コントラストをRGB値で調整する方法

画像の明るさを変更するには、RGB値に一定の値を加算または減算します。

C#
int brightness = 30;

int r = Math.Clamp(color.R + brightness, 0, 255);
int g = Math.Clamp(color.G + brightness, 0, 255);
int b = Math.Clamp(color.B + brightness, 0, 255);

明るくする場合は正の値、暗くする場合は負の値を使います。

C#
int brightness = -30;

コントラストを調整する場合は、128を基準にして差を広げたり縮めたりします。

C#
static int AdjustContrast(int value, double contrast)
{
int result = (int)((value - 128) * contrast + 128);
return Math.Clamp(result, 0, 255);
}

使い方です。

C#
double contrast = 1.2; // 1.0より大きいとコントラスト強め

int r = AdjustContrast(color.R, contrast);
int g = AdjustContrast(color.G, contrast);
int b = AdjustContrast(color.B, contrast);

画像全体へ適用する例です。

C#
Bitmap bitmap = new Bitmap("sample.png");

double contrast = 1.2;

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

int r = AdjustContrast(color.R, contrast);
int g = AdjustContrast(color.G, contrast);
int b = AdjustContrast(color.B, contrast);

bitmap.SetPixel(x, y, Color.FromArgb(color.A, r, g, b));
}
}

bitmap.Save("contrast.png");

7-5. しきい値を使って画像を二値化する方法

二値化とは、画像を白と黒の2色に変換する処理です。文字認識や輪郭抽出の前処理などで使われます。

基本的な考え方は、グレースケールの値がしきい値以上なら白、未満なら黒にするというものです。

C#
using System.Drawing;

Bitmap bitmap = new Bitmap("sample.png");

int threshold = 128;

for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);

int gray = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);

int binary = gray >= threshold ? 255 : 0;

bitmap.SetPixel(x, y, Color.FromArgb(color.A, binary, binary, binary));
}
}

bitmap.Save("binary.png");

しきい値を低くすると白になる範囲が増え、しきい値を高くすると黒になる範囲が増えます。

threshold = 80  → 白が多くなりやすい
threshold = 128 → 標準的
threshold = 200 → 黒が多くなりやすい

7-6. ImageSharpやOpenCvSharpでRGB画像処理を行う選択肢

System.Drawing.Bitmap は手軽ですが、.NET 6以降のクロスプラットフォーム用途では注意が必要です。Windows以外の環境も考えるなら、ImageSharp、SkiaSharp、OpenCvSharpなどのライブラリを検討するとよいでしょう。

ImageSharpは、C#らしいコードで画像を読み込み、ピクセル処理やリサイズなどを行えるライブラリです。OpenCvSharpは、OpenCVをC#から使うためのライブラリで、画像認識、フィルタ処理、輪郭検出など高度な画像処理に向いています。

選び方の目安は次のとおりです。

簡単な画像加工をC#で書きたい → ImageSharp
高速な2D描画をしたい → SkiaSharp
画像認識やコンピュータビジョンをしたい → OpenCvSharp
Windows専用の簡単な処理 → System.Drawing

RGB値の考え方は、どのライブラリを使っても基本的には共通です。まずは RGB の意味を理解し、そのうえで使用するライブラリのColor型やピクセル形式に合わせてコードを書きましょう。

8. C#でRGBカラーを扱うときによくあるエラーと対処法

8-1. RGB値が範囲外でエラーになる

RGB値は0〜255の範囲で指定する必要があります。範囲外の値を Color.FromArgb に渡すとエラーになります。

悪い例です。

C#
Color color = Color.FromArgb(300, -10, 500);

対策として、入力値をチェックします。

C#
static bool IsValidRgb(int value)
{
return value >= 0 && value <= 255;
}

または、範囲外の値を丸めます。

C#
static int ClampRgb(int value)
{
return Math.Clamp(value, 0, 255);
}

使い方です。

C#
int r = ClampRgb(inputR);
int g = ClampRgb(inputG);
int b = ClampRgb(inputB);

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

ユーザー入力の場合は、数値変換の失敗も考慮しましょう。

C#
if (!int.TryParse(textBoxR.Text, out int r))
{
MessageBox.Show("R値が数値ではありません。");
return;
}

8-2. 16進数カラーコードの変換に失敗する

#RRGGBB 形式の文字列を変換するとき、次のような入力では失敗します。

#GGGGGG
#12345
red
空文字

対策として、変換前に形式をチェックします。

C#
using System.Text.RegularExpressions;

static bool IsValidHexRgb(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return false;
}

return Regex.IsMatch(value, "^#?[0-9a-fA-F]{6}$");
}

使い方です。

C#
if (!IsValidHexRgb(input))
{
MessageBox.Show("カラーコードは#RRGGBB形式で入力してください。");
return;
}

ColorTranslator.FromHtml を使う場合も、不正な文字列に備えて例外処理を入れておくと安心です。

C#
try
{
Color color = ColorTranslator.FromHtml(input);
}
catch
{
MessageBox.Show("カラーコードを変換できませんでした。");
}

8-3. Color型の名前空間を間違える

C#では、複数のColor型があります。代表的なものは次の3つです。

C#
System.Drawing.Color
System.Windows.Media.Color
Microsoft.Maui.Graphics.Color

WinFormsでは System.Drawing.Color、WPFでは System.Windows.Media.Color、.NET MAUIでは Microsoft.Maui.Graphics.Color を使うのが基本です。

名前空間を間違えると、次のような問題が起きます。

Color.FromArgbの引数が合わない
BackColorに代入できない
SolidColorBrushに渡せない
Colorが曖昧だとコンパイルエラーになる

対策として、必要に応じて完全修飾名を使います。

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

System.Windows.Media.Color mediaColor =
System.Windows.Media.Color.FromRgb(255, 0, 0);

また、別名を付ける方法もあります。

C#
using DrawingColor = System.Drawing.Color;
using MediaColor = System.Windows.Media.Color;

DrawingColor color1 = DrawingColor.FromArgb(255, 0, 0);
MediaColor color2 = MediaColor.FromRgb(255, 0, 0);

8-4. WPFとWinFormsでColorの指定方法が違う

WinFormsでは、コントロールの色プロパティに System.Drawing.Color を直接指定できます。

C#
button1.BackColor = System.Drawing.Color.FromArgb(255, 0, 0);

一方、WPFでは背景色や文字色にBrushを使うことが多いです。

C#
button1.Background =
new System.Windows.Media.SolidColorBrush(
System.Windows.Media.Color.FromRgb(255, 0, 0)
);

WinFormsの感覚でWPFの Background にColorを直接代入しようとすると、型が合わずにエラーになります。

C#
// WPFではこれは基本的にNG
// button1.Background = Color.FromRgb(255, 0, 0);

WPFでは、ColorをBrushに包んで設定する、と覚えておきましょう。

C#
var color = System.Windows.Media.Color.FromRgb(255, 0, 0);
var brush = new System.Windows.Media.SolidColorBrush(color);

button1.Background = brush;

8-5. 画像処理で処理速度が遅くなる

Bitmap.GetPixelBitmap.SetPixel はわかりやすいですが、画像全体に対して使うと遅くなりやすいです。

遅くなる例です。

C#
for (int y = 0; y < bitmap.Height; y++)
{
for (int x = 0; x < bitmap.Width; x++)
{
Color color = bitmap.GetPixel(x, y);
bitmap.SetPixel(x, y, color);
}
}

対策は次のとおりです。

小さい画像だけに使う
処理範囲を限定する
LockBitsを使う
ImageSharpやOpenCvSharpなどのライブラリを使う

学習段階では GetPixelSetPixel でRGB処理の流れを理解し、実務で大きな画像を扱う場合は高速な方法に切り替えるのがおすすめです。

8-6. 透明度を指定したのに反映されない

Color.FromArgb(128, 255, 0, 0) のようにAlpha値を指定しても、透明度が見た目に反映されないことがあります。

主な原因は次のとおりです。

描画先が透明度をサポートしていない
背景との合成が行われていない
WinFormsコントロールのBackColorでは期待通りに半透明にならない
画像保存形式がAlphaを保持していない

たとえば、PNGは透明度を保持できますが、JPEGはAlphaチャンネルを保持できません。半透明画像を保存したい場合は、PNG形式を使いましょう。

C#
bitmap.Save("output.png", System.Drawing.Imaging.ImageFormat.Png);

UIで透明度を使う場合は、WPFのほうが扱いやすい場面があります。

C#
var brush = new SolidColorBrush(Color.FromArgb(128, 255, 0, 0));
rectangle1.Fill = brush;

透明度が反映されないときは、ColorのAlpha値だけでなく、描画先、コントロール、画像形式も確認しましょう。

9. C#のRGBカラー変換でよく使うコード集

9-1. RGBからColorに変換する関数

RGB値から System.Drawing.Color に変換する関数です。

C#
using System.Drawing;

static Color RgbToColor(int r, int g, int b)
{
r = Math.Clamp(r, 0, 255);
g = Math.Clamp(g, 0, 255);
b = Math.Clamp(b, 0, 255);

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

使い方です。

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

Alpha値も指定したい場合は、次のようにします。

C#
static Color ArgbToColor(int a, int r, int g, int b)
{
a = Math.Clamp(a, 0, 255);
r = Math.Clamp(r, 0, 255);
g = Math.Clamp(g, 0, 255);
b = Math.Clamp(b, 0, 255);

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

9-2. ColorからRGB文字列に変換する関数

ColorからRGB文字列を作る関数です。

C#
using System.Drawing;

static string ColorToRgbString(Color color)
{
return $"{color.R},{color.G},{color.B}";
}

使い方です。

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

Console.WriteLine(rgb);

出力結果です。

255,128,0

見やすい形式にしたい場合は次のようにします。

C#
static string ColorToReadableRgbString(Color color)
{
return $"R={color.R}, G={color.G}, B={color.B}";
}

Alphaも含める場合です。

C#
static string ColorToArgbString(Color color)
{
return $"A={color.A}, R={color.R}, G={color.G}, B={color.B}";
}

9-3. RGBから16進数カラーコードに変換する関数

RGB値から #RRGGBB 形式へ変換する関数です。

C#
static string RgbToHex(int r, int g, int b)
{
r = Math.Clamp(r, 0, 255);
g = Math.Clamp(g, 0, 255);
b = Math.Clamp(b, 0, 255);

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

使い方です。

C#
string hex = RgbToHex(255, 128, 0);

Console.WriteLine(hex);

出力結果です。

#FF8000

Colorから変換する場合です。

C#
using System.Drawing;

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

Alphaも含める場合です。

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

9-4. 16進数カラーコードからColorに変換する関数

#RRGGBB 形式の文字列からColorへ変換する関数です。

C#
using System;
using System.Drawing;
using System.Globalization;
using System.Text.RegularExpressions;

static Color HexToColor(string hex)
{
if (string.IsNullOrWhiteSpace(hex))
{
throw new ArgumentException("カラーコードが空です。", nameof(hex));
}

hex = hex.Trim();

if (hex.StartsWith("#"))
{
hex = hex.Substring(1);
}

if (!Regex.IsMatch(hex, "^[0-9a-fA-F]{6}$"))
{
throw new ArgumentException("カラーコードは#RRGGBB形式で指定してください。", nameof(hex));
}

int r = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);

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

使い方です。

C#
Color color = HexToColor("#FF8000");

Console.WriteLine(color.R); // 255
Console.WriteLine(color.G); // 128
Console.WriteLine(color.B); // 0

#AARRGGBB にも対応したい場合は、文字列の長さで分岐します。

C#
static Color HexToColorFlexible(string hex)
{
if (string.IsNullOrWhiteSpace(hex))
{
throw new ArgumentException("カラーコードが空です。", nameof(hex));
}

hex = hex.Trim();

if (hex.StartsWith("#"))
{
hex = hex.Substring(1);
}

if (hex.Length == 6)
{
int r = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);

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

if (hex.Length == 8)
{
int a = int.Parse(hex.Substring(0, 2), NumberStyles.HexNumber);
int r = int.Parse(hex.Substring(2, 2), NumberStyles.HexNumber);
int g = int.Parse(hex.Substring(4, 2), NumberStyles.HexNumber);
int b = int.Parse(hex.Substring(6, 2), NumberStyles.HexNumber);

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

throw new ArgumentException("カラーコードは#RRGGBBまたは#AARRGGBB形式で指定してください。", nameof(hex));
}

9-5. RGB値を安全に0〜255へ丸める関数

RGB値を安全に0〜255へ丸める関数です。

C#
static int ClampRgb(int value)
{
return Math.Clamp(value, 0, 255);
}

Math.Clamp を使わずに書く場合は、次のようになります。

C#
static int ClampRgb(int value)
{
if (value < 0)
{
return 0;
}

if (value > 255)
{
return 255;
}

return value;
}

RGBすべてに適用する関数です。

C#
using System.Drawing;

static Color SafeColorFromRgb(int r, int g, int b)
{
return Color.FromArgb(
ClampRgb(r),
ClampRgb(g),
ClampRgb(b)
);
}

使い方です。

C#
Color color = SafeColorFromRgb(300, -20, 128);

// R=255, G=0, B=128 になる

ユーザー入力や計算結果からColorを作る場合は、このような丸め処理を入れておくと安全です。

9-6. 画像のRGB値を一括変換する関数

画像全体のRGB値を一括変換する関数です。ここでは、各ピクセルに対して変換処理を渡せるようにします。

C#
using System;
using System.Drawing;

static Bitmap ConvertImageColors(Bitmap source, Func<Color, Color> converter)
{
Bitmap result = new Bitmap(source.Width, source.Height);

for (int y = 0; y < source.Height; y++)
{
for (int x = 0; x < source.Width; x++)
{
Color original = source.GetPixel(x, y);
Color converted = converter(original);

result.SetPixel(x, y, converted);
}
}

return result;
}

グレースケール変換に使う例です。

C#
Bitmap source = new Bitmap("sample.png");

Bitmap grayscale = ConvertImageColors(source, color =>
{
int gray = (int)(color.R * 0.299 + color.G * 0.587 + color.B * 0.114);
return Color.FromArgb(color.A, gray, gray, gray);
});

grayscale.Save("grayscale.png");

ネガポジ反転に使う例です。

C#
Bitmap negative = ConvertImageColors(source, color =>
{
return Color.FromArgb(
color.A,
255 - color.R,
255 - color.G,
255 - color.B
);
});

negative.Save("negative.png");

明るさ調整に使う例です。

C#
int brightness = 30;

Bitmap bright = ConvertImageColors(source, color =>
{
int r = Math.Clamp(color.R + brightness, 0, 255);
int g = Math.Clamp(color.G + brightness, 0, 255);
int b = Math.Clamp(color.B + brightness, 0, 255);

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

bright.Save("bright.png");

このように共通関数を作っておくと、RGB変換処理だけを差し替えられるため、画像加工のコードを整理しやすくなります。

まとめ

C#でRGBカラーを扱う基本は、Red、Green、Blueの3つの値を0〜255の範囲で指定することです。System.Drawing.Color では Color.FromArgb(r, g, b) を使うとRGB値からColorを作成でき、color.Rcolor.Gcolor.B を使うとColorから各成分を取得できます。

透明度を扱う場合は、Alpha値を含めたARGBを使います。Color.FromArgb(a, r, g, b) のように、4引数の場合は先頭がAlphaになる点に注意しましょう。

16進数カラーコードとの変換では、#RRGGBB#AARRGGBB の形式を理解しておくと便利です。単純な変換であれば、$"#{color.R:X2}{color.G:X2}{color.B:X2}" のような書き方で簡単に文字列化できます。HTMLカラーコードを扱う場合は、ColorTranslator.FromHtmlColorTranslator.ToHtml も利用できます。

UIに反映する場合は、WinForms、WPF、.NET MAUIで使うColor型が異なります。WinFormsでは System.Drawing.Color、WPFでは System.Windows.Media.Color とBrush、.NET MAUIでは Microsoft.Maui.Graphics.Color を使います。

画像処理では、Bitmap.GetPixelBitmap.SetPixel を使うとRGB値を簡単に取得・変更できます。ただし、大きな画像を処理する場合は速度面に注意が必要です。.NET 6以降では System.Drawing.Common の対応環境にも注意し、クロスプラットフォーム用途ではImageSharp、SkiaSharp、OpenCvSharpなどの選択肢も検討しましょう。

RGBカラーは、C#の画面表示、UI設計、画像加工の基礎になる重要な知識です。まずは Color.FromArgbRGB、16進数変換の基本を押さえ、必要に応じてARGBや画像処理へ応用していくと理解しやすくなります。