如何在两种颜色之间获得颜色?

时间:2013-01-23 14:37:34

标签: html css

我有两种颜色:

#15293E
#012549

如何找到它们之间的颜色?有没有办法进行这种计算?

11 个答案:

答案 0 :(得分:79)

正如Lister先生所说,用任何编程语言自动计算很容易:

  1. 将您的两种颜色分为Red, Green, Blue的3种颜色编号:(r1,g1,b1)和(r2,g2,b2)。
    • 例如#15293E,#012549变为(“15”,“29”,“3E”),(“01”,“25”,“49”)

  2. 将每个颜色字符串转换为整数,明确指定您正在解析数字的hexadecimal-based表示。
    • 例如(“15”,“29”,“3E”)变为(21,41,62)

  3. 计算平均值(r',g',b')=((r1 + r2)/ 2,(g1 + g2)/ 2,(b1 + b2)/ 2)。
    • 例如((21 + 1)/ 2,(41 + 37)/ 2,(62 + 73)/ 2)=(11,39,67)

  4. 再次将它们转换为字符串,明确指定您正在生成两位数十六进制表示(必要时填充零)。
    • 例如(11,39,67) - > (“0B”,“27”,“43”)

  5. 连接一个尖锐的字符,然后连接3个字符串
    • 例如(“0B”,“27”,“43”) - >的 “#0B2743”
  6. 编辑:正如我最初所说,实施并非“非常简单”。我花时间用几种语言编写代码on Programming-Idioms

答案 1 :(得分:47)

我使用此网站为我执行此任务:ColorBlender

中间颜色为#0B2744

答案 2 :(得分:16)

LESS

如果您使用最新的LESS CSS preprocessor,那么您会注意到有一个函数(mix())执行此操作:

mix(#15293E, #012549, 50%)

输出:#0b2744

答案 3 :(得分:9)

如果您需要一般性地执行此操作,并且期望中间颜色在更多情况下在视觉上准确(即,中点的视觉颜色和色调应“向人类观察者看起来正确”),那么如上所述可能想在计算中点之前从RGB转换为HSV或HSL,然后转换回来。这可能与直接平均RGB值有很大不同。

以下是我在简短搜索中找到的用于转换到/来自HSL的JavaScript代码,并且在简短的检查中似乎做了正确的事情:

https://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函数应用于两个r,g,b颜色向量,对两个结果向量求平均值,然后将hslToRgb应用于该向量。 。

答案 4 :(得分:5)

Handy-Dandy功能

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

答案 5 :(得分:5)

像这样:

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混音功能的简化版本,我认为它来自SASS。对于海报p将是0.5

答案 6 :(得分:2)

我刚刚编写了一个计算两种颜色之间颜色的函数,所以这里有人需要它,我认为它很短且可读,它接受十六进制字符串中的两种颜色,以及两者之间计算的颜色数,返回十六进制字符串数组中的颜色

我从中获取了rgbToHex和hexToRgb函数 here

希望这有帮助!

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;
}

答案 7 :(得分:1)

如果您愿意,可以使用Windows计算器自行完成。

  1. 打开Windows计算器&gt;查看&gt;程序员
  2. 选择Hex选项
  3. 输入十六进制值
  4. 切换到Dec并记下给定的值
  5. 对第二个十六进制值重复步骤2-4
  6. 通过将两个Dec数相加并除以2
  7. 来计算平均值
  8. 使用Dec选项将此值输入计算器 选中然后切换到十六进制选项并瞧
  9. 示例:

    • 15293E(HEX)= 1386814(DEC)
    • 012549(HEX)= 75081(DEC)
    • 中点=(1386814 + 75081)/ 2
    • 中点= 730947(DEC)
    • 730947(DEC)= 0B2743(HEX)
    • #0B2743

    或使用上面提到的ColorBlender;)

答案 8 :(得分:0)

我找到了一个执行此操作的npm模块:https://www.npmjs.com/package/color-between

以下是一些用法示例:

const colorBetween = require('color-between');

// rgb format
colorBetween('rgb(255, 255, 255)', 'rgb(0, 0, 0)', 0.5, 'rgb');
// output: 'rgb(128, 128, 128)'

// rgba format
colorBetween('rgba(255, 255, 255, .2)', 'rgba(0, 0, 0, .8)', 0.5, 'rgb');
// output: 'rgba(128, 128, 128, 0.5)

// hex format
colorBetween('#fff', '#000', 0.5, 'hex');
// output: '#808080'

// mixed format
colorBetween('#fff', 'rgb(0, 0, 0)', 0.5, 'hsl');
output: 'hsl(0, 0%, 50%)'

答案 9 :(得分:0)

这里我留下了我在打字稿应用程序中使用的代码

function mixHexColors(color1: string, color2: string) {
    const valuesColor1 = color1.replace('#', '').match(/.{2}/g).map((value) =>
        parseInt(value, 16)
    )
    const valuesColor2 = color2.replace('#', '').match(/.{2}/g).map((value) =>
        parseInt(value, 16)
    )
    const mixedValues = valuesColor1.map((value, index) =>
        ((value + valuesColor2[index]) / 2).toString(16).padStart(2, '')
    )
    return `#${mixedValues.join('')}`
}

答案 10 :(得分:0)

这是一个 Python 版本。

# -*- coding: utf-8 -*-
"""jcolor_split.py splits 2 hex color values, HEX_COLOR_1 and HEX_COLOR_2, 
    printing the color halfway between the two colors
Usage:     jcolor_split.py HEX_COLOR_1 HEX_COLOR_2
Example: ./jcolor_split.py 3E599C      2E4892
"""
import sys

def jcolor_split(hex_color_1, hex_color_2):

    print()
    print (hex_color_1)
    r1s = hex_color_1[0:2]
    g1s = hex_color_1[2:4]
    b1s = hex_color_1[4:6]
    print(r1s,g1s,b1s)

    print()
    print (hex_color_2)
    r2s = hex_color_2[0:2]
    g2s = hex_color_2[2:4]
    b2s = hex_color_2[4:6]
    print(r2s,g2s,b2s)

    # convert rgb's to ints
    r1 = int(r1s, 16); g1 = int(g1s, 16); b1 = int(b1s, 16);
    r2 = int(r2s, 16); g2 = int(g2s, 16); b2 = int(b2s, 16);
    print()
    print(r1,g1,b1)
    print(r2,g2,b2)
   
    # get the average
    ra = int(round(float(r1+r2)/2))
    ga = int(round(float(g1+g2)/2))
    ba = int(round(float(b1+b2)/2))

    print()
    print(format(ra, 'x')+ format(ga, 'x')+ format(ba, 'x') )

    
 
NUM_ARGS = 2
def main():
    args = sys.argv[1:]
    if len(args) != NUM_ARGS or "-h" in args or "--help" in args:
        print (__doc__)
        sys.exit(2)
    jcolor_split(args[0], args[1])
 
if __name__ == '__main__':
    main()


sample_run = '''
PS C:\1d\JoeCodeswellHomePage> ./jcolor_split.py 3E599C      2E4892

3E599C
3E 59 9C

2E4892
2E 48 92

62 89 156
46 72 146

365097
PS C:\1d\JoeCodeswellHomePage> 
'''