ฉันจะรับสีจากรหัสสีฐานสิบหกโดยใช้. NET ได้อย่างไร


595

ฉันจะรับสีจากรหัสสีฐานสิบหก (เช่น#FFDFD991) ได้อย่างไร

ฉันกำลังอ่านไฟล์และกำลังได้รับรหัสสีฐานสิบหก ฉันต้องการสร้างSystem.Windows.Media.Colorอินสแตนซ์ที่สอดคล้องกันสำหรับรหัสสีฐานสิบหก มีวิธีการ inbuilt ในกรอบการทำเช่นนี้?


3
โดยแฮรหัสพวกเขาอาจหมายถึง # 00ff00?
Mark Byers

12
Viky - อย่าอ้างว่าเป็นรหัสแฮช มันสับสน ;-) มันคือการแทนสีฐานสิบหก
Wim Hollebrandse

10
#FF0000คือรหัสสี HTML (หรือเลขฐานสิบหก) ไม่ใช่รหัสแฮช โปรดเรียนรู้ความแตกต่าง
slaks

10
สัญลักษณ์ # ถูกเรียกว่าแฮชในหลายประเทศดังนั้นความสับสน
GeoffM

4
@axeman ??? คุณอาจเข้าใจผิดว่า GetHashCode () ใน C # ทำอะไร GetHashCode () เป็นวิธีการในทุกวัตถุใน. NET มันจะไม่ส่งคืนค่าเลขฐานสิบหกจากคลาส Color
จอห์น

คำตอบ:


736

ฉันสมมติว่าเป็นรหัส ARGB ... คุณหมายถึงSystem.Drawing.ColorหรือSystem.Windows.Media.Color? หลังถูกใช้ใน WPF เช่น ฉันยังไม่เห็นใครพูดถึงดังนั้นในกรณีที่คุณกำลังมองหา:

using System.Windows.Media;

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

@Thorarin ความช่วยเหลือใด ๆ เกี่ยวกับวิธีการรับค่า alpha ตามที่ฉันต้องการแปลงค่านี้ให้เข้ากันได้กับ css rgba สำหรับการออกแบบเว็บ
Siddharth Pandey

2
@Yoda ตัวเลขสองหลักแรก (FF) คือค่าอัลฟา มันอาจจะง่ายกว่าที่จะใช้Color.FromArgbวิธีการในกรณีนี้ หากคุณใช้จุดลอยตัวอัลฟ่าคุณจะต้องคูณด้วย 255
Thorarin

2
ในกรณีที่คุณมีค่า RGB -> Color.FromArgb (255,192,0)
Iman

50
string hex = "#FFFFFF"; สี _color = System.Drawing.ColorTranslator.FromHtml (ฐานสิบหก);
Harshal Doshi Jain

1
ทำไมไม่ใช้ color.FromArgb () แทน
Nimitz E.

549

สมมติว่าคุณหมายถึงรหัส RGB ประเภท HTML (เรียกว่ารหัส Hex เช่น # FFCC66) ให้ใช้คลาสColorTranslator :

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

อย่างไรก็ตามหากคุณใช้รหัสฐานสิบหก ARGB คุณสามารถใช้คลาสColorConverterจาก System.Windows.Media namespace:

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

116

หากคุณไม่ต้องการใช้ ColorTranslator คุณสามารถทำได้โดยง่าย:

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

รหัสสีเป็นเพียงการแสดงเลขฐานสิบหกของค่า ARGB

แก้ไข

หากคุณต้องการใช้ 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 อยู่ใน System.Globalization
หมายเหตุ 2 : โปรดระบุการตรวจสอบข้อผิดพลาดของคุณเอง (รหัสสีควรเป็นเลขฐานสิบหกที่มีความยาว 6 หรือ 8 ตัวอักษร)


3
Color.FromArgb ต้องการพารามิเตอร์ a, r, g และ b ไม่ใช่จำนวนเต็ม
พลเมืองเริ่ม

7
สิ่งนี้ยังมีประโยชน์หากคุณใช้ Compact Framework ซึ่ง ColorTranslator ไม่สามารถใช้งานได้
TechyGypo

7
@ user1763532 - หลังจากcolorcode = colorcode.Replace("#", "")ใช้ไปเรื่อยint a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);ๆ สำหรับ r, g และ b อย่าลืมแทนที่พารามิเตอร์แรกของ Substring - ดัชนี - ด้วย 2 สำหรับ r, 4 สำหรับ g และ 6 สำหรับ b
M. Mimpen

3
@HansKesting FromArgbรับ 1 พารามิเตอร์ในSystem.Drawing.Colorและ 4 พารามิเตอร์ในSystem.Windows.Media.Color
torvin

