System.Drawing.Color를 RGB 및 16 진수 값으로 변환


125

C #을 사용하여 다음 두 가지를 개발하려고했습니다. 내가하는 방식에 문제가있을 수 있고 친절한 조언이 필요할 수 있습니다. 또한 동일한 작업을 수행하는 기존 방법이 있는지 여부도 모르겠습니다.

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

나는 여기서 문제를 보지 못하고있다. 코드는 나에게 좋아 보인다.

내가 생각할 수있는 유일한 방법입니다 시도 / 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

7
VB 등가물을 찾는 데 시간이 좀 걸렸습니다. String.Format ( "# {0 : X2} {1 : X2} {2 : X2}", cR, cG, cB)
zacharydl

1
대체 답변으로 코드를 C # 6에 맞게 수정했습니다. 여기에서 볼 수 있습니다 .
codidact.com로 이동 aloisdg

색상에 알파 채널 (투명도)이있는 경우 잘못된 색상이 생성됩니다. 완전히 불투명 해집니다.
LarryBud

@LarryBud 절대적으로 사실이며 지적 해 주셔서 감사합니다. 내 예제는 원래 질문에서 제외 되었기 때문에 알파 채널을 건너 뛰었습니다. :)
Ari Roth

189

간단하게 유지하고 기본 색상 변환기를 사용할 수 있습니다.

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

그런 다음 세 가지 색상 쌍을 정수 형식으로 나눕니다.

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

7
하지만 이렇게하면 Color red = System.Drawing.Color.Red; string redHex = ColorTranslator.ToHtml (red); 16 진수 값을 제공하지 않습니다.
Nazmul 2010 년

확실히해야합니다. 그 코드를 구체적으로 테스트하고 # "FF0000"을 얻었습니다. 당신은 무엇을 얻고 있습니까? MSDN 참조를 참조 할 수도 있습니다. msdn.microsoft.com/en-us/library/…
Troy Hunt

Color red = System.Drawing.Color.Red로 시도하십시오. -> # FF0000을 제공하지 않습니다.
Nazmul 2010 년

9
제공 한 코드는 작동하지만 코드의 첫 줄을 다음과 같이 변경하면 다음과 같습니다. Color red = System.Drawing.Color.Red; -> 그러면 16 진 코드를 제공하지 않습니다. 출력으로 "Red"를 제공합니다.
Nazmul 2010 년

4
@Hoque-확인 됨. ColorTranslator는 색상에 "친숙한"이름을 부여합니다. 얼마나 짜증나!
anon

38

C # 6 이상을 사용할 수 있다면 Interpolated Strings의 이점을 누리고 @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

@MohammedNoureldin Hex2는 코드에서 어디로 갈까요? 가끔 색상이 약간 다른 것을 보았습니다.
user1 '

나는 의미 X2대신에 X, 그렇지 않으면 당신은 얻을 수 있습니다, 1대신 01다음 문제가 될 것입니다.
Mohammed Noureldin

@MohammedNoureldin 예, X2그렇다면 모든 color.B.ToString("X").Length == 1 ? 삼진이 필요하지는 않습니다 .
ProfK

1

16 진수 코드의 경우 이것을 시도하십시오

  1. 가져 ARGB (알파, 빨강, 녹색, 파랑) 색상의 표현을
  2. 알파 채널 필터링 :& 0x00FFFFFF
  3. 값 형식 지정 (16 진수의 경우 16 진수 "X6")

RGB 하나의 경우

  1. 그냥 밖으로 포맷 Red , Green, Blue

이행

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.