28

我想使现有颜色变暗以用于渐变画笔。有人可以告诉我该怎么做吗?

C#、.net 2.0、GDI+

4

6 回答 6

36

作为一种简单的方法,您可以只考虑 RGB 值:

    Color c1 = Color.Red;
    Color c2 = Color.FromArgb(c1.A,
        (int)(c1.R * 0.8), (int)(c1.G * 0.8), (int)(c1.B * 0.8));

(这应该使它变暗;或者,例如,* 1.25 使其变亮)

于 2009-04-10T10:15:01.933 回答
29

您也可以尝试使用

ControlPaint.Light(baseColor, percOfLightLight)

ControlPaint.Light

或者

ControlPaint.Dark(baseColor, percOfDarkDark)

ControlPaint.Dark

于 2009-04-22T16:40:28.720 回答
17

从 RGB 转换为 HSV(或 HSL),然后向下调整 V(或 L),然后再转换回来。

虽然System.Drawing.Color提供了获取色调 (H)、饱和度 (S) 和亮度的方法,但它并没有提供太多其他转换的方式,值得注意的是从 HSV(或 HSV 值)创建新实例,但转换非常简单实施。维基百科文章提供了不错的融合,从这里开始:“ HSL 和 HSV ”。

于 2009-04-10T10:09:47.250 回答
10

以下是 Richard 提到的转换的一些 C# 代码:

C# 中的 RGB 到 HSL / HSL 到 RGB

于 2009-04-10T10:15:06.813 回答
4

虽然上述方法确实会使颜色变暗,但它们会调整色调方式,因此结果看起来不太好。最好的答案是使用Rich Newman 的 HSLColor类并调整亮度。

public Color Darken(Color color, double darkenAmount) {
    HSLColor hslColor = new HSLColor(color);
    hslColor.Luminosity *= darkenAmount; // 0 to 1
    return hslColor;
}
于 2013-09-14T09:01:17.773 回答
2

您必须跟踪该值不低于 0 或高于 255

最好的方法是使用 Math.Max/Math.MIN

dim newValue as integer = ...
'correct value if it is below 0 or above 255
newValue = Math.Max(Math.Min(newValue,255),0)
于 2016-04-14T15:33:07.477 回答