시스템 변환.그림그리기.색상에서 RGB 및 16진수 값으로
저는 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;
}
감사해요.
저는 여기서 문제를 보지 못하고 있습니다.코드가 좋아 보입니다.
제가 생각할 수 있는 유일한 것은 시도/캐치 블록이 중복된다는 것입니다. 색상은 구조이고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() + ")";
}
단순하게 유지하고 기본 색상 변환기를 사용할 수 있습니다.
Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);
그런 다음 세 가지 색상 쌍을 정수 형태로 나눕니다.
int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
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
클래스 이름 대신. - 람다 구문을 사용할 수 있습니다.
- 저는 제 취향에 따라 그것들의 이름을 좀 더 명확하게 지었습니다.
편집: 알파 채널을 지원하려는 경우:
public static class ColorConverterExtensions
{
// #RRGGBB
public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}";
// RGB(R, G, B)
public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})";
// #RRGGBBAA
public static string ToHexaString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}{c.A:X2}";
private static double ToProportion(byte b) => b / (double)Byte.MaxValue;
// RGBA(R, G, B, A)
public static string ToRgbaString(this Color c) => $"RGBA({c.R}, {c.G}, {c.B}, {ToProportion(c.A):N2})";
}
재미있는 사실:비율 이름에 대해 검색해야 합니다. 간격에 있는 값을 원하기 때문입니다.[0, 1]
간격에 있는 백분율이 아닌[0, 100]
- https://english.stackexchange.com/a/286524/70403
- https://english.stackexchange.com/questions/218655/a-number-between-0-and-1-like-a-percentage-but-expressed-as-a-decimal
- https://math.stackexchange.com/questions/890617/name-for-percentage-as-a-decimal-between-0-and-1-inclusive
- https://math.stackexchange.com/questions/1626783/is-there-a-name-for-numbers-between-0-and-1
예.
ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))
이렇게 하면 알려진 색상 트릭을 피할 수 있습니다.
나는 꽤 잘 작동하는 확장 방법을 찾았습니다.
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
16진수 코드의 경우 다음을 시도합니다.
- 색상에 대한 ARGB(알파, 레드, 그린, 블루) 표현 가져오기
- 알파 채널 필터링:
& 0x00FFFFFF
- 값의 형식을 지정합니다(16진수의 경우 16진수 "X6").
RGB의 경우
- 포맷 아웃
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);
}
언급URL : https://stackoverflow.com/questions/2395438/convert-system-drawing-color-to-rgb-and-hex-value
'source' 카테고리의 다른 글
asyncio를 사용합니다.생산자-소비자 흐름 대기열 (0) | 2023.05.24 |
---|---|
STA와 MTA에 대해 설명해 주시겠습니까? (0) | 2023.05.24 |
애플리케이션 통찰력 지연? (0) | 2023.05.24 |
웹 클라이언트에서 상태 코드를 가져오는 방법은 무엇입니까? (0) | 2023.05.24 |
Node.js에서 단일 스레드 비차단 IO 모델이 작동하는 방식 (0) | 2023.05.24 |