วิธีการตัดสินใจสีของตัวอักษรในสีขาวหรือสีดำขึ้นอยู่กับสีพื้นหลัง?


220

ฉันต้องการแสดงภาพบางอย่างเช่นตัวอย่างนี้ข้อความแสดงแทน

สีเติมจะถูกกำหนดโดยเขตข้อมูลในฐานข้อมูลที่มีสีเป็นฐานสิบหก (เช่น: ClassX -> Color: # 66FFFF) ตอนนี้ฉันต้องการแสดงข้อมูลข้างต้นสีเติมที่เลือกไว้ (เช่นในภาพด้านบน) แต่ฉันต้องรู้ว่าสีนั้นมืดหรือสว่างดังนั้นฉันรู้ว่าควรจะเป็นคำขาวหรือดำ มีวิธีหรือไม่? TKS


ที่เกี่ยวข้อง ( แต่ยังหลอก): stackoverflow.com/questions/3942878/... stackoverflow.com/questions/3116260/...
JYelton

คำตอบ:


347

อาคารบนของคำตอบให้กับคำถามที่คล้ายกัน

คุณต้องแบ่งรหัสฐานสิบหกออกเป็น 3 ส่วนเพื่อให้ได้ความเข้มของสีแดงสีเขียวและสีน้ำเงินแต่ละรายการ รหัส 2 หลักแต่ละตัวแทนค่าในรูปแบบเลขฐานสิบหก (ฐาน 16) ฉันจะไม่เข้าไปดูรายละเอียดของการแปลงที่นี่พวกมันดูง่าย

เมื่อคุณมีความเข้มของแต่ละสีคุณสามารถกำหนดความเข้มโดยรวมของสีและเลือกข้อความที่เกี่ยวข้อง

if (red*0.299 + green*0.587 + blue*0.114) > 186 use #000000 else use #ffffff

เกณฑ์ของ 186 ขึ้นอยู่กับทฤษฎี แต่สามารถปรับเปลี่ยนเพื่อลิ้มรส จากความคิดเห็นด้านล่างเกณฑ์ 150 อาจทำงานได้ดีขึ้นสำหรับคุณ


แก้ไข:ข้างต้นนั้นง่ายและทำงานได้ดีพอสมควรและดูเหมือนว่าจะได้รับการยอมรับที่ดีที่ StackOverflow อย่างไรก็ตามหนึ่งในความคิดเห็นด้านล่างแสดงให้เห็นว่าอาจนำไปสู่การไม่ปฏิบัติตามหลักเกณฑ์ของ W3C ในบางสถานการณ์ พร้อมกันนี้ฉันได้รับแบบฟอร์มที่แก้ไขซึ่งเลือกความคมชัดสูงสุดตามหลักเกณฑ์เสมอ หากคุณไม่จำเป็นต้องปฏิบัติตามกฎของ W3C ดังนั้นฉันจะใช้สูตรที่เรียบง่ายด้านบน

สูตรที่ให้สำหรับความเปรียบต่างในข้อเสนอแนะของ W3Cคือ(L1 + 0.05) / (L2 + 0.05)โดยที่L1ความสว่างของสีที่เบาที่สุดและL2เป็นความสว่างของความมืดที่สุดในระดับ 0.0-1.0 ความสว่างของสีดำคือ 0.0 และสีขาวคือ 1.0 ดังนั้นการแทนที่ค่าเหล่านั้นช่วยให้คุณกำหนดค่าที่มีความคมชัดสูงสุด หากความคมชัดสำหรับสีดำมากกว่าความคมชัดสำหรับสีขาวให้ใช้สีดำมิฉะนั้นจะใช้สีขาว เนื่องจากความสว่างของสีที่คุณกำลังทดสอบเมื่อLการทดสอบกลายเป็น:

if (L + 0.05) / (0.0 + 0.05) > (1.0 + 0.05) / (L + 0.05) use #000000 else use #ffffff

ทำให้พีชคณิตลดลงเป็น:

if L > sqrt(1.05 * 0.05) - 0.05

หรือประมาณ:

if L > 0.179 use #000000 else use #ffffff

Lสิ่งเดียวที่เหลือคือการคำนวณ สูตรนั้นยังได้รับในแนวทางและดูเหมือนว่าการแปลงจาก sRGB เป็น RGB เชิงเส้นตามด้วยคำแนะนำ ITU-R BT.709สำหรับความส่องสว่าง

for each c in r,g,b:
    c = c / 255.0
    if c <= 0.03928 then c = c/12.92 else c = ((c+0.055)/1.055) ^ 2.4
L = 0.2126 * r + 0.7152 * g + 0.0722 * b

ไม่ควรเปลี่ยนขีด จำกัด 0.179 เนื่องจากเชื่อมโยงกับหลักเกณฑ์ของ W3C หากคุณพบผลลัพธ์ที่ไม่ถูกใจคุณลองสูตรที่เรียบง่ายด้านบน


2
Tks Mark ลองการเปลี่ยนแปลงเล็กน้อย: คำนวณสีแดงสีเขียวและสีน้ำเงินด้วยตัวเลขตัวแรกเท่านั้น (แม่นยำน้อยกว่า แต่เป็นตัวเลขที่มีน้ำหนักมากกว่า) และแทนที่จะใช้ 186 ครั้งใช้งานได้ดีขึ้นเล็กน้อยสำหรับฉันโดยเฉพาะกับกรีน
DJPB

2
สูตรนี้มันผิดมาก ในตัวอย่างหนึ่งมันให้ค่าสีเหลือง#D6B508เท่ากับ 171 ดังนั้นจึงเป็นสีขาว อย่างไรก็ตามความคมชัดควรเป็นสีดำ (ยืนยันที่นี่: webaim.org/resources/contrastchecker )
McGarnagle

1
@ MarkRansom ใช่ตาสีดำของฉันดูดีขึ้นมากด้วยสีเหลืองที่ เนื่องจากฉันทำงานกับชุดสีที่ จำกัด ฉันจึงสามารถเปลี่ยนการตัดจาก 186 เป็นค่าที่ต่ำกว่าได้
McGarnagle

3
นี่เป็นอีกตัวอย่างหนึ่งที่เปรียบเทียบสองสูตรที่ให้ไว้ในคำตอบนี้ การใช้เครื่องมือเลือกสี (ใน Firefox หรือ Chrome ล่าสุด) คุณสามารถตรวจสอบความคมชัดของสีใด ๆ
chetstone

3
หลังจากเล่นด้วยการสาธิตของ @ chetstone มาสักพักหนึ่งฉันคิดว่าสูตรง่าย ๆ ทำงานได้ดีที่สุดสำหรับฉันยกเว้นว่าฉันไม่เห็นด้วยกับการแนะนำขีด จำกัด จากผลของสีเขียวบริสุทธิ์ฉันพยายามตั้งค่าขีด จำกัด เป็น 149 และใช้งานได้ดีกว่ามากในความคิดของฉัน ฉันทำซอใบ้จริงๆที่จะแสดงให้เห็นถึงนี้ ; คุณสามารถลองเปลี่ยนขีด จำกัด ที่ด้านบนกลับเพื่อดูคำแนะนำเดิม
Miral

30

ฉันไม่ได้รับเครดิตสำหรับรหัสนี้เนื่องจากไม่ใช่ของฉัน แต่ฉันปล่อยไว้ที่นี่เพื่อให้ผู้อื่นค้นพบได้อย่างรวดเร็วในอนาคต:

จากคำตอบของ Mark Ransoms ต่อไปนี้เป็นข้อมูลโค้ดสำหรับเวอร์ชั่นง่าย ๆ :

function pickTextColorBasedOnBgColorSimple(bgColor, lightColor, darkColor) {
  var color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor;
  var r = parseInt(color.substring(0, 2), 16); // hexToR
  var g = parseInt(color.substring(2, 4), 16); // hexToG
  var b = parseInt(color.substring(4, 6), 16); // hexToB
  return (((r * 0.299) + (g * 0.587) + (b * 0.114)) > 186) ?
    darkColor : lightColor;
}

และนี่คือข้อมูลโค้ดสำหรับรุ่นขั้นสูง:

function pickTextColorBasedOnBgColorAdvanced(bgColor, lightColor, darkColor) {
  var color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor;
  var r = parseInt(color.substring(0, 2), 16); // hexToR
  var g = parseInt(color.substring(2, 4), 16); // hexToG
  var b = parseInt(color.substring(4, 6), 16); // hexToB
  var uicolors = [r / 255, g / 255, b / 255];
  var c = uicolors.map((col) => {
    if (col <= 0.03928) {
      return col / 12.92;
    }
    return Math.pow((col + 0.055) / 1.055, 2.4);
  });
  var L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);
  return (L > 0.179) ? darkColor : lightColor;
}

