แปลง System.Drawing.Color เป็น RGB และ Hex Value


126

การใช้ C # ฉันพยายามพัฒนาสองสิ่งต่อไปนี้ วิธีที่ฉันทำอาจมีปัญหาและต้องการคำแนะนำจากคุณ นอกจากนี้ฉันไม่ทราบว่ามีวิธีการใดที่จะทำเช่นเดียวกัน

private static String HexConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

private static String RGBConverter(System.Drawing.Color c)
{
    String rtn = String.Empty;
    try
    {
        rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
    }
    catch (Exception ex)
    {
        //doing nothing
    }

    return rtn;
}

ขอบคุณ


คำตอบ:


202

ฉันไม่เห็นปัญหาที่นี่ รหัสดูดีสำหรับฉัน

สิ่งเดียวที่ฉันสามารถคิดว่าลอง / จับบล็อกซ้ำซ้อน - สีเป็น struct และ R, G, และ B เป็นไบต์ดังนั้นคไม่สามารถเป็นโมฆะและc.R.ToString(), c.G.ToString()และc.B.ToString()ไม่สามารถล้มเหลวจริง (คน วิธีเดียวที่ฉันจะเห็นว่าพวกเขาล้มเหลวคือ a NullReferenceExceptionและไม่มีสิ่งใดที่สามารถเป็นโมฆะได้)

คุณสามารถทำความสะอาดทั้งหมดได้โดยใช้สิ่งต่อไปนี้:

private static String HexConverter(System.Drawing.Color c)
{
    return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}

private static String RGBConverter(System.Drawing.Color c)
{
    return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}

1
ฉันจะไปไกลถึงขั้นที่จะบอกได้ว่าการบล็อกการลองจับที่ว่างเปล่าควร (เกือบ) ถูกกำจัดให้หมดไป พวกเขามีศักยภาพที่ดีที่จะนำไปสู่รหัสบั๊กกี้หากไม่เป็นเช่นนั้นในตอนนี้เมื่อมีการแก้ไขโค้ดนี้ ยังคง +1 สำหรับรหัสที่ล้างข้อมูลและไปยัง OP +1 สำหรับคำถามที่มีกรอบชัดเจน
JMD

7
ฉันใช้เวลาสักพักเพื่อค้นหา VB equivelant: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl

1
ฉันโพสต์การปรับรหัสของคุณเป็น C # 6 เพื่อเป็นคำตอบอื่น คุณสามารถดูได้ที่นี่
aloisdg ย้ายไปที่ codidact.com

สิ่งนี้จะให้สีที่ไม่ถูกต้องหากสีมีช่องอัลฟา (โปร่งใส) คุณจะได้รับความโปร่งแสงอย่างเต็มที่
LarryBud

@LarryBud จริงแท้แน่นอนและขอขอบคุณที่ชี้ให้เห็น ตัวอย่างของฉันข้ามช่องอัลฟาเพียงเพราะฉันกำลังคีย์ออกจากคำถามเดิมซึ่งไม่ได้รวมไว้ด้วย :)
Ari Roth

189

คุณสามารถทำให้มันง่ายและใช้ตัวแปลสีดั้งเดิม:

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);

จากนั้นแบ่งคู่สีทั้งสามเป็นรูปแบบจำนวนเต็ม:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

7
แต่ถ้าฉันทำแบบนี้ Color red = System.Drawing.Color.Red; สตริง redHex = ColorTranslator ToHtml (สีแดง); มันไม่ได้ให้ค่า Hex
Nazmul

ควรทำอย่างแน่นอนฉันทดสอบโค้ดนั้นโดยเฉพาะและได้ # "FF0000" คุณจะได้อะไร? คุณอาจต้องการอ้างถึง MSDN reference: msdn.microsoft.com/en-us/library/…
Troy Hunt

ลองด้วย Color red = System.Drawing.Color.Red; -> ไม่ได้ให้ # FF0000
Nazmul

9
รหัสที่คุณระบุใช้งานได้ แต่เมื่อฉันเปลี่ยนบรรทัดแรกของรหัสเป็น: Color red = System.Drawing.Color.Red; -> จากนั้นจะไม่ให้รหัสฐานสิบหก มันให้ "สีแดง" เป็นเอาต์พุต
Nazmul

4
@Hoque - ยืนยันแล้ว ColorTranslator ให้ชื่อที่ "เป็นมิตร" กับสี น่ารำคาญขนาดไหน!
anon

38

หากคุณสามารถใช้ C # 6 หรือสูงกว่าคุณจะได้รับประโยชน์จากInterpolated Stringsและเขียนโซลูชันของ @Ari Roth ใหม่เช่นนี้:

ค # 6:

public static class ColorConverterExtensions
{
    public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}";

    public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})";
}

นอกจากนี้:

  • ฉันเพิ่มคำหลักthisเพื่อใช้เป็นวิธีการขยาย
  • เราสามารถใช้คีย์เวิร์ด type stringแทนชื่อคลาสได้
  • เราสามารถใช้ไวยากรณ์แลมบ์ดา
  • ฉันเปลี่ยนชื่อให้ชัดเจนยิ่งขึ้นสำหรับรสนิยมของฉัน

สะอาดจัง ... +1!
Shockwaver


1

ฉันพบวิธีการขยายที่ใช้ได้ดีทีเดียว

public static string ToHex(this Color color)
{
    return String.Format("#{0}{1}{2}{3}"
        , color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X")
        , color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X")
        , color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X")
        , color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X"));
}

อ้างอิง: https://social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code? ฟอรั่ม = winappswithcsharp


ฉันเชื่อว่ามันควรเป็น Hex2 ไม่ใช่ Hex มิฉะนั้นสีอาจสอดแทรกผิด
Mohammed Noureldin

@MohammedNoureldin Hex2 จะไปอยู่ที่ไหนในรหัสฉันเคยเห็นสีที่แตกต่างกันเล็กน้อยบางครั้ง?
user1

ฉันหมายถึงX2แทนXมิฉะนั้นคุณอาจได้รับ1แทนที่จะเป็นอย่าง01นั้นมันจะเป็นปัญหา
Mohammed Noureldin

@MohammedNoureldin ใช่X2แล้วคุณไม่จำเป็นต้องมีcolor.B.ToString("X").Length == 1 ? ternaries ทั้งหมด
ProfK

1

สำหรับรหัสฐานสิบหกลองทำเช่นนี้

  1. รับการแสดง ARGB (Alpha, Red, Green, Blue) สำหรับสี
  2. กรองช่องอัลฟา:& 0x00FFFFFF
  3. จัดรูปแบบค่า (เป็นเลขฐานสิบหก "X6" สำหรับฐานสิบหก)

สำหรับ RGB หนึ่ง

  1. เพียงแค่รูปแบบออก Red , Green, Blueค่า

การดำเนินงาน

private static string HexConverter(Color c) {
  return String.Format("#{0:X6}", c.ToArgb() & 0x00FFFFFF);
}

public static string RgbConverter(Color c) {
  return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.