programing

.NET을 사용하여 16진수 색상 코드에서 색상을 가져오려면 어떻게 해야 합니까?

lastmoon 2023. 7. 6. 22:29
반응형

.NET을 사용하여 16진수 색상 코드에서 색상을 가져오려면 어떻게 해야 합니까?

16진수 색수코색예가상져는방법오을진서에상드예)에서 색상을 ?#FFDFD991)?

나는 파일을 읽고 있고 16진수 색상 코드를 받고 있습니다.하는 해당항생합니다야해성을목을 합니다.System.Windows.Media.Color16진수 색상 코드의 인스턴스입니다.이를 위해 프레임워크에 내장된 방법이 있습니까?

ARGB 코드인 것 같은데요당신이 말하는 것은System.Drawing.Color또는System.Windows.Media.Color후자는 예를 들어 WPF에서 사용됩니다.아직 아무도 언급하지 않았으니 혹시 찾으실지도 모르니까요.

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");

HTML 유형 RGB 코드(#FFCC66과 같은 16진수 코드)를 의미한다고 가정하면 ColorTranslator 클래스를 사용합니다.

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");

그러나 ARGB 16진수 코드를 사용하는 경우 시스템의 ColorConverter 클래스를 사용할 수 있습니다.창문들.미디어 네임스페이스:

Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;

Color Translator를 사용하지 않으려는 경우 다음에서 쉽게 수행할 수 있습니다.

string colorcode = "#FFFFFF00";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
Color clr = Color.FromArgb(argb);

색상 코드는 ARGB 값의 16진수 표현일 뿐입니다.

편집

단일 정수 대신 4개의 값을 사용해야 하는 경우 다음을 사용할 수 있습니다(여러 주석 조합).

string colorcode = "#FFFFFF00";    
colorcode = colorcode.TrimStart('#');

Color col; // from System.Drawing or System.Windows.Media
if (colorcode.Length == 6)
    col = Color.FromArgb(255, // hardcoded opaque
                int.Parse(colorcode.Substring(0,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4,2), NumberStyles.HexNumber));
else // assuming length of 8
    col = Color.FromArgb(
                int.Parse(colorcode.Substring(0, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(6, 2), NumberStyles.HexNumber));

참고 1: NumberStyles는 시스템에 있습니다.세계화.
참고 2: 자체 오류 검사를 제공하십시오(색상 코드는 6자 또는 8자의 16진수 값이어야 함).

또한 다음과 같은 깔끔한 작은 확장 방법이 있습니다.

static class ExtensionMethods
{
    public static Color ToColor(this uint argb)
    {
        return Color.FromArgb((byte)((argb & -16777216)>> 0x18),      
                              (byte)((argb & 0xff0000)>> 0x10),   
                              (byte)((argb & 0xff00) >> 8),
                              (byte)(argb & 0xff));
    }
}

사용 중:

Color color = 0xFFDFD991.ToColor();

아래의 세 가지 변형은 정확히 동일한 색상을 제공합니다.마지막은 Visual Studio 2010 IDE에서 적절한 색상으로 강조 표시되는 이점이 있습니다(아마도 ReSharper가 이를 수행하고 있을 것입니다).

var cc1 = System.Drawing.ColorTranslator.FromHtml("#479DEE");

var cc2 = System.Drawing.Color.FromArgb(0x479DEE);

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);

저는 HEX 색상 코드를 시스템으로 변환해야 했습니다.그림그리기.색상, 특히 WPF 양식의 배경으로 앨리스 블루의 색조를 사용하여 답을 찾는 데 예상보다 오랜 시간이 걸렸습니다.

using System.Windows.Media;

--

System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("#EFF3F7");
this.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(myColor.A, myColor.R, myColor.G, myColor.B));
    private Color FromHex(string hex)
    {
        if (hex.StartsWith("#"))
            hex = hex.Substring(1);

        if (hex.Length != 6) throw new Exception("Color not valid");

        return Color.FromArgb(
            int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
            int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
            int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
    }

다음 코드를 사용할 수 있습니다.

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");

Windows Store App에서 @Hans Kesting 및 @Jink 응답을 사용하여 이 작업을 수행하려면 다음을 수행합니다.

    string colorcode = "#FFEEDDCC";
    int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
    tData.DefaultData = Color.FromArgb((byte)((argb & -16777216) >> 0x18),
                          (byte)((argb & 0xff0000) >> 0x10),
                          (byte)((argb & 0xff00) >> 8),
                          (byte)(argb & 0xff));

이 게시물은 16진수 색상 코드에서 시스템 색상으로 변환하려는 사람들의 단골 메뉴가 되었습니다.따라서 6자리(RGB)와 8자리(ARGB)의 16진수 값을 모두 처리하는 종합 솔루션을 추가해야겠다고 생각했습니다.

Microsoft에 따르면 RGB 값에서 ARGB 값으로 변환할 때 기본적으로

알파 값은 암시적으로 255(완전 불투명)입니다.

즉, 6자리(RGB) 16진수 색상 코드에 FF를 추가하면 8자리 ARGB 16진수 색상 코드가 됩니다.따라서 ARGB 및 RGB 16진수를 모두 처리하고 적절한 색 구조로 변환하는 간단한 방법을 만들 수 있습니다.

    public static System.Drawing.Color GetColorFromHexValue(string hex)
    {
        string cleanHex = hex.Replace("0x", "").TrimStart('#');

        if (cleanHex.Length == 6)
        {
            //Affix fully opaque alpha hex value of FF (225)
            cleanHex = "FF" + cleanHex;
        }

        int argb;

        if (Int32.TryParse(cleanHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out argb))
        {
            return System.Drawing.Color.FromArgb(argb);
        }

        //If method hasn't returned a color yet, then there's a problem
        throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");

    }

이것은 한스 케스팅의 대답에서 영감을 받았습니다.

asp.net 에서:

color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");

16진수 값을 사용하는 경우 Silverlight/WPF 설정 타원이 16진수 색상으로 표시됩니다.

your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)