หากต้องการใช้พวกเขาเพียงแค่โทร:

var color = '#EEACAE' // this can be any color
pickTextColorBasedOnBgColorSimple(color, '#FFFFFF', '#000000');

นอกจากนี้ขอขอบคุณและAlxchetstone


1
ฉันใช้ฟังก์ชั่นง่าย ๆ แล้วดึงมันลงไปอีกเล็กน้อย: ลดพารามิเตอร์ 2 ตัวสุดท้ายและเปลี่ยนเป็นเพียงisDark(bgColor)การใช้งานของฉันแล้ว'color': isDark(color)?'white':'black'
diynevala

1
ทำงานเหมือนเสน่ห์สำหรับฉัน ขอบคุณมาก! ทำมันใน php เพียงแค่แปลงไวยากรณ์และฟังก์ชั่น
CezarBastos

18

วิธีนี้เกี่ยวกับ (รหัส JavaScript)

/**
 * Get color (black/white) depending on bgColor so it would be clearly seen.
 * @param bgColor
 * @returns {string}
 */
getColorByBgColor(bgColor) {
    if (!bgColor) { return ''; }
    return (parseInt(bgColor.replace('#', ''), 16) > 0xffffff / 2) ? '#000' : '#fff';
}

1
วิธีนี้ใช้งานได้ตลอดเวลา แต่มีบางกรณีเช่นi.imgur.com/3pOUDe5.jpgที่ดูแปลก ๆ สีพื้นหลังเป็น rgb จริง (6, 247, 241);
madprops

