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?


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

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

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)


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

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

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

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

11

Anda dapat menggunakan kode berikut:

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

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

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.



0

WPF:

using System.Windows.Media;

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

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

Sebenarnya, tidak ada hex tetapiColor [Indigo]
George Lanetz

0

Menggunakan

System.Drawing.Color.FromArgb(myHashCode);

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 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.