Given a background color, how to get a foreground color that makes it readable on that background color?

后端 未结 6 715
有刺的猬
有刺的猬 2020-12-02 13:41

Given a background color, how to get a foreground color that makes it readable on that background color?

I mean computing that foreground color automatically in a pr

6条回答
  •  情话喂你
    2020-12-02 14:02

    Here's one I did in both Java and Javascript. It's loosely based off this one in javascript. I took the Luminance formula from here. The sweet-spot of the threshold from my eye was about 140.

    Java version:

    public class Color {
    
        private float CalculateLuminance(ArrayList rgb){
            return (float) (0.2126*rgb.get(0) + 0.7152*rgb.get(1) + 0.0722*rgb.get(2));
        }
    
        private ArrayList HexToRBG(String colorStr) {
            ArrayList rbg = new ArrayList();
            rbg.add(Integer.valueOf( colorStr.substring( 1, 3 ), 16 ));
            rbg.add(Integer.valueOf( colorStr.substring( 3, 5 ), 16 ));
            rbg.add(Integer.valueOf( colorStr.substring( 5, 7 ), 16 ));
            return rbg;
        }
        public String getInverseBW(String hex_color) {
            float luminance = this.CalculateLuminance(this.HexToRBG(hex_color));
            String inverse = (luminance < 140) ? "#fff" : "#000";
            return inverse;
        }
    
    }
    

    Javascript version:

    Here's the same thing in javascript for your front-end things. RGB conversion taken from here:

    hex_to_rgb: function(hex) {
            var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
            return result ? { 
                    r: parseInt(result[1], 16),
                    g: parseInt(result[2], 16),
                    b: parseInt(result[3], 16) 
            } : null;
    },
    hex_inverse_bw: function(hex) {
            rgb = this.hex_to_rgb(hex);
            luminance = (0.2126*rgb["r"] + 0.7152*rgb["g"] + 0.0722*rgb["b"]);
            return (luminance < 140) ? "#ffffff": "#000000";
    }
    

提交回复
热议问题