ฉันขอขอบคุณนี่เป็นวิธีที่ค่อนข้างถูกในการคำนวณความคมชัดในกรณีที่คุณยังไม่ได้แปลงสีเป็นค่า rgb (ไม่ใช่ว่ายากเกินไปเพียงแค่ขั้นตอนทางคณิตศาสตร์เพิ่มเติม)
frumbert

12

นอกจากโซลูชันทางคณิตศาสตร์แล้วยังสามารถใช้โครงข่ายประสาทเทียม AI ได้อีกด้วย ข้อดีคือคุณสามารถปรับแต่งให้เหมาะกับรสนิยมและความต้องการของคุณ (เช่นตัวอักษรสีขาวบนสีแดงอิ่มตัวที่ดูดีและสามารถอ่านได้เช่นเดียวกับสีดำ)

นี่คือตัวอย่างของ Javascript ที่เรียบร้อยที่แสดงแนวคิด คุณยังสามารถสร้างสูตร JS ของคุณเองได้ในการสาธิต

https://harthur.github.io/brain/

แผนภูมิด้านล่างนี้เป็นบางส่วนที่ช่วยให้ฉันสามารถแก้ไขปัญหาได้ ในแผนภูมิแรกความสว่างมีค่าคงที่ 128 ขณะที่เฉดสีและความอิ่มตัวของสีแตกต่างกันไป ในแผนภูมิที่สองความอิ่มตัวของสีคือค่าคงที่ 255 ในขณะที่สีและความสว่างแตกต่างกันไป

ในแผนภูมิแรกความสว่างมีค่าคงที่ 128 ขณะที่เฉดสีและความอิ่มตัวแตกต่างกันไป:

ความอิ่มตัวเป็นค่าคงที่ 255 ในขณะที่สีและความสว่างแตกต่างกันไป:


8

นี่คือทางออกของฉันใน Java สำหรับ Android:

