Как настроить яркость цвета?

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

С#,.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 ;

    }

Ответ 1

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

Ответ 2

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

ControlPaint.Light(baseColor, percOfLightLight)

ControlPaint.Light

или

ControlPaint.Dark(baseColor, percOfDarkDark)

ControlPaint.Dark

Ответ 3

Конвертировать из RGB в HSV (или HSL), затем отрегулировать V (или L) вниз, а затем конвертировать назад.

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

Ответ 5

В то время как вышеупомянутые методы затемняют цвет, но они корректируют оттенок так, чтобы результат выглядел не очень хорошо. Лучший ответ - использовать класс Rich Newman HSLColor и настроить яркость.

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

Ответ 6

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