私は2つの色を持っています:
#15293E
#012549
それらの中間にある色を見つけるにはどうすればよいですか? この計算を行う方法はありますか?
リスター氏がちょうど言ったように、どのプログラミング言語でも計算を自動化するのは簡単です:
編集:最初に述べたように、実装は「非常に簡単」ではありません。Programming-Idiomsで、時間をかけていくつかの言語でコードを書きました。
私はこの Web サイトを使用してこのタスクを実行しています: ColorBlender。
中間色は になります#0B2744
。
最新のLESS CSS プリプロセッサmix()
を使用すると、これを行う関数 ( )があることに気付くでしょう。
mix(#15293E, #012549, 50%)
出力: #0b2744
.
これを一般的に行う必要があり、より多くの場合に中間色が視覚的に正確であることを期待する場合 (つまり、中間点の視覚的な色とトーンが人間の視聴者に「正しく見える」必要がある場合)、上記で提案したように、中間点を計算する前に RGB から HSV または HSL に変換し、後で元に戻します。これは、RGB 値を直接平均化することとは大きく異なる場合があります。
簡単な検索で見つけた HSL との間の変換のための JavaScript コードを次に示します。簡単なチェックでは、正しいことをしているように見えます。
github.com/mjackson/mjijackson.github.com/blob/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.txt
rgbToHsl 関数を 2 つの r、g、b カラー ベクトルに適用し、結果の 2 つのベクトルを平均して、それに hslToRgb を適用します。. .
function padToTwo(numberString) {
if (numberString.length < 2) {
numberString = '0' + numberString;
}
return numberString;
}
function hexAverage() {
var args = Array.prototype.slice.call(arguments);
return args.reduce(function (previousValue, currentValue) {
return currentValue
.replace(/^#/, '')
.match(/.{2}/g)
.map(function (value, index) {
return previousValue[index] + parseInt(value, 16);
});
}, [0, 0, 0])
.reduce(function (previousValue, currentValue) {
return previousValue + padToTwo(Math.floor(currentValue / args.length).toString(16));
}, '#');
}
console.log(hexAverage('#111111', '#333333')); // => #222222
console.log(hexAverage('#111111', '#222222')); // => #191919
console.log(hexAverage('#111111', '#222222', '#333333')); // => #222222
console.log(hexAverage('#000483', '#004B39')); // => #00275e
このような:
function colourGradientor(p, rgb_beginning, rgb_end){
var w = p * 2 - 1;
var w1 = (w + 1) / 2.0;
var w2 = 1 - w1;
var rgb = [parseInt(rgb_beginning[0] * w1 + rgb_end[0] * w2),
parseInt(rgb_beginning[1] * w1 + rgb_end[1] * w2),
parseInt(rgb_beginning[2] * w1 + rgb_end[2] * w2)];
return rgb;
};
ここで、p は 0 から 1 の間の値で、色がグラデーションを通過する距離を指定します。rgb_beginning は開始色で、rgb_end は終了色です。どちらも [r,g,b] 配列なので、最初に 16 進数から変換する必要があります。これは LESS の mix 関数の簡易版で、SASS のものだと思います。ポスターの場合、p は 0.5 になります。
私は2つの色の間の色を計算する関数を書いたので、誰かがそれを必要とする場合に備えて. 16 進文字列の配列で
ここから rgbToHex および hexToRgb 関数を取得し ました
お役に立てれば!
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
function hexToRgb(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;
}
// returns an array of startColor, colors between according to steps, and endColor
function getRamp(startColor, endColor, steps) {
var ramp = [];
ramp.push(startColor);
var startColorRgb = hexToRgb(startColor);
var endColorRgb = hexToRgb(endColor);
var rInc = Math.round((endColorRgb.r - startColorRgb.r) / (steps+1));
var gInc = Math.round((endColorRgb.g - startColorRgb.g) / (steps+1));
var bInc = Math.round((endColorRgb.b - startColorRgb.b) / (steps+1));
for (var i = 0; i < steps; i++) {
startColorRgb.r += rInc;
startColorRgb.g += gInc;
startColorRgb.b += bInc;
ramp.push(rgbToHex(startColorRgb.r, startColorRgb.g, startColorRgb.b));
}
ramp.push(endColor);
return ramp;
}
必要に応じて、Windows 電卓を使用して自分で行うことができます。
例:
または上記のように ColorBlender を使用します;)