.NET kullanarak onaltılık renk kodundan rengi nasıl alabilirim?


595

Onaltılık renk kodundan (örn. #FFDFD991) Nasıl renk alabilirim ?

Bir dosya okuyorum ve onaltılık renk kodu alıyorum. System.Windows.Media.ColorOnaltılık renk kodu için karşılık gelen örnek oluşturmak gerekir . Bu çerçevede bunu yapmak için dahili bir yöntem var mı?


3
Hash kodu ile belki # 00ff00 demek isterler?
Mark Byers

12
Viky - vermemeleri bu karma kodu olarak. Kafa karıştırıcı. ;-) Bir rengin onaltılı gösterimi.
Wim Hollebrandse

10
#FF0000HTML (veya onaltılık) renk kodudur, karma kod değildir. Lütfen farkı öğrenin.
SLaks

10
# Sembolü birçok ülkede karma olarak adlandırılır, dolayısıyla karışıklık olur.
GeoffM

4
@axeman ??? C # 'da GetHashCode () ne yanlış anlamış olabilir. GetHashCode (), .NET'teki her nesne için bir yöntemdir . Color sınıfından onaltılık bir değer döndürmez.
John

Yanıtlar:


736

Bunun bir ARGB kodu olduğunu varsayıyorum ... System.Drawing.Colorya da System.Windows.Media.Color? İkincisi, örneğin WPF'de kullanılır. Henüz kimsenin bahsettiğini görmedim, bu yüzden aradığınızda:

using System.Windows.Media;

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

@ Bu değeri web tasarımı için css rgba ile uyumlu olacak şekilde dönüştürmek için alfa değerini nasıl alacağınız konusunda herhangi bir yardım.
Siddharth Pandey

2
@Yoda İlk iki basamak (FF) alfa değeridir. Color.FromArgbBu durumda yöntemi kullanmak muhtemelen daha kolaydır . Kayan nokta alfa kullanırsanız, 255 ile çarpmanız gerekir.
Thorarin

2
RGB değerlerine sahip olmanız durumunda -> Color.FromArgb (255,192,0)
Iman

50
string hex = "#FFFFFF"; Renk _renk = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain

1
neden bunun yerine color.FromArgb () kullanmıyorsunuz?
Nimitz

549

HTML türü RGB kodlarını (# FFCC66 gibi Onaltılık kodlar olarak adlandırılır) kasteddiğinizi varsayarsak, ColorTranslator sınıfını kullanın :

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

Ancak, bir ARGB hex kodu kullanıyorsanız , System.Windows.Media ad alanından ColorConverter sınıfını kullanabilirsiniz :

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

116

ColorTranslator'ı kullanmak istemiyorsanız, kolayca yapabilirsiniz:

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

Renk kodu, ARGB değerinin yalnızca onaltılık gösterimidir.

DÜZENLE

Tek bir tamsayı yerine 4 değer kullanmanız gerekiyorsa, bunu kullanabilirsiniz (birkaç yorumu birleştirerek):

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

Not 1 : NumberStyles System.Globalization içindedir.
Not 2 : Lütfen kendi hata kontrolünüzü sağlayın (renk kodu, 6 veya 8 karakterlik onaltılık bir değer olmalıdır)


3
Color.FromArgb bir tamsayı değil, a, r, g ve b parametreleri gerektirir.
citizen conn

7
Bu, ColorTranslator'ın kullanılamadığı Compact Framework'ü kullanıyorsanız da yararlıdır
TechyGypo

7
@ user1763532 - r, g ve b için colorcode = colorcode.Replace("#", "")basitçe kullanıldıktan sonra int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);. Substring'in ilk parametresini - dizin - r için 2, g için 4 ve b için 6 ile değiştirmeyi unutmayın.
M. Mimpen

3
@HansKesting, FromArgb1 parametre alır System.Drawing.Colorve 4 parametre alırSystem.Windows.Media.Color
torvin

