web-dev-qa-db-ja.com

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

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

ありがとう。

113
Hoque

ここで問題を見ることはできません。コードは私には良さそうです。

私が考えることができる唯一のことは、try/catchブロックが冗長であることです-色は構造体であり、R、G、およびBはバイトなので、cはnullであり得ず、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() + ")";
}
182
Ari Roth

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

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

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

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

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を追加して、拡張メソッドとして使用します。
  • クラス名の代わりにtypeキーワードstringを使用できます。
  • ラムダ構文を使用できます。
  • 私の好みに合わせて、より明確になるように名前を変更します。
34
aloisdg

例えば.

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

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

23
Andy Fong

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);
}
1
Dmitry Bychenko

非常にうまく機能する拡張メソッドを見つけました

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

1
user1