135

カラーピッカーが選択した色の暗さを評価して、「黒すぎる」かどうかを確認し、黒すぎる場合は白に設定します。16進値の最初の文字を使用してこれを実行できると思いました。動作していますが、合法的に「明るい」色も切り替えています。

私はこれを行うコードを持っています:

        if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
            lightcolor="#FFFFFF";
            color=lightcolor;
        }

色が特定のレベルの暗さを超えたことを知るために、16進計算でより効率的な方法が必要ですか?たとえば、lightcolor + "some hex value" <= "some hex value"の場合は、白に設定します。

tinyColorを追加しました。これはこれに役立つかもしれませんが、はっきりとはわかりません。

4

8 に答える 8

259

3つのRGBコンポーネントを個別に抽出してから、標準の式を使用して、結果のRGB値を知覚される明るさに変換する必要があります。

6文字の色を想定:

var c = c.substring(1);      // strip #
var rgb = parseInt(c, 16);   // convert rrggbb to decimal
var r = (rgb >> 16) & 0xff;  // extract red
var g = (rgb >>  8) & 0xff;  // extract green
var b = (rgb >>  0) & 0xff;  // extract blue

var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709

if (luma < 40) {
    // pick a different colour
}

編集

2014年5月以降、上記のITU-Rの重み係数の代わりにCCIR601の重み係数を使用していますtinycolorが、機能が追加されました。getBrightness()

編集

結果の輝度値の範囲は0..255です。ここで、0は最も暗く、255は最も明るくなります。128より大きい値は、によって軽いと見なされtinycolorます。(@ pau.morenoと@Alnitakによるコメントから恥知らずにコピーされました)

于 2012-08-20T18:42:20.667 に答える
38

このWooCommerceWordpressPHP関数(wc_hex_is_light)を見つけて、JavaScriptに変換しました。正常に動作します!

function wc_hex_is_light(color) {
    const hex = color.replace('#', '');
    const c_r = parseInt(hex.substr(0, 2), 16);
    const c_g = parseInt(hex.substr(2, 2), 16);
    const c_b = parseInt(hex.substr(4, 2), 16);
    const brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000;
    return brightness > 155;
}
于 2018-07-28T02:36:40.917 に答える
30

TinyColorライブラリ(すでに説明しました)は、色を検査および操作するためのいくつかの関数を提供します。

于 2015-09-07T15:32:56.117 に答える
6

輝度を計算できます:

したがって、輝度は、表面がどれだけ明るく見えるかを示す指標です。

したがって、テキストを白にするか黒にするかを選択するのは素晴らしいことです。

var getRGB = function(b){
    var a;
    if(b&&b.constructor==Array&&b.length==3)return b;
    if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b))return[parseInt(a[1]),parseInt(a[2]),parseInt(a[3])];
    if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];
    if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b))return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],
16)];
    if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];
    return (typeof (colors) != "undefined")?colors[jQuery.trim(b).toLowerCase()]:null
};

var luminance_get = function(color) {
    var rgb = getRGB(color);
    if (!rgb) return null;
        return 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2];
}

上記の方法では、さまざまな形式で色を渡すことができますが、アルゴリズムは基本的にはluminance_getです。

使用したときは、輝度が大きい場合は黒、それ以外の場合180は白に設定していました。

于 2012-08-20T18:43:43.213 に答える
6

これは16進で動作します(例:#fefefe)

function isTooDark(hexcolor){
    var r = parseInt(hexcolor.substr(1,2),16);
    var g = parseInt(hexcolor.substr(3,2),16);
    var b = parseInt(hexcolor.substr(4,2),16);
    var yiq = ((r*299)+(g*587)+(b*114))/1000;
    // Return new color if to dark, else return the original
    return (yiq < 40) ? '#2980b9' : hexcolor;
}

返品trueまたはfalse変更により変更できます

return (yiq < 40) ? '#2980b9' : hexcolor;

return (yiq < 40);
于 2017-09-11T08:50:27.970 に答える
5

ここでは、輝度と明るさの間に重要な違いがあります。輝度は、1日の終わりに、特定の領域を移動するエネルギーの量の尺度であり、知覚システムがそのエネルギーをどのように認識するかを完全に無視します。一方、明るさは、私たちがそのエネルギーをどのように知覚するかの尺度であり、輝度と私たちの知覚システムとの関係を考慮に入れています。(混乱のポイントとして、相対輝度と呼ばれる用語があります。これは明るさの用語と同義語として使用されているようです。それは私をつまずかせました)。

正確には、他の人が示唆しているように、あなたは「明るさ」または「価値」または「比較的明るい」を探しています。これはいくつかの異なる方法で計算できます(人間になることです!)http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness

  1. R、G、およびBの最大値を取ります。
  2. R、G、およびBから最大値と最小値の平均を取ります。
  3. 3つすべての平均を取ります。
  4. 他の人がここで提案しているように、いくつかの加重平均を使用します。
于 2012-08-20T19:13:49.863 に答える
2

考えられる解決策は、色をRGBからHSBに変換することです。HSBは、色相、彩度、明るさの略です(HSVとも呼ばれ、Vは値を表します)。次に、チェックするパラメータが1つだけあります。それは明るさです。

于 2012-08-20T18:43:05.860 に答える
2

この会話は数年前のものだと思いますが、それでも関連性があります。私のチームがJava(SWT)で同じ問題を抱えていて、これがもう少し正確であることがわかったことを付け加えたいと思いました。

private Color getFontColor(RGB bgColor) {
    Color COLOR_BLACK = new Color(Display.getDefault(), 0, 0, 0);
    Color COLOR_WHITE = new Color(Display.getDefault(), 255, 255, 255);

    double luminance = Math.sqrt(0.241 
       * Math.pow(bgColor.red, 2) + 0.691 * Math.pow(bgColor.green, 2) +  0.068 
       * Math.pow(bgColor.blue, 2));
    if (luminance >= 130) {
        return COLOR_BLACK;
    } else {
        return COLOR_WHITE;
    }
}
于 2017-04-20T13:40:45.640 に答える