条件格式-百分比到颜色的转换

时间:2020-03-05 18:42:35  来源:igfitidea点击:

将百分比转换为从绿色(100%)到红色(0%),从黄色到50%的颜色的最简单方法是什么?

我使用的是普通的32位RGB,所以每个组件都是0到255之间的整数。我正在C#中执行此操作,但是我猜对于像这样的问题,语言的作用并不大。

基于Marius和Andy的答案,我正在使用以下解决方案:

double red = (percent < 50) ? 255 : 256 - (percent - 50) * 5.12;
double green = (percent > 50) ? 255 : percent * 5.12;
var color = Color.FromArgb(255, (byte)red, (byte)green, 0);

完美运行我唯一需要对Marius解决方案进行的调整是使用256,因为100%时使用(255(50%)* 5.12产率-1),由于某些原因,在Silverlight(-1、255、0)中导致黄色->黄色的 ...

解决方案

回答

由于黄色是红色和绿色的混合体,因此我们可以从#F00开始,然后向上滑动绿色直到打到#FF0,然后将红色向下滑动到#0F0:

for (int i = 0; i < 100; i++) {
    var red = i < 50
        ? 255
        : 255 - (256.0 / 100 * ((i - 50) * 2));
    var green = i < 50
        ? 256.0 / 100 * (i * 2)
        : 255;
    var col = Color.FromArgb((int) red, (int) green, 0);
}

回答

用伪代码。

  • 在0-50%之间,十六进制值为FFxx00,其中:
XX = ( Percentage / 50 ) * 255 converted into hex.
  • 从50到100,十六进制值为xxFF00,其中:
XX = ((100-Percentage) / 50) * 255 converted into hex.

希望有帮助并且可以理解。

回答

因为它是R-G-B,所以颜色从-1(白色)的整数值到黑色的-16777216. 在中间的某个地方有红色,绿色和黄色。黄色实际上是-256,而红色是-65536,绿色是-16744448. 因此,黄色实际上不在RGB表示法的红色和绿色之间。我知道就波长而言,绿色在光谱的一侧,红色在光谱的另一侧,但是我从未见过在计算机中使用这种符号,因为光谱不能代表所有可见的颜色。

回答

我用JavaScript编写了此函数。它返回的颜色是一个css字符串。它以百分比作为变量,范围从0到100。该算法可以使用任何语言进行:

function setColor(p){
    var red = p<50 ? 255 : Math.round(256 - (p-50)*5.12);
    var green = p>50 ? 255 : Math.round((p)*5.12);
    return "rgb(" + red + "," + green + ",0)";
}

回答

我们可能想要做的是在HSV或者HSL颜色空间中为0%到100%分配一些点。从那里我们可以插值颜色(黄色恰好在红色和绿色之间:)并将它们转换为RGB。这将使我们在两者之间有一个漂亮的渐变。

但是,假设我们将颜色用作状态指示器,并且从用户界面的角度来看,这可能不是一个好主意,因为我们很难看到颜色的细微变化。因此,例如,将值划分为3到7个存储桶,则在事物发生变化时会给我们带来更明显的差异,但会以某种精度为代价(无论如何我们都无法理解)。

因此,除了所有数学运算之外,最后我建议使用以下颜色的查找表,其中v是输入值:

#e7241d for v <= 12%
#ef832c for v > 12% and v <= 36%
#fffd46 for v > 36% and v <= 60%
#9cfa40 for v > 60% and v <= 84%
#60f83d for v > 84%

这些已从HSL值(0.0、1.0、1.0),(30.0、1.0、1.0),(60.0、1.0、1.0),(90.0、1.0、1.0),(120.0、1.0、1.0)进行了简单转换,并且我们可能需要根据自己的目的对颜色进行一些调整(有些不喜欢红色和绿色不是"纯"的)。

请参阅:

  • 使用HSL颜色(色相,饱和度,亮度)创建外观更好的GUI,以进行一些讨论和
  • 样本C#源代码的RGB和HSL颜色空间转换。

回答

我使用以下Python例程在颜色之间进行混合:

def blendRGBHex(hex1, hex2, fraction):
    return RGBDecToHex(blendRGB(RGBHexToDec(hex1), 
                                RGBHexToDec(hex2), fraction))

def blendRGB(dec1, dec2, fraction):
    return [int(v1 + (v2-v1)*fraction) 
        for (v1, v2) in zip(dec1, dec2)]

def RGBHexToDec(hex):
    return [int(hex[n:n+2],16) for n in range(0,len(hex),2)]

def RGBDecToHex(dec):
    return "".join(["%02x"%d for d in dec])

例如:

>>> blendRGBHex("FF8080", "80FF80", 0.5)
"BFBF80"

另一个例程将其包装为在"条件格式"的数值之间很好地融合:

def colourRange(minV, minC, avgV, avgC, maxV, maxC, v):
    if v < minV: return minC
    if v > maxV: return maxC
    if v < avgV:
        return blendRGBHex(minC, avgC, (v - minV)/(avgV-minV))
    elif v > avgV:
        return blendRGBHex(avgC, maxC, (v - avgV)/(maxV-avgV))
    else:
        return avgC

因此,在乔纳斯的情况下:

>>> colourRange(0, "FF0000", 50, "FFFF00", 100, "00FF00", 25)
"FF7F00"

回答

我基于javascript代码编写了此python函数。它以百分比作为小数。我也已经平方了值,以保持颜色更红,从而在百分比范围内保持更长的时间。我还将颜色范围从255缩小到180,以在每个末端提供较深的红色和绿色。这些可以玩以提供漂亮的色彩。我想在中间加一点橙色,但是我得继续做适当的工作,嘘。

def getBarColour(value):
    red = int( (1 - (value*value) ) * 180 )
    green = int( (value * value )* 180 )

    red = "%02X" % red
    green = "%02X" % green

    return '#' + red + green +'00'

回答

我对ActionScript 3的解决方案:

var red:Number = (percentage <= 50) ? 255 : 256 - (percentage - 50) * 5.12;
var green:Number = (percentage >= 50) ? 255 : percentage * 5.12;

var redHex:Number = Math.round(red) * 0x10000;
var greenHex:Number = Math.round(green) * 0x100;

var colorToReturn:uint = redHex + greenHex;