Есть ли простой способ смешать два значения System.Drawing.Color? - PullRequest
16 голосов
/ 16 сентября 2010

Есть ли простой способ смешать два значения System.Drawing.Color?Или я должен написать свой собственный метод, чтобы взять два цвета и объединить их?

Если я это сделаю, как можно это сделать?

Ответы [ 3 ]

33 голосов
/ 16 сентября 2010

Я написал служебный метод именно для этой цели.:)

/// <summary>Blends the specified colors together.</summary>
/// <param name="color">Color to blend onto the background color.</param>
/// <param name="backColor">Color to blend the other color onto.</param>
/// <param name="amount">How much of <paramref name="color"/> to keep,
/// “on top of” <paramref name="backColor"/>.</param>
/// <returns>The blended colors.</returns>
public static Color Blend(this Color color, Color backColor, double amount)
{
    byte r = (byte) ((color.R * amount) + backColor.R * (1 - amount));
    byte g = (byte) ((color.G * amount) + backColor.G * (1 - amount));
    byte b = (byte) ((color.B * amount) + backColor.B * (1 - amount));
    return Color.FromArgb(r, g, b);
}
6 голосов
/ 28 февраля 2012

Если вы хотите смешивать цвета так, чтобы они выглядели более естественными для человеческого глаза, вам следует рассмотреть возможность работы в другом цветовом пространстве, чем RGB, например L * a * b *, HSL HSB.

Есть отличная статья проекта кода о цветовых пространствах с примерами на C #.

Возможно, вам понравится работать с L * a * b *, так как он был разработан для линеаризации восприятия цветовых различий и поэтому должен давать элегантные градиенты.

3 голосов
/ 16 сентября 2010

Я не совсем уверен, что вы пытаетесь сделать с помощью смешивания, но вы можете посмотреть на альфа-смешивание http://en.wikipedia.org/wiki/Alpha_compositing.

...