색 변환기를 사용할 수 있습니다.문자열(16진수)을 색상으로 변환하는 ConvertFromString(string) 메서드입니다.

예: (이것은 "#FF1E1E1E1E"와 같은 ARGB에서 작동합니다.

Control.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1E1E1E"));

외부의 모든 사마린 개발자들을 위해, 당신은 다음과 같은 것이 필요가 있을 것입니다.

  1. Cast 예외가 Xamarin에 대해 설명하는 것으로 간주되지 않도록 색상 유형을 지정합니다.Forms.Color
  2. ColorConverter 유형의 개체 만들기
var conv = new System.Drawing.ColorConverter();
var color = (System.Drawing.Color)conv.ConvertFromString("#FF1D65AE");

WPF:

using System.Windows.Media;

//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");

//color to hex
string hexcolor = color.ToString();

사용하다

System.Drawing.Color.FromArgb(myHashCode);

프로젝트에서 ColorDialog를 사용했습니다.ColorDialog는 때때로 "Red", "Fushia"를 반환하고 "ffff000"을 반환합니다.저는 이 문제를 이렇게 해결했습니다. 누군가를 도울 수도 있습니다.

        SolidBrush guideLineColor;
        if (inputColor.Any(c => char.IsDigit(c)))
        {
            string colorcode = inputColor;
            int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
             guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));

        }
        else
        {
            Color col = Color.FromName(inputColor);
             guideLineColor = new SolidBrush(col);
        }

InputColor는 ColorDialog의 반환 값입니다.

이 질문에 답해주신 모든 분들께 감사드립니다.그것은 저에게 큰 도움이 됩니다.

여기에는 이미 많은 답이 있습니다.

간단히 말해서, 저는 사용을 제안하는 사람들을 지지합니다.System.Drawing.ColorTranslator.

어떤 사람들은 피하려고 한다는 것을 압니다.System.Windows.Media그래서 다른 해결책이 있습니다, 그리고 당신이 가지고 싶어하기 때문에.System.Drawing.Color당신은 에 대한 참조가 있어야 합니다.System.Drawing이미 프로젝트에 있습니다.

간단히 말해서, 가능하다면 프레임워크를 사용하세요.

보다 완벽한 기본 솔루션

그래서, 어떤 이유로 당신이 피하고 싶다면,System.Drawing.ColorTranslator그리고 자신만의 구현을 만듭니다. 최소한 사양을 존중하도록 해야 합니다.

