Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NETFramework 3.5是否有HsbToRgb转换器,或者我是否需要自己的转换器?_C#_.net_Colors - Fatal编程技术网

C# .NETFramework 3.5是否有HsbToRgb转换器,或者我是否需要自己的转换器?

C# .NETFramework 3.5是否有HsbToRgb转换器,或者我是否需要自己的转换器?,c#,.net,colors,C#,.net,Colors,我在文档中搜索了一个HsbToRgb转换器,但没有找到任何包含“hsb”或“hsl”的内容,所以我猜它根本不存在。不过,为了确保有支持这种转换的类吗 更新 我最终使用了这个,它与0xA3稍有不同。我还添加了一个AhsbToArgb,这样我就可以转换为RGB并一次性设置alpha通道 AhsbToArgb-允许alpha通道: public static Color AhsbToArgb(byte a, double h, double s, double b) { var color =

我在文档中搜索了一个HsbToRgb转换器,但没有找到任何包含“hsb”或“hsl”的内容,所以我猜它根本不存在。不过,为了确保有支持这种转换的类吗

更新

我最终使用了这个,它与0xA3稍有不同。我还添加了一个
AhsbToArgb
,这样我就可以转换为RGB并一次性设置alpha通道

AhsbToArgb
-允许alpha通道:

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
-将色调饱和度亮度转换为红-绿-蓝:

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
-将双精度转换为整数并返回颜色对象:

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));
}
否,在.NET(4.0之前和包括4.0)中,
Color
类仅自动从RGB转换为HSB(通过
GetHue
GetSaturation
GetBrightness
方法)。您必须使用自己的方法从HSB值转换为RGB值,或者使用已编写的示例,如:


不,据我所知不是这样。但算法并不十分复杂,您可以在Web上找到工作代码,例如Guillaume Leparmentier在上的这篇代码项目文章:

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));
}

做鱼:……虽然我刚刚注意到,这似乎声明了两次
b
。另外,最后一行可以简化为
返回新的RGB((int)(r*255.0),(int)(g*255.0),(int)(b*255.0))。我不确定我是否看到将双精度转换为字符串的值,然后再将其解析为双精度,然后再转换为整数。:@MusiGenesis:谢谢,修复了它。因为我在这里总是吹毛求疵,
Math.Round
看起来比在所有内容中添加0.5要漂亮一些。:)@MusicGenesis:也许是真的,但别忘了它使用四舍五入作为默认值。还可以看看Java是如何实现的。