2
Bunun 4 baytlık (ör. #FFFFFFFF) HTML rengi (inc alfa) için işe yaradığını unutmayın. 3 bayt (#FFFFFF) ile denerseniz alfa 0 olur ve renk şeffaf olur. Renk kodu 8/9 karakterden azsa alfa ekleyebilirsiniz. Kompakt Çerçeve için harika.
apc

40

Bu düzgün küçük uzatma yöntemi de var:

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

Kullanımda:

Color color = 0xFFDFD991.ToColor();

6
Belki aptalca bir soru ve biraz geç, ama neden alfa değeri için -16777216 kullanıyorsun?
GeekPeek

3
Onaltılık kullanarak tutarlı bir şekilde küçük varyasyon: dönüş Color.FromArgb ((bayt) ((argb & 0xff000000) >> 0x18), (bayt) ((argb & 0xff0000) >> 0x10), (bayt) ((argb & 0xff00) >> 0x08), (bayt) (argb & 0xff));
Çok

1
Bu kod hatalı. Neden hiçbir şey gösteriliyordu anlayamadım ve bu kod Colordüzgün hex dönüştürmez çünkü olduğu ortaya çıktı . @Too kodu kullandım ve bu düzeltti.
ub3rst4r

İşte bu cevabın önceki bir sürümü var: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian

1
& 0xFFTüm bu farklı değerlere ihtiyaç duymak yerine, her seferinde son küçültülmüş değeri yapabilirsiniz &.
Nyerguds

39

Aşağıdaki üç varyant tam olarak aynı rengi verir. Sonuncusu, uygun renkle Visual Studio 2010 IDE'de (belki de ReSharper yapıyor) vurgulanma avantajına sahiptir.

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

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

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

7
Bu iadelerin hiçbiri System.Windows.Media.Color.
Sinatr

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

2
UWP'de Color.FromArgb () 4 baytlık bağımsız değişkenler gerektirir. Yani şöyle görünecektir: dönüş Color.FromArgb (255, byte.Parse (hex.Substring (0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (2, 2), Sistem. Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (4, 2), System.Globalization.NumberStyles.HexNumber));
Kibernetik

13

HEX renk kodunu bir System.Drawing.Color'a, özellikle WPF formunda bir arka plan olarak Alice Blue'nun bir gölgesine dönüştürmem gerekiyordu ve cevabı bulmak için beklenenden daha uzun sürdü:

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

11

Aşağıdaki kodu kullanabilirsiniz:

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

5

Bunu bir Windows Mağazası Uygulaması ile yapmak istiyorsanız, @Hans Kesting ve @Jink cevabını takip edin:

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

4

Bu yazı, onaltılık renk kodundan sistem rengine dönüştürmeye çalışan herkes için goto haline geldi. Bu nedenle, hem 6 haneli (RGB) hem de 8 haneli (ARGB) hex değerleriyle ilgilenen kapsamlı bir çözüm ekleyeceğimi düşündüm.

Varsayılan olarak, Microsoft'a göre, bir RGB'den ARGB değerine dönüştürürken

Alfa değeri dolaylı olarak 255'tir (tamamen opak).

Bu, 6 basamaklı (RGB) onaltılık renk koduna FF eklenerek 8 basamaklı bir ARGB onaltılık renk kodu haline gelir. Bu nedenle, hem ARGB hem de RGB hex'leri işleyen ve bunları uygun Renk yapısına dönüştüren basit bir yöntem oluşturulabilir.

    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)");

    }

Bu Hans Kesting'in cevabından ilham aldı.



0

WPF:

using System.Windows.Media;

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

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

Aslında, altıgen yok amaColor [Indigo]
George Lanetz

0

kullanım

System.Drawing.Color.FromArgb(myHashCode);

2
Onaltılı dizeden dönüşüme bakışlar int?
Thorarin

Başlangıçta soru "karma koddan renk nasıl elde edilir" şeklinde sorulmuş ve burada çok fazla kafa karışıklığı yaratmıştır. ;-)
herzmeister

0

HashCode demek .GetHashCode()istiyorsan, korkarım geri dönemezsin. Karma işlevleri iki yönlü değildir, yalnızca 'ileri' gidebilir, geri dönemezsiniz.

Rengin onaltılık değerine göre renk almanız gerekiyorsa Oded'in önerisini izleyin.


@Wim OP'nin soruyu netleştirmesine yardımcı olduğunuz için teşekkür ederiz. Bu cevaba artık gerek olmadığını söyleyebilirim ve silmenizi öneririz.
jpaugh

0

Projemde ColorDialog kullandım. ColorDialog bazı "Red", "Fhushia" ve bazen "fff000" döndürür. Bu sorunu çözmüş olabilirim, belki birine yardım et.

        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 tarafından döndürülen değerdir.

Bu soruyu cevapladığı için herkese teşekkürler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.