Làm cách nào để có được màu từ mã màu thập lục phân bằng .NET?


595

Làm cách nào tôi có thể nhận được màu từ mã màu thập lục phân (ví dụ #FFDFD991)?

Tôi đang đọc một tập tin và đang nhận được mã màu thập lục phân. Tôi cần tạo System.Windows.Media.Colorví dụ tương ứng cho mã màu thập lục phân. Có một phương pháp sẵn có trong khuôn khổ để làm điều này?


3
Bởi mã băm có thể có nghĩa là # 00ff00?
Mark Byers

12
Viky - đừng coi đó là mã băm. Thật khó hiểu. ;-) Đó là biểu diễn thập lục phân của một màu.
Wim Hollebrandse

10
#FF0000là mã màu HTML (hoặc thập lục phân), không phải mã băm. Hãy tìm hiểu sự khác biệt.
SLaks

10
Biểu tượng # được gọi là hàm băm ở nhiều quốc gia, do đó gây nhầm lẫn.
GeoffM

4
@axeman ??? Bạn có thể đã hiểu nhầm những gì GetHashCode () trong C # làm. GetHashCode () là một phương thức trên mọi đối tượng trong .NET. Nó không trả về giá trị thập lục phân từ lớp Màu.
Giăng

Câu trả lời:


736

Tôi cho rằng đó là mã ARGB ... Bạn đang đề cập đến System.Drawing.Colorhay System.Windows.Media.Color? Cái sau được sử dụng trong WPF chẳng hạn. Tôi chưa thấy ai đề cập đến nó, vì vậy trong trường hợp bạn đang tìm kiếm nó:

using System.Windows.Media;

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

@Thorarin bất kỳ trợ giúp nào về cách nhận giá trị alpha vì tôi cần chuyển đổi giá trị này để tương thích với css rgba cho thiết kế web.
Siddharth Pandey

2
@Yoda Hai chữ số đầu tiên (FF) là giá trị alpha. Có lẽ dễ sử dụng Color.FromArgbphương pháp hơn trong trường hợp này. Nếu bạn sử dụng dấu phẩy động alpha, bạn sẽ phải nhân với 255.
Thorarin

2
trong trường hợp bạn có các giá trị RGB -> Color.FromArgb (255,192,0)
Iman

50
chuỗi hex = "#FFFFFF"; Màu _color = System.Drawing.ColorTranslator.FromHtml (hex);
Thống chế Doshi Jain

1
tại sao không sử dụng color.FromArgb () thay thế?
Nimitz E.

549

Giả sử bạn có nghĩa là mã RGB loại HTML (được gọi là mã Hex, chẳng hạn như # FFCC66), hãy sử dụng lớp ColorTranslator :

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

Tuy nhiên, nếu bạn đang sử dụng mã hex ARGB, bạn có thể sử dụng lớp ColorConverter từ không gian tên System.Windows.Media:

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

116

Nếu bạn không muốn sử dụng ColorTranslator, bạn có thể thực hiện dễ dàng:

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

Mã màu chỉ là đại diện thập lục phân của giá trị ARGB.

BIÊN TẬP

Nếu bạn cần sử dụng 4 giá trị thay vì một số nguyên, bạn có thể sử dụng giá trị này (kết hợp nhiều nhận xét):

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

Lưu ý 1 : NumberStyles nằm trong System.Globalization.
Lưu ý 2 : vui lòng cung cấp kiểm tra lỗi của riêng bạn (mã màu phải là giá trị thập lục phân của 6 hoặc 8 ký tự)


3
Color.FromArgb yêu cầu các tham số a, r, g và b, không phải là số nguyên.
công dân

7
Điều này cũng hữu ích nếu bạn đang sử dụng Compact Framework trong đó ColorTranslator không khả dụng
TechyGypo

7
@ user1763532 - Sau khi colorcode = colorcode.Replace("#", "")sử dụng đơn giản int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);và cứ thế cho r, g và b. Đừng quên thay thế tham số đầu tiên của Chuỗi con - chỉ mục - bằng 2 cho r, 4 cho g và 6 cho b.
M. Mimpen

3
@HansKesting, FromArgbnhận 1 tham số trong System.Drawing.Colorvà 4 tham số trongSystem.Windows.Media.Color
torvin

2
Lưu ý điều này hoạt động với màu HTML 4 byte (ví dụ: #FFFFFFFF) (inc alpha). Nếu bạn thử với alpha 3 byte (#FFFFFF) sẽ là 0 và màu của bạn trong suốt. Bạn có thể dễ dàng chèn alpha nếu mã màu nhỏ hơn 8/9 ký tự. Tuyệt vời cho khung nhỏ gọn.
apc

40

Ngoài ra còn có phương pháp mở rộng nhỏ gọn này:

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

Đang sử dụng:

Color color = 0xFFDFD991.ToColor();

6
Có thể là một câu hỏi ngu ngốc, và hơi muộn, nhưng tại sao bạn sử dụng -16777216 cho giá trị alpha?
GeekPeek

3
Biến thể nhỏ nhất quán sử dụng hex: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (byte) (argb & 0xff));
quá

