【问题标题】:Scaling color intensity based on a range根据范围缩放颜色强度
【发布时间】:2013-01-04 11:41:01
【问题描述】:

我有一个 Button,我想根据 0 到 4095 之间的整数将其颜色从黑色更改为红色。

当数字为 0 时,它应该是黑色的,而当这个数字增加时,比如说达到 4095,它应该是完全红色的!

    ChangeColor(int num)
    {
        if(num== 0)
             lightRight.SetBackgroundColor(new Color(0,0,0));
        if(num> 4000)
            lightRight.SetBackgroundColor(new Color(255,0,0));
        //How to make a nice color that scales from 0 to 4095?
    }

知道如何解决这个问题吗?

【问题讨论】:

  • 假设 8 位 RGB,那么红色分量的 value/4095 * 255 呢?
  • 为什么要投反对票?!显示自己摇摇欲坠的downvoter!

标签: c# colors


【解决方案1】:

这取决于您对中间色的需求。 RGB 颜色定义为 3 位十六进制两位数,其中 #000000 为黑色,#FFFFFF 为白色。

第一个数字是红色,第二个是绿色,第三个是蓝色。所以每种颜色的最大数量是 255。

所以先选择想要的红色,就说这个好看吧:

R:219 克:62 乙:0

然后计算中间颜色如下,其中x属于[0,4095]:

int r = 219 * (x / 4095f) 
int g = 62 * (x / 4095f) 
int b = 0  * (x / 4095f) 

让这些值将颜色应用于按钮背景。

lightRight.SetBackgroundColor(new Color(r,g,b));

【讨论】:

    【解决方案2】:
    int myInt; //The value that changes from 0 to 4095.
    float red = myInt/4095.0;;
    float green = 0;
    float blue = 0;
    
    Color myColor = new Color(red, green, blue);
    

    【讨论】:

    • 这会输出比从黑色到红色更广的色谱吗?
    • 照原样(我编辑过),它会产生从白色到红色的渐变。就目前而言,当 myInt 从 0 变为 4095 时,它会产生从黑色到红色的渐变。颜色 (1,1,1)(使用 float 构造函数)是白色的。当蓝色和绿色分量相等地减少并且红色保持在 1 时,颜色逐渐从白色变为红色。在新代码中,起始颜色为 (0,0,0),(即黑色),红色分量逐渐增加,颜色从黑色变为红色。
    【解决方案3】:

    将加 1 的整数值除以 16,您将得到一个介于 1 和 256 之间的值。将此值减 1,并用它来计算不同的 RGB 分量

    使用您的代码 sn-p:

    ChangeColor(int num)
    {
        // num being between 0 and 4095, get a value between 0 and 255
        int red = ((num + 1) / 16 ) - 1;
        lightRight.SetBackgroundColor(new Color(red,0,0));
    }
    

    您必须处理四舍五入和可能的 -1 值,但您明白了...

    【讨论】:

    • 如果你除以 16 你可以位移(num + 1)>>4 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多