さまざまな 16 進数の色 (>6500) の膨大なリストがあり、非常に暗い色と非常に明るい色を削除したいと考えています。
これどうやってするの?明るい色と暗い色の 16 進数のカラー コードを除外するために使用できる特定の特徴はありますか? それらを整数に変換する必要がありますか..?
ありがとうございました!
さまざまな 16 進数の色 (>6500) の膨大なリストがあり、非常に暗い色と非常に明るい色を削除したいと考えています。
これどうやってするの?明るい色と暗い色の 16 進数のカラー コードを除外するために使用できる特定の特徴はありますか? それらを整数に変換する必要がありますか..?
ありがとうございました!
この関数は、正規表現を使用して文字列値を解析し、0 (黒) から 1 (100% 白) までの明るさを返します。
function hexBrightness(hex) {
var regExp = hex.length < 6 ? /^#(([a-f\d]))(([a-f\d]))(([a-f\d]))$/i : /^#([a-f\d])([a-f\d])([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i;
var result = regExp.exec(hex);
if (result) {
var r = parseInt("" + result[1] + result[2], 16),
g = parseInt("" + result[3] + result[4], 16),
b = parseInt("" + result[5] + result[6], 16),
max = Math.max(r, g, b),
min = Math.min(r, g, b),
l = (max + min) / 2;
return l / 255;
}
return null;
}
// Test
var assert = function (assertion, name) {
$("<p/>").appendTo(document.body).text(name + (assertion ? ' works' : ' fails'))
}
assert(hexBrightness('#FFFFFF') == 1, 'Uppercase');
assert(hexBrightness('#ffffff') == 1, 'Lowercase');
assert(hexBrightness('#fff') == 1, 'Short');
assert(hexBrightness('#000') == 0, 'Black');
assert(hexBrightness('invalid') == null, 'Invalid color');
作業フィドル: http://jsfiddle.net/L7PqT/
これは、次のような簡単で汚い方法です。
16 進数の色を R/G/B バイトに分けます。
16 進数のバイトを 10 進数に変換し、それらを合計して 3 で割ると、平均的な「明るさ」の大まかなアイデアが得られます。
色の明るさの上限と下限を 0 から 255 の最大範囲内で選択し、これら 2 つの制限外のものを除外します。
例えば
#FFBBAA => FF BB AA => ( 255 + 187 + 170 ) / 3 = 204.
「明るさ」の上限を 200 とすると、この色は明るすぎます。設定する制限は完全に主観的なものなので、あなた次第です。
16 進数で直接計算を行うことに慣れている場合は、10 進数への変換を完全にスキップして、すべての計算を 16 進数のままにすることができます。