// Put this method in whichever class you deem appropriate
// static or non-static, up to you.
public static int getContrastColor(int colorIntValue) {
    int red = Color.red(colorIntValue);
    int green = Color.green(colorIntValue);
    int blue = Color.blue(colorIntValue);
    double lum = (((0.299 * red) + ((0.587 * green) + (0.114 * blue))));
    return lum > 186 ? 0xFF000000 : 0xFFFFFFFF;
}

// Usage
// If Color is represented as HEX code:
String colorHex = "#484588";
int color = Color.parseColor(colorHex);

// Or if color is Integer:
int color = 0xFF484588;

// Get White (0xFFFFFFFF) or Black (0xFF000000)
int contrastColor = WhateverClass.getContrastColor(color);

2
มัน 'สมบูรณ์แบบ' จริงเหรอ? ลองพื้นหลังสีเขียวบริสุทธิ์ # 00FF00
Andreas Rejbrand

เป็นความจริงแล้วนี่ไม่ได้ทดสอบสำหรับทุกสี .... แต่ใครจะใช้พื้นหลังสีเขียวบริสุทธิ์สำหรับทุกสิ่งที่ไม่ได้ออกแบบมาเพื่อรบกวนผู้ใช้
mwieczorek

@mwieczorek ผู้ที่พึ่งพาเนื้อหาที่ผู้ใช้สร้างขึ้นหรือสีที่เลือกแบบสุ่มทำ
Marc Plano-Lesay

4

จากคำตอบของ @MarkRansom ฉันสร้างสคริปต์ PHP ที่คุณสามารถหาได้ที่นี่:

function calcC($c) {
    if ($c <= 0.03928) {
        return $c / 12.92;
    }
    else {
        return pow(($c + 0.055) / 1.055, 2.4);
    }
}

function cutHex($h) {
    return ($h[0] == "#") ? substr($h, 1, 7) : $h;
}

function hexToR($h) {
    return hexdec(substr(cutHex($h), 0, 2));
}

function hexToG($h) {
    return hexdec(substr(cutHex($h), 2, 2)); // Edited
}

function hexToB($h) {
    return hexdec(substr(cutHex($h), 4, 2)); // Edited
}

function computeTextColor($color) {
    $r = hexToR($color);
    $g = hexToG($color);
    $b = hexToB($color);
    $uicolors = [$r / 255, $g / 255, $b / 255];


    $c = array_map("calcC", $uicolors);

    $l = 0.2126 * $c[0] + 0.7152 * $c[1] + 0.0722 * $c[2];
    return ($l > 0.179) ? '#000000' : '#ffffff';
}

3

นี่เป็นคำตอบของ Mark Ransom ที่รวดเร็วในฐานะส่วนเสริมของ UIColor

extension UIColor {

// Get the rgba components in CGFloat
var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
    var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0

    getRed(&red, green: &green, blue: &blue, alpha: &alpha)

    return (red, green, blue, alpha)
}

/// Return the better contrasting color, white or black
func contrastColor() -> UIColor {
    let rgbArray = [rgba.red, rgba.green, rgba.blue]

    let luminanceArray = rgbArray.map({ value -> (CGFloat) in
        if value < 0.03928 {
            return (value / 12.92)
        } else {
            return (pow( (value + 0.55) / 1.055, 2.4) )
        }
    })

    let luminance = 0.2126 * luminanceArray[0] +
        0.7152 * luminanceArray[1] +
        0.0722 * luminanceArray[2]

    return luminance > 0.179 ? UIColor.black : UIColor.white
} }

2

นี่เป็นเพียงตัวอย่างที่จะเปลี่ยนสีของเครื่องหมายถูก SVG เมื่อคลิกที่องค์ประกอบ มันจะตั้งค่าสีของเครื่องหมายถูกเป็นสีดำหรือสีขาวตามสีพื้นหลังขององค์ประกอบที่คลิก

