50级灰度

时间:2013-03-27 08:14:28

标签: c# colors hex

我希望在该间隔计数中根据数字intervals和位置(index)获得不同的灰色阴影。

所以函数会是这样的:

public static string GetShade(string StartColour, string EndColour, int Intervals, int Index)
{ ... }

所以它会回来:

 GetShade("#aaaaaa", "#eeeeee", 5, 2) = "#bbbbbb"
 GetShade("#333333", "#555555", 3, 3) = "#555555"

(显然,如果我的开始和结束都是灰色的,它只与灰色相关。)

任何指针?

3 个答案:

答案 0 :(得分:2)

颜色的每个组件都是十六进制表示,数字介于0到255之间。

您需要做的就是:

int shade = 255/Intervals * index;
return string.format("{0:X}{0:X}{0:X}", shade);

上面可能存在一些舍入式问题,但上面是需要的一般概念。

答案 1 :(得分:2)

嗯,你到目前为止没有提到很多关于你尝试过的事情,所以我猜你一开始就陷入困境。

我可能会按如下方式处理:

  1. 将开始和结束颜色解析为三个组成部分,作为字符串中的数字(不能用字符串计算)
  2. 通过划分间隔(开始结束)并选择正确的分割(简单算术,应该是 start +( end - start )÷ interval · index
  3. 重新组装颜色字符串。注意允许使用前导零,即使用string.Format("{0:X2}{1:X2}{2:X2}", r, g, b)
  4. 之类的内容

答案 2 :(得分:1)

您需要一些特殊字符串表示的事实应该放在您的函数之外。处理颜色是一项任务。格式化字符串的颜色是另一个任务,应该由另一个函数处理。

详细说明的基本数学是这样的:

      public static Color GetShade(Color start, Color end, byte intervals, byte index)
      {
        var deltaR = end.R - start.R;
        var deltaG = end.G - start.G;
        var deltaB = end.B - start.B;

        var intervalR = deltaR / intervals;
        var intervalG = deltaG / intervals;
        var intervalB = deltaB / intervals;

        var finalR = start.R + (index * intervalR);
        var finalG = start.G + (index * intervalG);
        var finalB = start.B + (index * intervalB);

        return new Color { R = (byte)finalR, G = (byte)finalG, B = (byte)finalB };
      }