Преобразовать целое число в цвет, начиная с красного и циклически - PullRequest
3 голосов
/ 07 октября 2009

Как преобразовать целое число в используемый цвет (для PictureBox.CreateGraphics)?

Цвет должен начинаться с красного, переходить к оранжевому, желтому и т. Д. И снова переходить на красный.

Это в vb.net. Если я не могу сделать это, как я могу использовать PictureBox.CreateGraphics с шестнадцатеричным кодом вместо пера?

Спасибо за помощь!

Ответы [ 2 ]

9 голосов
/ 07 октября 2009

Вы можете использовать цвет HSB (оттенок, насыщенность, яркость) вместо цвета RGB. .Net может автоматически преобразовывать цвета RGB в HSB (с помощью методов Color.GetHue, .GetSaturation и .GetBrightness), но не идет в другом направлении. Вот пример кода, который обрабатывает преобразование цветов HSB в RGB:

http://splinter.com.au/blog/?p=29

(этот пример кода использует «V» вместо «B», вероятно, для «значения» вместо «яркости»).

Преимущество использования цвета HSB заключается в том, что параметр Hue находится в диапазоне от 0 до 360 и может интерпретироваться как позиция на цветовом круге, поэтому значения можно плавно перевернуть с 360 на 0. Для ваших целей вы можете создать цвета, установив для значений насыщенности и яркости значение 1,0 (их максимумы), а затем изменив значение оттенка, чтобы создать различные цвета спектра.

Что касается вашего конкретного вопроса (и уточнения ответа Рубенса), вы можете создать цвет из любого значения int32, например:

int i = 4837429;
Color color = Color.FromArgb(i);

Однако это не приведет к эффекту цветного перехода, который вы описали в своем вопросе, и на самом деле большая часть различий в значениях int32 (при условии, что вы находитесь в диапазоне от MinValue до MaxValue) будет применяться к альфа-канал или непрозрачность, которая не звучит так, как вы хотите.

Обновление : вот что должно делать то, что вам нужно:

private const double ONE_SIXTH = 
    0.16666666666666666666666666666667;
private const double ONE_THIRD = 
    0.33333333333333333333333333333333;
private const double TWO_THIRDS = 
    0.66666666666666666666666666666667;
private const double FIVE_SIXTHS = 
    0.83333333333333333333333333333333;
public Color WheelColor(double d)
{
    if ((d < 0.0) || (d > 1.0))
    {
        throw new ArgumentOutOfRangeException("d",
            d, "d must be between 0.0 and 1.0, inclusive");
    }
    double R = 1;
    double G = 1;
    double B = 1;
    if (d < ONE_SIXTH)
    {
        G = d / ONE_SIXTH;
        B = 0;
    }
    else if (d < ONE_THIRD)
    {
        R = 1 - ((d - ONE_SIXTH) / ONE_SIXTH);
        B = 0;
    }
    else if (d < 0.5)
    {
        R = 0;
        B = (d - ONE_THIRD) / ONE_SIXTH;
    }
    else if (d < TWO_THIRDS)
    {
        R = 0;
        G = 1 - ((d - 0.5) / ONE_SIXTH);
    }
    else if (d < FIVE_SIXTHS)
    {
        R = (d - TWO_THIRDS) / ONE_SIXTH;
        G = 0;
    }
    else
    {
        B = 1 - ((d - FIVE_SIXTHS) / ONE_SIXTH);
        G = 0;
    }
    return Color.FromArgb((int)(R * 255), 
        (int)(G * 255), (int)(B * 255));
}

Параметр d в WheelColor предназначен для перехода от 0,0 до 1,0 и будет циклически проходить через цветовое колесо (своего рода), начиная с красного при d = 0,0 и возвращаясь к красному при d = 1,0.

3 голосов
/ 07 октября 2009

Как насчет использования System.Drawing.Color.FromArgb () метода ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...