1
Mã này bị lỗi. Tôi không thể hiểu tại sao không có gì hiển thị và hóa ra là vì mã này không chuyển đổi hex thành Colorđúng. Tôi đã sử dụng mã từ @too và nó đã sửa nó.
ub3rst4r

Ở đây có một phiên bản trước câu trả lời này trong: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian

1
Bạn chỉ có thể thực hiện & 0xFFtrên giá trị giảm tốc cuối cùng mỗi lần, thay vì cần tất cả các giá trị khác nhau với &nó.
Nyerguds

39

Ba biến thể dưới đây cho màu sắc chính xác. Cái cuối cùng có lợi ích là được làm nổi bật trong Visual Studio 2010 IDE (có thể đó là ReSharper đang làm điều đó) với màu sắc phù hợp.

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

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

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

7
Không ai trong số này trở lại 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
Trong UWP Color.FromArgb () yêu cầu đối số 4 byte. Vì vậy, nó sẽ trông giống như: return Color.FromArgb (255, byte.Pude (hex.Sub chuỗi (0, 2), System.Globalization.NumberStyles.HexNumber), byte.Pude (hex.Subopes (2, 2), System. Toàn cầu hóa.NumberStyles.HexNumber), byte.Pude (hex.Sub chuỗi (4, 2), System.Globalization.NumberStyles.HexNumber));
Kibernetik 16/07/2016

13

Tôi cần phải chuyển đổi mã màu HEX thành System.Drawing.Color, cụ thể là màu Alice Blue làm nền trên biểu mẫu WPF và thấy mất nhiều thời gian hơn dự kiến ​​để tìm câu trả lời:

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

Bạn có thể sử dụng mã sau đây:

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

5

Nếu bạn muốn làm điều đó với Ứng dụng Windows Store, hãy theo dõi @Hans Kesting và @Jink trả lời:

    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

Bài đăng này đã trở thành goto cho bất cứ ai đang cố gắng chuyển đổi từ mã màu hex sang màu hệ thống. Do đó, tôi nghĩ rằng tôi nên thêm một giải pháp toàn diện liên quan đến cả hai giá trị hex 6 chữ số (RGB) và 8 chữ số (ARGB).

Theo mặc định, theo Microsoft, khi chuyển đổi từ giá trị RGB sang ARGB

Giá trị alpha hoàn toàn là 255 (hoàn toàn mờ đục).

Điều này có nghĩa là bằng cách thêm FF vào mã màu hex gồm 6 chữ số (RGB), nó trở thành mã màu hex ARGB 8 chữ số. Do đó, một phương pháp đơn giản có thể được tạo để xử lý cả hex của ARGB và RGB và chuyển đổi chúng thành cấu trúc Màu thích hợp.

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

    }

Điều này được lấy cảm hứng từ câu trả lời của Hans Kesting.



0

WPF:

using System.Windows.Media;

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

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

Trên thực tế, không có hex nhưngColor [Indigo]
George Lanetz

0

Sử dụng

System.Drawing.Color.FromArgb(myHashCode);

2
Liếc qua chuyển đổi từ chuỗi hex sang int?
Thorarin

Ban đầu câu hỏi được hỏi là "Làm thế nào để có được màu từ mã băm", điều này tạo ra rất nhiều nhầm lẫn ở đây. ;-)
herzmeister

0

Nếu bạn có nghĩa là HashCode như trong .GetHashCode(), tôi sợ bạn không thể quay lại. Các hàm băm không phải là hai hướng, bạn chỉ có thể đi tiếp, không quay lại.

Làm theo gợi ý của Oded nếu bạn cần lấy màu dựa trên giá trị thập lục phân của màu.


@Wim Cảm ơn đã giúp OP làm rõ câu hỏi. Tôi muốn nói rằng câu trả lời này không còn cần thiết nữa, và khuyên bạn nên xóa nó.
jpaugh

0

Tôi đã sử dụng ColorDialog trong dự án của mình. ColorDialog đôi khi trả về "Red", "Fhushia" và đôi khi trả về "fff000". Tôi đã giải quyết vấn đề như thế này có thể giúp được ai đó.

        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 là giá trị trả về từ ColorDialog.

Cảm ơn mọi người đã trả lời câu hỏi này. Nó giúp tôi rất nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.