Bagaimana cara mendapatkan warna dari kode warna heksadesimal menggunakan .NET?

595

Bagaimana saya bisa mendapatkan warna dari kode warna heksadesimal (misalnya #FFDFD991)?

Saya membaca file dan mendapatkan kode warna heksadesimal. Saya perlu membuat System.Windows.Media.Colorcontoh yang sesuai untuk kode warna heksadesimal. Apakah ada metode inbuilt dalam kerangka kerja untuk melakukan ini?

viky
sumber
3
Dengan kode hash, mungkin itu artinya # 00ff00?
Mark Byers
12
Viky - tidak mengacu pada yang sebagai kode hash. Ini membingungkan. ;-) Ini adalah representasi warna heksadesimal.
Wim Hollebrandse
10
#FF0000adalah kode warna HTML (atau heksadesimal), bukan kode hash. Silakan pelajari perbedaannya.
SLaks
10
Simbol # disebut hash di banyak negara, karena itu membingungkan.
GeoffM
4
@axeman ??? Anda mungkin salah paham tentang apa yang dilakukan GetHashCode () di C #. GetHashCode () adalah metode pada setiap objek di .NET. Itu tidak mengembalikan nilai heksadesimal dari kelas Warna.
John

Jawaban:

736

Saya berasumsi itu adalah kode ARGB ... Apakah Anda mengacu pada System.Drawing.Coloratau System.Windows.Media.Color? Yang terakhir digunakan dalam WPF misalnya. Saya belum melihat ada yang menyebutkannya, jadi kalau-kalau Anda mencarinya:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Thorarin
sumber
@ Talarin bantuan tentang cara mendapatkan nilai alfa karena saya perlu mengkonversi nilai ini agar kompatibel dengan css rgba untuk desain web.
Siddharth Pandey
2
@Yoda Dua digit pertama (FF) adalah nilai alfa. Mungkin lebih mudah untuk menggunakan Color.FromArgbmetode ini dalam kasus ini. Jika Anda menggunakan floating point alpha, Anda harus mengalikannya dengan 255.
Thorarin
2
jika Anda memiliki nilai RGB -> Color.FromArgb (255.192,0)
Iman
50
string hex = "#FFFFFF"; Warna _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain
1
mengapa tidak menggunakan color.FromArgb ()?
Nimitz E.
549

Dengan asumsi Anda maksud kode HTML jenis HTML (disebut kode Hex, seperti # FFCC66), gunakan kelas ColorTranslator :

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

Namun, jika Anda menggunakan kode hex ARGB, Anda bisa menggunakan kelas ColorConverter dari namespace System.Windows.Media:

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

Jika Anda tidak ingin menggunakan ColorTranslator, Anda dapat melakukannya dengan mudah:

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

Kode warna hanyalah representasi heksadesimal dari nilai ARGB.

EDIT

Jika Anda perlu menggunakan 4 nilai alih-alih bilangan bulat tunggal, Anda dapat menggunakan ini (menggabungkan beberapa komentar):

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

Catatan 1 : NumberStyles ada di System.Globalisasi.
Catatan 2 : berikan pemeriksaan kesalahan Anda sendiri (kode warna harus berupa nilai heksadesimal 6 atau 8 karakter)

Hans Ke st ing
sumber
3
Color.FromArgb membutuhkan parameter a, r, g, dan b, bukan bilangan bulat.
Warga negara terhubung
7
Ini juga berguna jika Anda menggunakan Compact Framework di mana ColorTranslator tidak tersedia
TechyGypo
7
@ user1763532 - Setelah colorcode = colorcode.Replace("#", "")cukup gunakan int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);dan seterusnya untuk r, g, dan b. Jangan lupa ganti parameter Substring pertama - indeks - dengan 2 untuk r, 4 untuk g dan 6 untuk b.
M. Mimpen
3
@HansKesting, FromArgbmengambil 1 parameter dalam System.Drawing.Colordan 4 parameter dalamSystem.Windows.Media.Color
torvin
2
Perhatikan ini berfungsi untuk warna HTML 4 byte (mis. #FFFFFFFF) (inc alpha). Jika Anda mencoba dengan 3 byte (#FFFFFF) alpha akan menjadi 0 dan warna Anda transparan. Anda dapat dengan mudah memasukkan alpha jika kode warna kurang dari 8/9 karakter. Bagus untuk Kerangka Kerja Compact.
apc
40

Ada juga metode ekstensi kecil yang rapi ini:

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

Digunakan:

Color color = 0xFFDFD991.ToColor();
Pengelakan
sumber
6
Mungkin pertanyaan bodoh, dan sedikit terlambat, tapi mengapa Anda menggunakan -16777216 untuk nilai alpha?
GeekPeek
3
Variasi kecil secara konsisten menggunakan hex: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (byte) (argb & 0xff));
juga
1
Kode ini salah. Saya tidak tahu mengapa tidak ada yang muncul dan ternyata karena kode ini tidak mengkonversi hex dengan Colorbenar. Saya menggunakan kode dari @too dan memperbaikinya.
ub3rst4r
Di sini ada versi sebelumnya jawaban ini dalam: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian
1
Anda hanya dapat melakukan & 0xFFpada nilai downshifted akhir setiap kali, alih-alih membutuhkan semua nilai yang berbeda &dengannya.
Nyerguds
39

