ひきぷろのプログラミング日記

プログラミングの日記です。

(C#) RGB と HSV の相互変換

RGB 値と HSV 値の相互変換用の処理を書いてみました。
処理の詳しい内容は Wikipedia を見てみてください。

HSV色空間 - Wikipedia

HSV カラーを扱うクラスの作成

まず、 HSV カラーを扱うクラスを作ります。

using System;

class ColorHSV {
	public float H;
	public float S;
	public float V;

	public ColorHSV() {
		H = 0;
		S = 0;
		V = 0;
	}

	public ColorHSV(float h, float s, float v) {
		H = Math.Max(0f, Math.Min(1f, h));
		S = Math.Max(0f, Math.Min(1f, s));
		V = Math.Max(0f, Math.Min(1f, v));
	}
}

ColorHSV クラスの値はそれぞれ、 0.0 から 1.0 の範囲に収まるようにします。

色変換用クラスの作成

次に、変換用のクラスを作ります。

using System;
using System.Drawing;

class ColorConverter {
	// RGB から HSV へ変換する
	public static ColorHSV RGB2HSV(Color color) {
		float r = (float)color.R / 255f;
		float g = (float)color.G / 255f;
		float b = (float)color.B / 255f;

		float max = Math.Max(Math.Max(r, g), b);
		float min = Math.Min(Math.Min(r, g), b);

		float h = max - min;

		if (h > 0f) {
			if (max == r) {
				h = (g - b) / h;
				if (h < 0f) {
					h += 6f;
				}
			} else if (max == g) {
				h = 2f + (b - r) / h;
			} else {
				h = 4f + (r - g) / h;
			}
		}
		h /= 6f;

		float s = max - min;
		if (max != 0) {
			s /= max;
		}
		float v = max;

		return new ColorHSV(h, s, v);
	}

	// HSV から RGB へ変換する
	public static Color HSV2RGB(ColorHSV hsv) {
		Color result = Color.FromArgb(0, 0, 0);

		if (hsv == null) {
			return result;
		}

		float h = hsv.H;
		float s = hsv.S;
		float v = hsv.V;

		float r = v;
		float g = v;
		float b = v;

		if (s > 0f) {
			h *= 6f;
			int i = (int)h;
			float f = h - (float)i;
			switch (i) {
				default:
				case 0:
					g *= 1f - s * (1f - f);
					b *= 1f - s;
					break;
				case 1:
					r *= 1f - s * f;
					b *= 1f - s;
					break;
				case 2:
					r *= 1f - s;
					b *= 1f - s * (1f - f);
					break;
				case 3:
					r *= 1f - s;
					g *= 1f - s * f;
					break;
				case 4:
					r *= 1f - s * (1f - f);
					g *= 1f - s;
					break;
				case 5:
					g *= 1f - s;
					b *= 1f - s * f;
					break;
			}
		}

		r *= 255f;
		g *= 255f;
		b *= 255f;

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

ここで扱う RGB の色は、 System.Drawing.Color 構造体の色です。

  • RGB2HSV() メソッド: Color の値を ColorHSV へ変換します。
  • HSV2RGB() メソッド: ColorHSV の値を Color へ変換します。
使い方
// RGB から HSV へ変換する
Color rgb = Color.FromArgb(255, 0, 0);
ColorHSV hsv = ColorConverter.RGB2HSV(rgb);

// HSV から RGB へ変換する
ColorHSV hsv = new ColorHSV(0.5f, 1, 1);
Color rgb = ColorConverter.HSV2RGB(hsv);

ここまで作って気が付いたんですが、 System.Drawing.ColorConverter と名前がかぶってしまいますね。上の ColorConverter クラスは、他の名前にした方が良いのかもしれません。