【问题标题】:How can I calculate differences (luminosity, brightness, color) between two colors?如何计算两种颜色之间的差异(亮度、亮度、颜色)?
【发布时间】:2011-06-10 14:39:23
【问题描述】:

如何计算

  • 亮度对比度,
  • 亮度差异,以及
  • 颜色的差异

在两种给定颜色之间?

示例:

输入

  • 颜色 1:#99ccff
  • 颜色 2:#225588

输出

  • 亮度对比度:4.57:1
  • 亮度差:119
  • 颜色差异:357

【问题讨论】:

  • 我好像记得这样的事情 ((red_value1 * 299 + green_value1 * 587 + blue_value1 * 114)/(red_value2 * 299 + green_value2 * 587 + blue_value2 * 114))
  • @anirudh4444 :对于我的示例,结果是 2.57490315... 看起来不像任何预期的输出。这应该算什么?知道这些神奇的数字是从哪里来的吗?

标签: math colors brightness


【解决方案1】:

将每种颜色从 (R, G, B) 转换为 (H, S, V) [或 (H, S, L)] 坐标。你可以找到公式at Wikipedia

我为此编写了 Pascal 函数:

function RGBToHSV(const Color: TRGB): THSV;
var
  cmax, cmin, cdiff: real;
begin
  cmax := MaxComponent(Color);
  cmin := MinComponent(Color);
  cdiff := cmax - cmin;

  with Color, result do
  begin

    // Hue
    if cmax = cmin then
      hsvHue := 0
    else if cmax = rgbRed then
      hsvHue := (60 * (rgbGreen - rgbBlue) / cdiff)
    else if cmax = rgbGreen then
      hsvHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
    else
      hsvHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;

    hsvHue := Fix360(hsvHue);

    // Saturation
    if cmax = 0 then
      hsvSaturation := 0
    else
      hsvSaturation := 1 - cmin / cmax;

    // Value
    hsvValue := cmax;

  end;

end;

function RGBToHSL(const Color: TRGB): THSL;
var
  cmax, cmin, cdiff, csum: real;
begin
  cmax := MaxComponent(Color);
  cmin := MinComponent(Color);
  cdiff := cmax - cmin;
  csum := cmax + cmin;

  with Color, result do
  begin

    // Hue
    if cmax = cmin then
      hslHue := 0
    else if cmax = rgbRed then
      hslHue := (60 * (rgbGreen - rgbBlue) / cdiff)
    else if cmax = rgbGreen then
      hslHue := (60 * (rgbBlue - rgbRed) / cdiff) + 120
    else
      hslHue := (60 * (rgbRed - rgbGreen) / cdiff) + 240;

    hslHue := Fix360(hslHue);

    // Saturation
    if cmax = cmin then
      hslSaturation := 0
    else if csum <= 1 then
      hslSaturation := cdiff / csum
    else
      hslSaturation := cdiff / (2 - csum);

    // Lightness
    hslLightness := csum / 2;

  end;

end;    

【讨论】:

  • 我还找到了thins链接(无需了解Pascal):130.113.54.154/~monger/hsl-rgb.html
  • @Shawn:嗯,Pascal 的可读性很强,与高级数学书籍中描述算法时使用的“伪语言”非常相似......
  • Rajbrand :是的,它非常好。我只是不明白with Color, result doFix360 部分,所以我最终不得不在其他地方查找它......
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2013-08-02
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多