Tiga varian di bawah ini memberikan warna yang persis sama. Yang terakhir memiliki manfaat yang disorot dalam Visual Studio 2010 IDE (mungkin itu ReSharper yang melakukannya) dengan warna yang tepat.

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

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

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);
demp
sumber
7
Tak satu pun dari pengembalian ini 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));
    }
Baddack
sumber
2
Dalam UWP Color.FromArgb () membutuhkan argumen 4 byte. Jadi akan terlihat seperti: return Color.FromArgb (255, byte.Parse (hex.Substring (0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (2, 2), System. Globalisasi.NumberStyles.HexNumber), byte.Parse (hex.Substring (4, 2), System.Globalization.NumberStyles.HexNumber));
Kibernetik
13

Saya perlu mengubah kode warna HEX ke System.Drawing.Color, khususnya warna Alice Blue sebagai latar belakang pada formulir WPF dan merasa butuh waktu lebih lama dari yang diharapkan untuk menemukan jawabannya:

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));
Bingung
sumber
11

Anda dapat menggunakan kode berikut:

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

Jika Anda ingin melakukannya dengan Aplikasi Windows Store, ikuti dengan @Hans Kesting dan @Jink jawab:

    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));
Youngjae
sumber
4

Posting ini telah menjadi kebohongan bagi siapa pun yang mencoba mengkonversi dari kode warna hex ke warna sistem. Oleh karena itu, saya pikir saya akan menambahkan solusi komprehensif yang berhubungan dengan nilai hex 6 digit (RGB) dan 8 digit (ARGB).

Secara default, menurut Microsoft, ketika mengkonversi dari nilai RGB ke ARGB

Nilai alpha secara implisit 255 (sepenuhnya buram).

Ini berarti dengan menambahkan FF ke kode warna hex 6 digit (RGB) itu menjadi kode warna hex ARGB 8 digit. Oleh karena itu, metode sederhana dapat dibuat yang menangani ARGB dan RGB hex dan mengubahnya menjadi struct Warna yang sesuai.

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

    }

Ini terinspirasi oleh jawaban Hans Kesting.

Justin
sumber
0

WPF:

using System.Windows.Media;

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

//color to hex
string hexcolor = color.ToString();
DevXP
sumber
Sebenarnya, tidak ada hex tetapiColor [Indigo]
George Lanetz
0

Menggunakan

System.Drawing.Color.FromArgb(myHashCode);
herzmeister
sumber
2
Melirik konversi dari hex string ke int?
Thorarin
Awalnya pertanyaan itu ditanyakan sebagai "Bagaimana cara mendapatkan warna dari kode hash" yang menciptakan banyak kebingungan di sini. ;-)
herzmeister
0

Jika maksud Anda HashCode seperti dalam .GetHashCode(), saya khawatir Anda tidak bisa kembali. Fungsi hash bukan dua arah, Anda bisa maju saja, tidak mundur.

Ikuti saran Oded jika Anda perlu mendapatkan warna berdasarkan nilai heksadesimal dari warna tersebut.

Wim Hollebrandse
sumber
@Wim Terima kasih telah membantu OP mengklarifikasi pertanyaan. Saya akan mengatakan jawaban ini tidak lagi diperlukan, dan merekomendasikan untuk menghapusnya.
jpaugh
0

Saya menggunakan ColorDialog dalam proyek saya. ColorDialog kadang-kadang mengembalikan "Merah", "Fhushia" dan kadang-kadang mengembalikan "fff000". Saya memecahkan masalah ini seperti ini mungkin membantu seseorang.

        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 adalah nilai balik dari ColorDialog.

Terima kasih semuanya untuk menjawab pertanyaan ini. Ini sangat membantu saya.

Cevdet
sumber