将 RGB 转换为 HSB 颜色 [英] Converting RGB to HSB Colors

查看:76
本文介绍了将 RGB 转换为 HSB 颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将 HSB 颜色转换为 RGB.我这样做的方式是

System.Windows.Media.Color winColor = value;System.Drawing.Color drawColor = System.Drawing.Color.FromArgb(winColor.R, winColor.G, winColor.B);Hue = (byte)(drawColor.GetHue()*255);饱和度 = (byte)(drawColor.GetSaturation()*255);亮度 = (字节)(drawColor.GetBrightness()*255);

我发现当我有 FF0000 时,它会被转换为 H = 0, S = 255, L = 127 ,它会转换为 RGB FF0E0E.我认为亮度应该是120?还是我把整个 HSB 弄错了?当我在 Photoshop 中查看颜色选择器时,色调为 0-360 度,饱和度、亮度为 0-100%.我的 HSB 值介于 0 - 255 之间,我做错了吗?

解决方案

也许你已经看过这个
(来源:
(来源:维基媒体.组织)

  • 在两种模型中,色调都相同,使用红色作为起点和终点(零度和 360 度).
    • 仅仅看色调,你就会得到红色.
  • 饱和度定义了颜色的不透明程度或白阶的部分.
    • 因此,通过将其设置为 1,您表示您想要一个完全闪亮的红色.
  • 亮度(或值)现在定义了颜色中黑色部分(而不是白色部分)的数量.
    • 因此,通过将其设置为 1,您表示您希望它是全彩色的,从而产生完全闪亮的红色.

如您所见,Photoshop 和 .Net 框架(包括我的扩展功能)使用不同的着色模型.因此,您应该检查是否在某处找到了其他着色模型的实现、转换或其他可以为您提供所需结果的东西.

I am trying to convert a HSB Color to RGB. The way I am doing that is

System.Windows.Media.Color winColor = value;
System.Drawing.Color drawColor = System.Drawing.Color.FromArgb(winColor.R, winColor.G, winColor.B);
Hue = (byte)(drawColor.GetHue()*255);
Saturation = (byte)(drawColor.GetSaturation()*255);
Luminosity = (byte)(drawColor.GetBrightness()*255);

I find that when I have FF0000, it will be converted to H = 0, S = 255, L = 127 which converts to RGB FF0E0E. I think Luminosity should be 120? Or am I getting the whole HSB thing wrong? When I look at the color picker in Photoshop, Hue is 0-360 degrees, Saturation, Luminosity is 0-100%. I am having HSB values ranging from 0 - 255, am I doing it wrong?

解决方案

Maybe you already look into this wikipedia article, but to make it clear.

There is a difference between HSL and HSB (aka HSV).

So you can't take the (B)rightness from the color class and use it like a (L)uminosity.

To get back from the Color class provided values GetHue(), GetSaturation() and GetBrightness() to a normal color you should give this extension method a chance.

/// <summary>
/// Creates a Color from alpha, hue, saturation and brightness.
/// </summary>
/// <param name="alpha">The alpha channel value.</param>
/// <param name="hue">The hue value.</param>
/// <param name="saturation">The saturation value.</param>
/// <param name="brightness">The brightness value.</param>
/// <returns>A Color with the given values.</returns>
public static Color FromAhsb(int alpha, float hue, float saturation, float brightness)
{
    if (0 > alpha
        || 255 < alpha)
    {
        throw new ArgumentOutOfRangeException(
            "alpha",
            alpha,
            "Value must be within a range of 0 - 255.");
    }

    if (0f > hue
        || 360f < hue)
    {
        throw new ArgumentOutOfRangeException(
            "hue",
            hue,
            "Value must be within a range of 0 - 360.");
    }

    if (0f > saturation
        || 1f < saturation)
    {
        throw new ArgumentOutOfRangeException(
            "saturation",
            saturation,
            "Value must be within a range of 0 - 1.");
    }

    if (0f > brightness
        || 1f < brightness)
    {
        throw new ArgumentOutOfRangeException(
            "brightness",
            brightness,
            "Value must be within a range of 0 - 1.");
    }

    if (0 == saturation)
    {
        return Color.FromArgb(
                            alpha,
                            Convert.ToInt32(brightness * 255),
                            Convert.ToInt32(brightness * 255),
                            Convert.ToInt32(brightness * 255));
    }

    float fMax, fMid, fMin;
    int iSextant, iMax, iMid, iMin;

    if (0.5 < brightness)
    {
        fMax = brightness - (brightness * saturation) + saturation;
        fMin = brightness + (brightness * saturation) - saturation;
    }
    else
    {
        fMax = brightness + (brightness * saturation);
        fMin = brightness - (brightness * saturation);
    }

    iSextant = (int)Math.Floor(hue / 60f);
    if (300f <= hue)
    {
        hue -= 360f;
    }

    hue /= 60f;
    hue -= 2f * (float)Math.Floor(((iSextant + 1f) % 6f) / 2f);
    if (0 == iSextant % 2)
    {
        fMid = (hue * (fMax - fMin)) + fMin;
    }
    else
    {
        fMid = fMin - (hue * (fMax - fMin));
    }

    iMax = Convert.ToInt32(fMax * 255);
    iMid = Convert.ToInt32(fMid * 255);
    iMin = Convert.ToInt32(fMin * 255);

    switch (iSextant)
    {
        case 1:
            return Color.FromArgb(alpha, iMid, iMax, iMin);
        case 2:
            return Color.FromArgb(alpha, iMin, iMax, iMid);
        case 3:
            return Color.FromArgb(alpha, iMin, iMid, iMax);
        case 4:
            return Color.FromArgb(alpha, iMid, iMin, iMax);
        case 5:
            return Color.FromArgb(alpha, iMax, iMin, iMid);
        default:
            return Color.FromArgb(alpha, iMax, iMid, iMin);
    }
}

Update

So just to make things clear. My code above and the three methods within the Color class mentioned above are using the HSB (aka HSV) color model, but Photoshop uses the HSL color model.

In your comment you wrote that the parameters Hue = 0, Saturation = 1 and Brightness = 1 give you with the code above a red color and white in Photoshop. When you take a closer look at the differences of these modes this makes absolutely sense:

The HSL cylinder


(source: wikimedia.org)

  • In both models the hue acts as the same by using color Red as start and end point (zero and 360 degree).
    • By just looking at the hue you've got a red color.
  • The saturation defines how opaque the color is or how much the portion of a whitescale is.
    • So by setting it to one you say you want a full shiny red color.
  • The lighting now defines how much is the black and white part within your color. By setting it to zero you got black, one means white and 0.5 means perfect weighting.
    • So by setting it to one you say you want it as bright as possible which result in a white color.

The HSB cylinder


(source: wikimedia.org)

  • In both models the hue acts as the same by using color Red as start and end point (zero and 360 degree).
    • By just looking at the hue you've got a red color.
  • The saturation defines how opaque the color is or how much the portion of a whitescale is.
    • So by setting it to one you say you want a full shiny red color.
  • The brightness (or value) now defines how much is the black part within the color (not the white part).
    • So by setting it to one you say you want it full colored leading to a full shiny red color.

As you can see, Photoshop and the .Net framework (including my extension function) are using different coloring models. So you should check if you find somewhere an implementation of the other coloring model, a transformation or something else that gives you the results you need.

这篇关于将 RGB 转换为 HSB 颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