checkmarkColor: function(el) {
    var self = el;
    var contrast = function checkContrast(rgb) {
        // @TODO check for HEX value

        // Get RGB value between parenthesis, and remove any whitespace
        rgb = rgb.split(/\(([^)]+)\)/)[1].replace(/ /g, '');

        // map RGB values to variables
        var r = parseInt(rgb.split(',')[0], 10),
            g = parseInt(rgb.split(',')[1], 10),
            b = parseInt(rgb.split(',')[2], 10),
            a;

        // if RGBA, map alpha to variable (not currently in use)
        if (rgb.split(',')[3] !== null) {
            a = parseInt(rgb.split(',')[3], 10);
        }

        // calculate contrast of color (standard grayscale algorithmic formula)
        var contrast = (Math.round(r * 299) + Math.round(g * 587) + Math.round(b * 114)) / 1000;

        return (contrast >= 128) ? 'black' : 'white';
    };

    $('#steps .step.color .color-item .icon-ui-checkmark-shadow svg').css({
        'fill': contrast($(self).css('background-color'))
    });
}

onClickExtColor: function(evt) {
    var self = this;

    self.checkmarkColor(evt.currentTarget);
}

https://gist.github.com/dcondrey/183971f17808e9277572


2

ฉันจะใช้ฟังก์ชัน JavaScript นี้เพื่อแปลงrgb/ rgbaการหรือ'white''black'

function getTextColor(rgba) {
    rgba = rgba.match(/\d+/g);
    if ((rgba[0] * 0.299) + (rgba[1] * 0.587) + (rgba[2] * 0.114) > 186) {
        return 'black';
    } else {
        return 'white';
    }
}

คุณสามารถป้อนรูปแบบใดก็ได้และจะออก'black'หรือ'white'

  • rgb(255,255,255)
  • rgba(255,255,255,0.1)
  • color:rgba(255,255,255,0.1)
  • 255,255,255,0.1

ทีนี้ลองทำสิ่งนี้ด้วยพื้นหลังสีเขียวบริสุทธิ์: # 00FF00
Andreas Rejbrand

ขอบคุณสำหรับสิ่งนี้! แปลอย่างรวดเร็วและใช้ในแอพ iOS ของฉัน!
ลูคัสพี

2

คำตอบโดยละเอียดของ Mark นั้นเยี่ยมยอด นี่คือการใช้งานใน javascript:

function lum(rgb) {
    var lrgb = [];
    rgb.forEach(function(c) {
        c = c / 255.0;
        if (c <= 0.03928) {
            c = c / 12.92;
        } else {
            c = Math.pow((c + 0.055) / 1.055, 2.4);
        }
        lrgb.push(c);
    });
    var lum = 0.2126 * lrgb[0] + 0.7152 * lrgb[1] + 0.0722 * lrgb[2];
    return (lum > 0.179) ? '#000000' : '#ffffff';
}

จากนั้นสามารถเรียกใช้ฟังก์ชันนี้lum([111, 22, 255])เพื่อให้ได้สีขาวหรือดำ


1

ฉันไม่เคยทำอะไรแบบนี้มาก่อน แต่สิ่งที่เกี่ยวกับการเขียนฟังก์ชันเพื่อตรวจสอบค่าของแต่ละสีเทียบกับค่ามัธยฐานของ Hex 7F (FF / 2) หากสองในสามสีมากกว่า 7F แสดงว่าคุณกำลังใช้สีเข้มกว่า


1

ขึ้นอยู่กับปัจจัยการผลิตที่แตกต่างกันจากลิงค์ทำให้พื้นหน้าสีดำหรือสีขาวขึ้นอยู่กับพื้นหลังและหัวข้อนี้ฉันได้ทำคลาสต่อขยายสำหรับสีที่ให้ความคมชัดที่คุณต้องการ

รหัสจะเป็นดังนี้:

 public static class ColorExtension
{       
    public static int PerceivedBrightness(this Color c)
    {
        return (int)Math.Sqrt(
        c.R * c.R * .299 +
        c.G * c.G * .587 +
        c.B * c.B * .114);
    }
    public static Color ContrastColor(this Color iColor, Color darkColor,Color lightColor)
    {
        //  Counting the perceptive luminance (aka luma) - human eye favors green color... 
        double luma = (iColor.PerceivedBrightness() / 255);

        // Return black for bright colors, white for dark colors
        return luma > 0.5 ? darkColor : lightColor;
    }
    public static Color ContrastColor(this Color iColor) => iColor.ContrastColor(Color.Black);
    public static Color ContrastColor(this Color iColor, Color darkColor) => iColor.ContrastColor(darkColor, Color.White);
    // Converts a given Color to gray
    public static Color ToGray(this Color input)
    {
        int g = (int)(input.R * .299) + (int)(input.G * .587) + (int)(input.B * .114);
        return Color.FromArgb(input.A, g, g, g);
    }
}

