Как настроить яркость цвета? - PullRequest
24 голосов
/ 10 апреля 2009

Я хотел бы затемнить существующий цвет для использования в градиентной кисти. Может кто-нибудь сказать мне, как это сделать, пожалуйста?

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 ;

    }

Ответы [ 6 ]

28 голосов
/ 10 апреля 2009

В качестве простого подхода вы можете просто учитывать значения 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, чтобы сделать его ярче)

20 голосов
/ 22 апреля 2009

Вы также можете попробовать использовать

ControlPaint.Light(baseColor, percOfLightLight)

ControlPaint.Light

или

ControlPaint.Dark(baseColor, percOfDarkDark)

ControlPaint.Dark

16 голосов
/ 10 апреля 2009

Преобразовать из RGB в HSV (или HSL), затем отрегулировать V (или L) вниз и затем преобразовать обратно.

В то время как System.Drawing.Color предоставляет методы для получения оттенка (H), насыщенности (S) и яркости, он не обеспечивает ничего в плане других преобразований, ничего особенного, чтобы создать новый экземпляр из HSV (или значений HSV), но преобразование довольно просто реализовать. Статьи в Википедии дают приличное преимущество, начиная здесь: " HSL и HSV ".

9 голосов
/ 10 апреля 2009

Вот код C # для упомянутых преобразований:

RGB в HSL / HSL в RGB в C #

3 голосов
/ 14 сентября 2013

Хотя вышеупомянутые методы и делают цвет темнее, но они сильно меняют оттенок, поэтому результат выглядит не очень хорошо. Лучший ответ - использовать класс Рича Ньюмана HSLColor и настроить яркость.

public Color Darken(Color color, double darkenAmount) {
    HSLColor hslColor = new HSLColor(color);
    hslColor.Luminosity *= darkenAmount; // 0 to 1
    return hslColor;
}
1 голос
/ 14 апреля 2016

Вы должны следить за тем, чтобы значение не превышало 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)
...