이 솔루션은 다음과 같은 이점을 제공합니다.#RGB그리고.#RGBA속기 및 확장된 색상 정의

    public static Color ParseHtmlColor(string htmlColor) => Color.FromArgb(HtmlColorToArgb(htmlColor));

    public static int HtmlColorToArgb(string htmlColor, bool requireHexSpecified = false, int defaultAlpha = 0xFF)
    {

        if (string.IsNullOrEmpty(htmlColor))
        {
            throw new ArgumentNullException(nameof(htmlColor));
        }

        if (!htmlColor.StartsWith("#") && requireHexSpecified)
        {
            throw new ArgumentException($"Provided parameter '{htmlColor}' is not valid");
        }

        htmlColor = htmlColor.TrimStart('#');
        

        // int[] symbols 
        var symbolCount = htmlColor.Length;
        var value = int.Parse(htmlColor, System.Globalization.NumberStyles.HexNumber);
        switch (symbolCount)
        {
            case 3: // RGB short hand
            {
                return defaultAlpha << 24
                    | (value & 0xF)
                    | (value & 0xF) << 4
                    | (value & 0xF0) << 4
                    | (value & 0xF0) << 8
                    | (value & 0xF00) << 8
                    | (value & 0xF00) << 12
                    ;
            }
            case 4: // RGBA short hand
            {
                // Inline alpha swap
                return   (value & 0xF) << 24
                       | (value & 0xF) << 28
                       | (value & 0xF0) >> 4
                       | (value & 0xF0) 
                       | (value & 0xF00) 
                       | (value & 0xF00) << 4
                       | (value & 0xF000) << 4
                       | (value & 0xF000) << 8
                       ;
            }
            case 6: // RGB complete definition
            {
                return defaultAlpha << 24 | value;   
            }
            case 8: // RGBA complete definition
            {
                // Alpha swap
                return (value & 0xFF) << 24 | (value >> 8);
            }
            default:
                throw new FormatException("Invalid HTML Color");
        }
    }

어떤 이유로 사용하고 싶지 않은 경우System.Globalization16진수 기호를 구문 분석하기 위해 캡처된 코드를 찾을 수 있을 것입니다.

테스트

    public static void TestColors()
    {
        foreach (var testCase in TestCases) TestColor(testCase);
    }

    static string[] TestCases = new string[] { 
        "111",
        "FFF", 
        "17A",
        "F52",
        "444F",
        "2348",
        "4320",
        "121212",
        "808080",
        "FFFFFF",
        "A0E0C0",
        "0A070B",
        "FFFFFFFF",
        "808080FF",
        "40807710"
    };

    public static void TestColor(string htmlColor)
    {
        Console.Write($" {htmlColor} -> ");
        var color = ParseHtmlColor(htmlColor);
        Console.WriteLine("0x" + color.ToArgb().ToString("X"));
    }

추신: 매개 변수를 자유롭게 제거하십시오. 매개 변수는 형식 오류 및 기본값을 처리하기 위해 기능을 조정하는 방법을 보여주는 것입니다.

추신: 현재로서는 오류 메시지를 설명할 수 없습니다.

  • XNA / 모노게임 (Microsoft).Xna. 프레임워크.색상).
  • 6 또는 8자(알파 포함) 문자 16진수 문자열에 사용 가능
  • 아마도 더 나은 대안(비트 마스킹/이동)이 있을 것입니다.
    using Microsoft.Xna.Framework;
    using System.Globalization;
    
    public static class ColorBuilder
    {
        public static Color FromHex(string color)
        {
            var hex = color.Replace("#", string.Empty);
            var h = NumberStyles.HexNumber;

            var r = int.Parse(hex.Substring(0, 2), h);
            var g = int.Parse(hex.Substring(2, 2), h);
            var b = int.Parse(hex.Substring(4, 2), h);
            var a = 255;

            if (hex.Length == 8)
            {
                a = int.Parse(hex.Substring(6, 2), h);
            }
 
            return new Color(r, g, b, a);
        }
    }
    
    //create a blue color
    var color = ColorBuilder.FromHex("#2733C5"); //or ColorBuilder.FromHex("2733C5");
    
    //create a blue color with 50% alpha
    var colorTrans = ColorBuilder.FromHex("#2733C580");

에 있는 것처럼 해시 코드를 의미하는 경우.GetHashCode()유감스럽게도 당신은 돌아갈 수 없습니다.해시 함수는 양방향이 아니므로 '앞으로'만 이동할 수 있고 뒤로 이동할 수 없습니다.

색상의 16진수 값을 기준으로 색상을 구해야 할 경우 Oded의 제안을 따릅니다.

언급URL : https://stackoverflow.com/questions/2109756/how-do-i-get-the-color-from-a-hexadecimal-color-code-using-net

반응형