1

ถ้าอย่างฉันคุณกำลังมองหารุ่น RGBA ที่คำนึงถึงอัลฟ่านี่คือสิ่งที่ใช้งานได้ดีเพื่อให้มีความเปรียบต่างสูง

function getContrastColor(R, G, B, A) {
  const brightness = R * 0.299 + G * 0.587 + B * 0.114 + (1 - A) * 255;

  return brightness > 186 ? "#000000" : "#FFFFFF";
}

1

นี่เป็นคำตอบของ Mark Ransom รุ่น R โดยใช้ base R เท่านั้น

hex_bw <- function(hex_code) {

  myrgb <- as.integer(col2rgb(hex_code))

  rgb_conv <- lapply(myrgb, function(x) {
    i <- x / 255
    if (i <= 0.03928) {
      i <- i / 12.92
    } else {
      i <- ((i + 0.055) / 1.055) ^ 2.4
    }
    return(i)
  })

 rgb_calc <- (0.2126*rgb_conv[[1]]) + (0.7152*rgb_conv[[2]]) + (0.0722*rgb_conv[[3]])

 if (rgb_calc > 0.179) return("#000000") else return("#ffffff")

}

> hex_bw("#8FBC8F")
[1] "#000000"
> hex_bw("#7fa5e3")
[1] "#000000"
> hex_bw("#0054de")
[1] "#ffffff"
> hex_bw("#2064d4")
[1] "#ffffff"
> hex_bw("#5387db")
[1] "#000000"

0

@ SoBiT ฉันกำลังดูคำตอบของคุณซึ่งดูดี แต่มีข้อผิดพลาดเล็กน้อยในนั้น ฟังก์ชัน hexToG ของคุณและ hextoB ต้องการการแก้ไขเล็กน้อย ตัวเลขสุดท้ายในสตริงย่อยคือความยาวของสตริงดังนั้นในกรณีนี้มันจะเป็น "2" แทนที่จะเป็น 4 หรือ 6

function hexToR($h) {
    return hexdec(substr(cutHex($h), 0, 2));
}
function hexToG($h) {
    return hexdec(substr(cutHex($h), 2, 2));
}
function hexToB($h) {
    return hexdec(substr(cutHex($h), 4, 2));
}

0

LESS มีcontrast()ฟังก์ชั่นที่ดีซึ่งทำงานได้ดีสำหรับฉันดูที่http://lesscss.org/functions/#color-operations-contrast

"เลือกว่ามีสองสีใดที่ให้สีที่แตกต่างมากที่สุดซึ่งมีประโยชน์ในการตรวจสอบว่าสีสามารถอ่านได้กับพื้นหลังซึ่งเป็นประโยชน์สำหรับการปฏิบัติตามข้อกำหนดการช่วยสำหรับการเข้าถึงฟังก์ชั่นนี้ทำงานในลักษณะเดียวกัน เพื่อให้สอดคล้องกับ WCAG 2.0 สีจะถูกนำมาเปรียบเทียบโดยใช้ค่าลูม่าที่แก้ไขด้วยแกมม่าไม่ใช่ความสว่าง "

ตัวอย่าง:

