如何调整颜色的亮度?

Bra*_*rad 24 c# gdi+

我想将现有颜色变暗以用于渐变画笔.请问有人告诉我该怎么做?

C#,.net 2.0,GDI +

  Color AdjustBrightness(Color c1, float factor)
    {

        float r = ((c1.R * factor) > 255) ? 255 : (c1.R * factor);
        float g = ((c1.G * factor) > 255) ? 255 : (c1.G * factor);
        float b = ((c1.B * factor) > 255) ? 255 : (c1.B * factor);

        Color c  = Color.FromArgb(c1.A,(int)r, (int)g, (int)b);
        return c ;

    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 29

作为一种简单的方法,您可以只考虑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));
Run Code Online (Sandbox Code Playgroud)

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

  • 你必须要小心,如果你决定使用*1.25更亮,好像结果超过255它会抛出异常. (7认同)
  • 这可行,但实际上并没有给出准确的颜色值的精确值.我建议看一下Richard或dommer对HSL/HSV颜色模型细节的回答. (5认同)
  • @TossNet `Math.Clamp(rgb.R * amt, 0, 255), Math.Clamp(rgb.G * amt, 0, 255), Math.Clamp(rgb.B * amt, 0, 255)` 等更简单、更高效(只执行一次操作) (2认同)

小智 20

你也可以尝试使用

ControlPaint.Light(baseColor, percOfLightLight)
Run Code Online (Sandbox Code Playgroud)

ControlPaint.Light

要么

ControlPaint.Dark(baseColor, percOfDarkDark)
Run Code Online (Sandbox Code Playgroud)

ControlPaint.Dark

  • 请注意,这些函数在系统颜色上使用时具有特殊行为(如文档中所述) (2认同)

Ric*_*ard 16

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

虽然System.Drawing.Color提供了获得色调(H),饱和度(S)和亮度的方法,但它并没有提供其他转换的方法,因此无法从HSV(或HSV值)创建新实例,但转换非常简单.实行.维基百科文章提供了不错的报道,从这里开始:" HSL和HSV ".


dom*_*mer 9

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

C#中的RGB到HSL/HSL到RGB#

  • **修复**:添加 `if (h >= 6f) h -= 6f; if (h < 0f) h += 6f;` 在 `h /= 6.0;` 之前到 `RGB2HSL` 函数。 (3认同)

Tug*_*ain 5

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

public Color Darken(Color color, double darkenAmount) {
    HSLColor hslColor = new HSLColor(color);
    hslColor.Luminosity *= darkenAmount; // 0 to 1
    return hslColor;
}
Run Code Online (Sandbox Code Playgroud)