Programmatically choose high-contrast colors

前端 未结 10 673
野的像风
野的像风 2020-12-14 07:29

This should be a simple question, but I haven\'t been able to find a way to make it work.

Essentially, I have a silly localhost page that I use in my webdevelopment.

相关标签:
10条回答
  • 2020-12-14 07:55

    "Contrast" is a loaded word. If you just care about being able to read the text, then one easy way is to work in a luminance-based color space like HSL, and pick foreground and background colors with big differences in luminance.

    The conversion between HSL and RGB is well-known--see Wikipedia for the details.

    If you're talking about actual color contrast, it's not nearly as cut-and-dried (there are a lot of perceptual factors that, as far as I know, haven't been reduced to a single colors space), but I suspect you don't need that level of sophistication.

    0 讨论(0)
  • 2020-12-14 07:56

    You need a difference in brightness for text to be readable, as color vision itself has too low resolution.

    So as an algorithm I'd suggest the following:

    • Pick a random background color.

    • Then decide whether it is a light or a dark color. For example you could check whether the average of the three primary colors is greater or equal 128.

    • For a light color use black text, for a dark one white text.

    0 讨论(0)
  • 2020-12-14 07:58

    I did something like this in a Palm OS application. This is what I came up with. It doesn't give you "high contrast" colors but it gives you a background color that's different enough from the text color to be quite readable:

      // Black background is a special case.  It's fairly likely to occur and 
      // the default color shift we do isn't very noticeable with very dark colors.
      if (backColor.r < 0x20 && backColor.g < 0x20 && backColor.b < 0x20)
      {
          textColor.r = backColor.r + 0x20;
          textColor.g = backColor.g + 0x20;
          textColor.b = backColor.b + 0x20;
      }
      else
      {
          textColor.r = backColor.r + ((backColor.r < 128) ? 0x10 : -0x10);
          textColor.g = backColor.g + ((backColor.g < 128) ? 0x10 : -0x10);
          textColor.b = backColor.b + ((backColor.b < 128) ? 0x10 : -0x10);
      }
    

    You might not need to do black as a special case for your purposes - Palm's color handling is a bit funky (16-bit color).

    0 讨论(0)
  • 2020-12-14 07:59

    For best contrast use this code

    function lumdiff($R1,$G1,$B1,$R2,$G2,$B2){
    
        $L1 = 0.2126 * pow($R1/255, 2.2) +
              0.7152 * pow($G1/255, 2.2) +
              0.0722 * pow($B1/255, 2.2);
    
        $L2 = 0.2126 * pow($R2/255, 2.2) +
              0.7152 * pow($G2/255, 2.2) +
              0.0722 * pow($B2/255, 2.2);
    
        if($L1 > $L2){
            return ($L1+0.05) / ($L2+0.05);
        }else{
            return ($L2+0.05) / ($L1+0.05);
        }
    }
    
    function get_the_contrast($c1, $c2) {
        return (lumdiff(hexdec(substr($c1,0,2)),
            hexdec(substr($c1,2,2)),hexdec(substr($c1,4,2)),
            hexdec(substr($c2,0,2)),hexdec(substr($c2,2,2)),
            hexdec(substr($c2,4,2))));
    }
    

    The method above ( AVG(red,green,blue) > 128 ) is not realy good.

    0 讨论(0)
提交回复
热议问题