p {
    a: contrast(#bbbbbb);
    b: contrast(#222222, #101010);
    c: contrast(#222222, #101010, #dddddd);
    d: contrast(hsl(90, 100%, 50%), #000000, #ffffff, 30%);
    e: contrast(hsl(90, 100%, 50%), #000000, #ffffff, 80%);
}

เอาท์พุท:

p {
    a: #000000 // black
    b: #ffffff // white
    c: #dddddd
    d: #000000 // black
    e: #ffffff // white
}

0

จากฐานสิบหกเป็นสีดำหรือสีขาว:

function hexToRgb(hex) {
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result
    ? [
        parseInt(result[1], 16),
        parseInt(result[2], 16),
        parseInt(result[3], 16)
      ]
    : [0, 0, 0];
}

function lum(hex) {
  var rgb = hexToRgb(hex)
  var lrgb = [];
  rgb.forEach(function(c) {
    c = c / 255.0;
    if (c <= 0.03928) {
      c = c / 12.92;
    } else {
      c = Math.pow((c + 0.055) / 1.055, 2.4);
    }
    lrgb.push(c);
  });
  var lum = 0.2126 * lrgb[0] + 0.7152 * lrgb[1] + 0.0722 * lrgb[2];
  return lum > 0.179 ? "#000000" : "#ffffff";
}

0

รหัสเวอร์ชั่น c-Objective สำหรับ iOS ขึ้นอยู่กับคำตอบของ Mark:

- (UIColor *)contrastForegroundColor {
CGFloat red = 0, green = 0, blue = 0, alpha = 0;
[self getRed:&red green:&green blue:&blue alpha:&alpha];
NSArray<NSNumber *> *rgbArray = @[@(red), @(green), @(blue)];
NSMutableArray<NSNumber *> *parsedRGBArray = [NSMutableArray arrayWithCapacity:rgbArray.count];
for (NSNumber *item in rgbArray) {
    if (item.doubleValue <= 0.03928) {
        [parsedRGBArray addObject:@(item.doubleValue / 12.92)];
    } else {
        double newValue = pow((item.doubleValue + 0.055) / 1.055, 2.4);
        [parsedRGBArray addObject:@(newValue)];
    }
}

double luminance = 0.2126 * parsedRGBArray[0].doubleValue + 0.7152 * parsedRGBArray[1].doubleValue + 0.0722 * parsedRGBArray[2].doubleValue;

return luminance > 0.179 ? UIColor.blackColor : UIColor.whiteColor;
}

0

การทดสอบด้วยสี 24 บิตทั้งหมดจะเป็นอย่างไร

โปรดทราบว่าวิธี YIQ จะส่งกลับอัตราส่วนความคมชัดต่ำสุดที่ 1.9: 1 ซึ่งไม่ผ่านการทดสอบ AA และ AAA WCAG2.0 ซึ่งถือว่าเป็นเกณฑ์ที่ 128

สำหรับวิธี W3C จะส่งกลับอัตราส่วนความคมชัดต่ำสุดที่ 4.58: 1 ซึ่งผ่านการทดสอบ AA และ AAA สำหรับข้อความขนาดใหญ่และการทดสอบ AA สำหรับข้อความขนาดเล็กจะไม่ผ่านการทดสอบ AAA สำหรับข้อความขนาดเล็กสำหรับทุกสี


0

นี่คือวิธีการของฉันที่ฉันใช้และยังไม่มีปัญหากับ😄

const hexCode = value.charAt(0) === '#' 
                  ? value.substr(1, 6)
                  : value;

const hexR = parseInt(hexCode.substr(0, 2), 16);
const hexG = parseInt(hexCode.substr(2, 2), 16);
const hexB = parseInt(hexCode.substr(4, 2), 16);
// Gets the average value of the colors
const contrastRatio = (hexR + hexG + hexB) / (255 * 3);

contrastRatio >= 0.5
  ? 'black'
  : 'white';


0

นี่คือรหัสของฉันสำหรับ Java Swing ตามคำตอบที่น่าอัศจรรย์ของ Mark:

public static Color getColorBasedOnBackground(Color background, Color darkColor, Color lightColor) {
    // Calculate foreground color based on background (based on https://stackoverflow.com/a/3943023/)
    Color color;
    double[] cL = new double[3];
    double[] colorRGB = new double[] {background.getRed(), background.getGreen(), background.getBlue()};

    for (int i = 0; i < colorRGB.length; i++)
        cL[i] = (colorRGB[i] / 255.0 <= 0.03928) ? colorRGB[i] / 255.0 / 12.92 :
                Math.pow(((colorRGB[i] / 255.0 + 0.055) / 1.055), 2.4);

    double L = 0.2126 * cL[0] + 0.7152 * cL[1] + 0.0722 * cL[2];
    color = (L > Math.sqrt(1.05 * 0.05) - 0.05) ? darkColor : lightColor;

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