C# 条件格式--颜色转换百分比

C# 条件格式--颜色转换百分比,c#,colors,rgb,C#,Colors,Rgb,将百分比转换为绿色(100%)到红色(0%)以及黄色(50%)的颜色的最简单方法是什么 我使用的是纯32位RGB,所以每个组件都是一个介于0和255之间的整数。我是用C语言做的,但我想对于这样的问题,语言并没有那么重要 根据马吕斯和安迪的回答,我使用以下解决方案: double red = (percent < 50) ? 255 : 256 - (percent - 50) * 5.12; double green = (percent > 50) ? 255 : percent

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

我使用的是纯32位RGB,所以每个组件都是一个介于0和255之间的整数。我是用C语言做的,但我想对于这样的问题,语言并没有那么重要

根据马吕斯和安迪的回答,我使用以下解决方案:

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);
double red=(百分比<50)?255:256-(百分之-50)*5.12;
双绿=(百分比>50)?255:百分比*5.12;
var color=color.FromArgb(255,(字节)红色,(字节)绿色,0);

工作完美-我对马吕斯溶液所做的唯一调整是使用256,如(255-(百分之-50)*5.12产量-1,当100%时,由于某种原因在Silverlight(-1255,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);
}
for(int i=0;i<100;i++){
var red=i<50
? 255
:255-(256.0/100*((i-50)*2));
绿色变量=i<50
?256.0/100*(i*2)
: 255;
var col=Color.FromArgb((int)红色,(int)绿色,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(白色)在黑色的中间有一个红色-绿色和黄色。黄色实际上是-256,而红色是-65536,绿色是-16744448。所以黄色实际上不是红色和绿色之间的RGB符号。我知道在波长方面,绿色在一边,而红色在光谱的另一边,但是我从来没有见过T。他在计算机中使用的符号类型,因为光谱并不代表所有可见的颜色。

我用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)";
}
函数setColor(p){
红色变量=p50?255:数学四舍五入((p)*5.12);
返回“rgb(“+红色+”,“+绿色+”,0)”;
}

您可能想做的是在HSV或HSL颜色空间中指定0%到100%的一些点。从那里您可以插入颜色(黄色正好介于红色和绿色之间:)和。这将在两者之间提供一个好看的渐变

假设您将使用颜色作为状态指示器,并且从用户界面的角度来看,这可能不是一个好主意,因为我们不太擅长看到颜色的微小变化。因此,将值划分为三到七个桶(例如,三到七个桶)会在情况发生变化时给您带来更明显的差异,但代价是如此我的精确性(你很可能无论如何都无法欣赏)

所以,撇开所有的数学问题不谈,最后我建议使用以下颜色的查找表,输入值为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%
#e7241d适用于v12%和v36%以及v60%和v84%
这些都是从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)非常天真地转换而来的,你可能想要调整颜色以满足你的目的(有些人不喜欢红色和绿色不是“纯的”)

请参阅:

  • 进行一些讨论和讨论
  • 对于示例C#源代码

我使用以下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"
另一个例程对其进行包装,以便在“条件格式”的数值之间很好地混合:


我基于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;
var-red:Number=(百分比=50)?255:percentage*5.12;
变量redHex:Number=Math.round(红色)*0x10000;
变量greenHex:Number=Math.round(绿色)*0x100;
var COLORTORRETURN:uint=红色十六进制+绿色十六进制;

这是一个很好的干净解决方案,它从三个方面改进了当前公认的答案:

  • 删除幻数(5.12),从而使代码更容易理解
  • 不会产生舍入误差,当百分比为100%时,舍入误差为-1
  • 允许您自定义使用的最小和最大RGB值,以便生成比简单RGB(255,0,0)-RGB(0,255,0)更亮或更暗的范围
  • 显示的代码是C#,但将算法调整到任何其他语言都很简单

    private const int RGB_MAX = 255; // Reduce this for a darker range
    private const int RGB_MIN = 0; // Increase this for a lighter range
    
    private Color getColorFromPercentage(int percentage)
    {
        // Work out the percentage of red and green to use (i.e. a percentage
        // of the range from RGB_MIN to RGB_MAX)
        var redPercent = Math.Min(200 - (percentage * 2), 100) / 100f;
        var greenPercent = Math.Min(percentage * 2, 100) / 100f;
    
        // Now convert those percentages to actual RGB values in the range
        // RGB_MIN - RGB_MAX
        var red = RGB_MIN + ((RGB_MAX - RGB_MIN) * redPercent);
        var green = RGB_MIN + ((RGB_MAX - RGB_MIN) * greenPercent);
    
        return Color.FromArgb(red, green, RGB_MIN);
    }
    
    笔记 下面是一个简单的表格,显示了一些百分比值,以及我们想要生成的相应的红色和绿色比例:

    VALUE   GREEN    RED       RESULTING COLOUR
     100%    100%     0%       green
      75%    100%    50%       yellowy green
      50%    100%   100%       yellow
      25%     50%   100%       orange
       0%      0%   100%       red
    
    希望你能清楚地看到这一点

    • 绿色值是百分比值的2倍(但上限为100)
    • 红色是相反的:2x(100%)(但上限为100)
    所以我的算法从一个类似这样的表中计算值

    VALUE   GREEN    RED
     100%    200%     0%
      75%    150%    50%
      50%    100%   100%
      25%     50%   150%
       0%      0%   200%
    

    …然后使用
    Math.Min()
    将其限制为100%。

    最近解决了同样的问题,我决定,正如亨里克所提到的,色调之间的差异不明显。我最终只是从3种颜色和范围中切换。同意,这是一个比公认的答案好得多的解决方案。如果p=50,红色和绿色都将生成256
    VALUE   GREEN    RED       RESULTING COLOUR
     100%    100%     0%       green
      75%    100%    50%       yellowy green
      50%    100%   100%       yellow
      25%     50%   100%       orange
       0%      0%   100%       red
    
    VALUE   GREEN    RED
     100%    200%     0%
      75%    150%    50%
      50%    100%   100%
      25%     50%   150%
       0%      0%   200%