カラーピッカーによって選択された色の暗さを評価して、「黒すぎる」かどうかを確認し、そうであれば、白に設定しようとしています。 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を追加しました。これはこれに役立つかもしれませんが、確かにわかりません。
束!
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
}
_
[〜#〜] edit [〜#〜]
2014年5月以降、tinycolor
にはgetBrightness()
関数が追加されましたが、上記のITU-Rの代わりにCCIR601の重み係数を使用しています。
[〜#〜] edit [〜#〜]
結果の輝度値の範囲は0〜255です。0が最も暗く、255が最も明るくなります。 128より大きい値は、tinycolor
によって明るいと見なされます。 (@ pau.morenoと@Alnitakによるコメントから恥知らずにコピーされた)
TinyColor ライブラリ(既に説明しました)には、色を検査および操作するためのいくつかの関数があります。
Webコンテンツアクセシビリティガイドライン(バージョン1.0) で定義されている、知覚される色の明るさを0〜255で返します。
tinycolor("#fff").getBrightness(); // 255
色の知覚される明るさが明るいかどうかを示すブール値を返します。
tinycolor("#fff").isLight(); // true tinycolor("#000").isLight(); // false
色の知覚される明るさが暗いかどうかを示すブール値を返します。
tinycolor("#fff").isDark(); // false tinycolor("#000").isDark(); // true
Webコンテンツアクセシビリティガイドライン(バージョン2.0) で定義されている0〜1の色の知覚輝度を返します。
tinycolor("#fff").getLuminance(); // 1
このWooCommerce Wordpress PHP関数( 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;
}
luminance を計算できます:
したがって、輝度は、表面がどれだけ明るく見えるかの指標です。
したがって、テキストを白にするか黒にするかを選択するのは素晴らしいことです。
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
より大きい場合は色を黒に設定し、それ以外の場合は白に設定していました。
ここでは、輝度と輝度の間に重要な違いがあります。一日の終わりの輝度は、特定の領域を移動するエネルギー量の尺度であり、知覚システムがそのエネルギーをどのように知覚するかを完全に無視します。一方、明るさは、そのエネルギーをどのように知覚するかの尺度であり、輝度と知覚システムとの関係を考慮に入れます。 (混乱のポイントとして、相対輝度と呼ばれる用語があります。これは輝度用語と同義で使用されているようです。
正確には、他の人が示唆しているように、「明るさ」または「値」または「比較的輝度」を探しています。これはいくつかの異なる方法で計算することができます(人間のように!) http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
これは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);
可能な解決策は、色を変換することです RGBからHSBに 。 HSBは、色相、彩度、および明度(Vは値を表すHSVとも呼ばれます)を表します。次に、チェックするパラメーターが1つだけあります:明るさ。
私はこの会話が数年前のものであることに気づきましたが、それでも関連があります。私のチームが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;
}
}