System.Drawing.ColorをRGBおよび16進値に変換する


125

C#を使用して、次の2つを開発しようとしました。私のやり方には問題があり、あなたの親切な助言が必要かもしれません。さらに、同じことを行う既存の方法があるかどうかはわかりません。

private static String HexConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

private static String RGBConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

ありがとう。


回答:


202

ここで問題を確認できません。コードは私にはよく見えます。

私は考えることができる唯一のことは、try / catchブロックが冗長であるということです- cがnullにすることはできませんので、色がG、構造体及びRであり、Bはバイトでありc.R.ToString()c.G.ToString()およびc.B.ToString()実際に失敗することはできません(私がそれらが失敗しているのを見ることができる唯一の方法はでありNullReferenceException、それらのどれも実際にはnullになることはできません)。

以下を使用して、全体をクリーンアップできます。

private static String HexConverter(System.Drawing.Color c)
{
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}

private static String RGBConverter(System.Drawing.Color c)
{
    return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}

1
私は、空のtry-catchブロックは(ほぼ)普遍的に根絶されるべきだと言っているところまで行きます。彼らはバグのあるコードにつながる大きな可能性を秘めています。それでも、クリーンアップされたコードの場合は+1、適切にフレーム化された質問の場合はOP +1になります。
JMD 2014年

7
VBと同等のものを見つけるのにしばらく時間がかかりました:String.Format( "#{0:X2} {1:X2} {2:X2}"、cR、cG、cB)
zacharydl

1
代替の回答として、C#6へのコードの適応を投稿します。こちらご覧いただけます
aloisdgがcodidact.comに移動2016年

色にアルファチャネル(透明度)がある場合、これは間違った色を生成します。完全に不透明になります。
LarryBud

@LarryBud間違いなく真実であり、指摘していただきありがとうございます。私の例では、元の質問をキーオフしていたためにアルファチャネルをスキップしましたが、これも含まれていませんでした。:)
アリ・ロス

189

シンプルにして、ネイティブのカラートランスレータを使用できます。

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);

次に、3つの色のペアを整数形式に分解します。

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

7
しかし、このようにすると、Color red = System.Drawing.Color.Red; 文字列redHex = ColorTranslator.ToHtml(red); 16進値は提供されません。
Nazmul

確かにそうすべきですが、私はそのコードを具体的にテストし、# "FF0000"を取得しました。何を手に入れていますか?また、MSDNのリファレンスを参照してくださいたいかもしれません:msdn.microsoft.com/en-us/library/...
トロイハント

赤で試す= System.Drawing.Color.Red; ->#FF0000は提供されません。
Nazmul

9
あなたが提供したコードは機能しますが、コードの最初の行を次のように変更すると:Color red = System.Drawing.Color.Red; ->その後、16進コードは表示されません。「赤」を出力します。
Nazmul

4
@Hoque-確認済み。ColorTranslatorは、色に「わかりやすい」名前を付けます。なんてうるさい!
2013

38

C#6以降を使用できる場合は、補間された文字列を利用して、@ Ari Rothのソリューションを次のように書き換えることができます。

C#6:

public static class ColorConverterExtensions
{
    public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}";

    public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})";
}

また:

  • キーワードを追加しthisて、拡張メソッドとして使用します。
  • stringクラス名の代わりにtypeキーワードを使用できます。
  • ラムダ構文を使用できます。
  • 自分の好みに合わせて、よりわかりやすい名前に変更します。

とてもきれい... +1!
Shockwaver

26

例えば

 ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))

これにより、KnownColorのトリックを回避できます。


1

私はかなりうまくいく拡張メソッドを見つけました

public static string ToHex(this Color color)
{
    return String.Format("#{0}{1}{2}{3}"
        , color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X")
        , color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X")
        , color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X")
        , color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X"));
}

参照:https : //social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code? forum = winappswithcsharp


私はそれがHexではなくHex2であるべきだと信じています、そうでなければ色はおそらく間違って補間されました。
Mohammed Noureldin 2017年

@MohammedNoureldin Hex2はコードのどこに行くのでしょうか、時々色が少し異なるのを見ましたか?
user1

X2代わりにを意味しましたX。それ以外の場合は、1代わりに01問題が発生する可能性があります。
Mohammed Noureldin 2017年

@MohammedNoureldinええ、そうX2すれば、すべてのcolor.B.ToString("X").Length == 1 ? 三元変数は必要ありません。
ProfK

1

16進コードの場合はこれを試してください

  1. 色のARGB(アルファ、赤、緑、青)表現を取得する
  2. アウトフィルターアルファチャンネル:& 0x00FFFFFF
  3. 値をフォーマットします(16進数の16進数「X6」として)

RGB 1の場合

  1. ただ、うちのフォーマット RedGreenBlue

実装

private static string HexConverter(Color c) {
  return String.Format("#{0:X6}", c.ToArgb() & 0x00FFFFFF);
}

public static string RgbConverter(Color c) {
  return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.