Как настроить яркость цвета?
Я хотел бы затемнить существующий цвет для использования в градиентной кисти. Может ли кто-нибудь сказать мне, как это сделать, пожалуйста?
С#,.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".
Ответ 4
Здесь некоторый код С# для конверсий Ричард упоминал:
RGB для HSL/HSL для RGB в С#
Ответ 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)