2
หมายเหตุทำงานได้กับ 4 ไบต์ (เช่น #FFFFFFFF) สี HTML (inc alpha) หากคุณลองด้วยอัลฟา 3 ไบต์ (#FFFFFF) จะเป็น 0 และสีของคุณจะโปร่งใส คุณสามารถแทรกตัวอักษรได้อย่างง่ายดายหากรหัสสีน้อยกว่า 8/9 ตัวอักษร ยอดเยี่ยมสำหรับ Compact Framework
apc

40

นอกจากนี้ยังมีวิธีการขยายเล็ก ๆ น้อย ๆ ที่เป็นระเบียบ:

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

6
อาจเป็นคำถามที่โง่และช้าไปหน่อย แต่ทำไมคุณถึงใช้ -16777216 สำหรับค่าอัลฟา?
GeekPeek

3
การเปลี่ยนแปลงเล็ก ๆ อย่างสม่ำเสมอโดยใช้ hex: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (ไบต์) (argb & 0xff00) 0x08), (ไบต์) (argb & 0xff));
เกินไป

1
รหัสนี้ผิดพลาด ฉันไม่สามารถเข้าใจได้ว่าทำไมไม่มีอะไรปรากฏขึ้นและกลายเป็นเพราะรหัสนี้ไม่ได้แปลงเลขฐานสิบหกเป็นColorอย่างถูกต้อง ฉันใช้รหัสจาก @too และแก้ไขมัน
ub3rst4r

ที่นี่มีคำตอบก่อนหน้านี้ในรุ่นนี้: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian

1
คุณสามารถทำได้& 0xFFกับมูลค่าดาวน์ชิฟท์สุดท้ายในแต่ละครั้งแทนที่จะต้องการค่าที่แตกต่างทั้งหมดเหล่านั้น&ด้วย
Nyerguds

39

ตัวแปรทั้งสามด้านล่างให้สีเดียวกันทั้งหมด อันสุดท้ายมีประโยชน์ในการเน้นใน 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);

7
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 Color.FromArgb () ต้องมีอาร์กิวเมนต์ 4 ไบต์ ดังนั้นมันจะมีลักษณะดังนี้: ส่งคืน Color.FromArgb (255, byte.Parse (hex.Substring (0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (2, 2)) ระบบ Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (4, 2), System.Globalization.NumberStyles.HexNumber));
Kibernetik

13

ฉันต้องการแปลงรหัสสี HEX เป็น System.Drawing.Color โดยเฉพาะเฉดสีของอลิซบลูเป็นพื้นหลังในรูปแบบ 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));


5

หากคุณต้องการใช้แอพ Windows Store ตามด้วย @Hans Kesting และ @Jink answer:

    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

โพสต์นี้กลายเป็น goto สำหรับทุกคนที่พยายามแปลงจากรหัสสีฐานสิบหกเป็นสีของระบบ ดังนั้นฉันคิดว่าฉันจะเพิ่มโซลูชันที่ครอบคลุมซึ่งเกี่ยวข้องกับค่าเลขฐานสิบหกทั้งหกหลัก (RGB) และ 8 หลัก (ARGB)

ตามค่าเริ่มต้นตาม Microsoft เมื่อแปลงจากค่า RGB เป็น ARGB

ค่าอัลฟ่าคือ 255 (ทึบแสงเต็มที่)

ซึ่งหมายความว่าโดยการเพิ่ม FF ให้กับรหัสสีฐานสิบหก 6 หลัก (RGB) จะกลายเป็นรหัสสีฐานสิบหก ARGB ดังนั้นวิธีการง่ายๆสามารถสร้างขึ้นที่จัดการทั้ง ARGB และ RGB hex และแปลงเป็นโครงสร้างสีที่เหมาะสม

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

    }

นี่เป็นแรงบันดาลใจจากคำตอบของฮันส์เคสติง



0

WPF:

using System.Windows.Media;

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

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

จริงๆแล้วมันไม่มีเลขฐานสิบหก แต่Color [Indigo]
George Lanetz

0

ใช้

System.Drawing.Color.FromArgb(myHashCode);

2
มองผ่านการแปลงจากสตริง hex เป็นint?
Thorarin

แต่เดิมคำถามถูกถามว่า "วิธีการได้สีจากรหัสแฮช" ซึ่งสร้างความสับสนมากมายที่นี่ ;-)
herzmeister

0

ถ้าคุณหมายถึง HashCode เหมือนใน.GetHashCode()ฉันกลัวว่าคุณจะไม่สามารถกลับไป ฟังก์ชันแฮชไม่ได้เป็นแบบสองทิศทางคุณสามารถไปข้างหน้าเท่านั้นไม่กลับ

ทำตามคำแนะนำของ Oded หากคุณต้องการได้สีตามค่าเลขฐานสิบหกของสี


@Wim ขอบคุณที่ช่วย OP ชี้แจงคำถาม ฉันจะบอกว่าคำตอบนี้ไม่จำเป็นอีกต่อไปและแนะนำให้ลบ
jpaugh

0

ฉันใช้ ColorDialog ในโครงการของฉัน ColorDialog ส่งคืน "Red", "Fhushia" บางครั้งและส่งคืน "fff000" ฉันแก้ไขปัญหาเช่นนี้อาจช่วยใครซักคน

        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

ขอบคุณทุกคนที่ตอบคำถามนี้มันช่วยฉันได้มาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.