У меня есть два цвета:
#15293E
#012549
Как я могу найти цвет, который находится на полпути между ними? Есть ли способ сделать этот расчет?
У меня есть два цвета:
#15293E
#012549
Как я могу найти цвет, который находится на полпути между ними? Есть ли способ сделать этот расчет?
Как сказал г-н Листер, легко автоматизировать вычисление с помощью любого языка программирования:
Изменить: Реализация не является "очень простой", как я изначально заявил. Я потратил время, чтобы написать код на нескольких языках в Программировании-Идиомах.
Я использую этот сайт для выполнения этой задачи для меня: ColorBlender.
Средний цвет будет #0B2744
.
Если вы используете последний препроцессор LESS CSS, то вы заметите, что есть функция (mix()
), которая делает это:
mix(#15293E, #012549, 50%)
Выходы: #0b2744
.
Если вам нужно сделать это в общем случае и ожидайте, что средний цвет будет визуально точным в большем количестве случаев (т.е. визуальный цвет и тон средней точки должны "выглядеть правильно" для зрителя), то, как было предложено выше, может конвертировать из RGB в HSV или HSL перед вычислением средней точки, а затем конвертировать обратно. Это может значительно отличаться от значений среднего значения RGB.
Вот код JavaScript для преобразования в/из HSL, который я нашел в кратком поиске, и что при краткой проверке появляется правильная вещь:
Просто примените функцию rgbToHsl к вашим двум векторам цветов r, g, b, усредните два результирующих вектора и примените к ним 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], поэтому вам сначала нужно будет преобразовать из шестнадцатеричного. Это упрощенная версия функции LESS mix, которая, как мне кажется, относится к SASS. Для плаката p будет 0,5
Если вы так хотели, вы могли бы сделать это самостоятельно с помощью калькулятора Windows.
Пример:
или используйте ColorBlender, как указано выше;)