Платформа.NET 3.5 имеют преобразователь HsbToRgb, или я должен прокрутить свое собственное?

Я сделал поиск преобразователя HsbToRgb в документах, но не нашел ничего содержащего "hsb" или "hsl", таким образом, я предполагаю, что он просто не существует. Только для проверки, тем не менее, там какие-либо классы, которые поддерживают это преобразование?

Обновление

Я закончил тем, что шел с этим, которое немного отличается, чем 0xA3. Я также добавил AhsbToArgb таким образом, я могу преобразовать в RGB и установить альфа-канал в одном выстреле.

AhsbToArgb - допускает альфа-канал:

public static Color AhsbToArgb(byte a, double h, double s, double b)
{
    var color = HsbToRgb(h, s, b);
    return Color.FromArgb(a, color.R, color.G, color.B);
}

HsbToRgb - преобразовывает яркость насыщенности оттенка в red-green-blue:

public static Color HsbToRgb(double h, double s, double b)
{
    if (s == 0)
        return RawRgbToRgb(b, b, b);
    else
    {
        var sector = h / 60;
        var sectorNumber = (int)Math.Truncate(sector);
        var sectorFraction = sector - sectorNumber;
        var b1 = b * (1 - s);
        var b2 = b * (1 - s * sectorFraction);
        var b3 = b * (1 - s * (1 - sectorFraction));
        switch (sectorNumber)
        {
            case 0:
                return RawRgbToRgb(b, b3, b1);
            case 1:
                return RawRgbToRgb(b2, b, b1);
            case 2:
                return RawRgbToRgb(b1, b, b3);
            case 3:
                return RawRgbToRgb(b1, b2, b);
            case 4:
                return RawRgbToRgb(b3, b1, b);
            case 5:
                return RawRgbToRgb(b, b1, b2);
            default:
                throw new ArgumentException("Hue must be between 0 and 360");
        }
    }
}

RawRgbToRgb - преобразовывает удваивается до ints и возвращает цветовой объект:

private static Color RawRgbToRgb(double rawR, double rawG, double rawB)
{
    return Color.FromArgb(
        (int)Math.Round(rawR * 255),
        (int)Math.Round(rawG * 255),
        (int)Math.Round(rawB * 255));
}
12
задан devuxer 27 May 2010 в 22:09
поделиться

2 ответа

Насколько я знаю, нет. Но алгоритм не очень сложный, и вы можете найти рабочий код в Сети, например, как в этой статье CodeProject о Манипулировании цветами в .NET Гийома Лепарментье:

public static Color HSBtoRGB(double hue, double saturation, double brightness)
{
    double r = 0;
    double g = 0;
    double b = 0;

    if (saturation == 0)
    {
        r = g = b = brightness;
    }
    else
    {
        // The color wheel consists of 6 sectors. 
        // Figure out which sector you're in.
        //
        double sectorPos = hue / 60.0;
        int sectorNumber = (int)(Math.Floor(sectorPos));

        // get the fractional part of the sector
        double fractionalSector = sectorPos - sectorNumber;

        // calculate values for the three axes of the color. 
        double p = brightness * (1.0 - saturation);
        double q = brightness * (1.0 - (saturation * fractionalSector));
        double t = brightness * (1.0 - (saturation * (1 - fractionalSector)));

        // assign the fractional colors to r, g, and b 
        // based on the sector the angle is in.
        switch (sectorNumber)
        {
            case 0:
                r = brightness;
                g = t;
                b = p;
                break;
            case 1:
                r = q;
                g = brightness;
                b = p;
                break;
            case 2:
                r = p;
                g = brightness;
                b = t;
                break;
            case 3:
                r = p;
                g = q;
                b = brightness;
                break;
            case 4:
                r = t;
                g = p;
                b = brightness;
                break;
            case 5:
                r = brightness;
                g = p;
                b = q;
                break;
        }
    }

    return Color.FromArgb(
        (int)(r * 255.0 + 0.5), 
        (int)(g * 255.0 + 0.5), 
        (int)(b * 255.0 + 0.5));
}
14
ответ дан 2 December 2019 в 18:52
поделиться

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

http://www.codeproject.com/KB/GDI-plus/HSBColorClass.aspx

5
ответ дан 2 December 2019 в 18:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: