Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 如何将RGB颜色更改为HSV?_C#_Colors_Rgb_Hsv - Fatal编程技术网

C# 如何将RGB颜色更改为HSV?

C# 如何将RGB颜色更改为HSV?,c#,colors,rgb,hsv,C#,Colors,Rgb,Hsv,如何将RGB颜色更改为HSV?用C语言。 我在没有任何外部库的情况下搜索非常快速的方法。这里有一个C实现: 转换为C#应该非常简单,因为几乎没有函数被调用-只是计算 通过找到您是否考虑过简单地使用System.Drawing命名空间?例如: System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue); float hue = color.GetHue(); float saturation = col

如何将RGB颜色更改为HSV?用C语言。
我在没有任何外部库的情况下搜索非常快速的方法。

这里有一个C实现:

转换为C#应该非常简单,因为几乎没有函数被调用-只是计算


通过

找到您是否考虑过简单地使用System.Drawing命名空间?例如:

System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue);
float hue = color.GetHue();
float saturation = color.GetSaturation();
float lightness = color.GetBrightness();

请注意,这并不完全是您所要求的(请参阅,Color类没有从HSL/HSV转换回来,但后者是合理的。

这是VB.net版本,从BlaM的帖子中的C代码移植而来,对我来说效果很好


这里有一个C实现:

转换为C#应该非常简单,因为几乎没有函数被调用-只是>计算



请注意
Color.GetSaturation()
Color.GetBrightness()
返回HSL值,而不是HSV。
下面的代码演示了这一区别

Color original = Color.FromArgb(50, 120, 200);
// original = {Name=ff3278c8, ARGB=(255, 50, 120, 200)}

double hue;
double saturation;
double value;
ColorToHSV(original, out hue, out saturation, out value);
// hue        = 212.0
// saturation = 0.75
// value      = 0.78431372549019607

Color copy = ColorFromHSV(hue, saturation, value);
// copy = {Name=ff3278c8, ARGB=(255, 50, 120, 200)}

// Compare that to the HSL values that the .NET framework provides: 
original.GetHue();        // 212.0
original.GetSaturation(); // 0.6
original.GetBrightness(); // 0.490196079
下面的C代码就是您想要的。它使用上描述的算法在RGB和HSV之间进行转换。范围为0-360(色调),0-1(饱和度)或

public static void ColorToHSV(Color color, out double hue, out double saturation, out double value)
{
    int max = Math.Max(color.R, Math.Max(color.G, color.B));
    int min = Math.Min(color.R, Math.Min(color.G, color.B));

    hue = color.GetHue();
    saturation = (max == 0) ? 0 : 1d - (1d * min / max);
    value = max / 255d;
}

public static Color ColorFromHSV(double hue, double saturation, double value)
{
    int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
    double f = hue / 60 - Math.Floor(hue / 60);

    value = value * 255;
    int v = Convert.ToInt32(value);
    int p = Convert.ToInt32(value * (1 - saturation));
    int q = Convert.ToInt32(value * (1 - f * saturation));
    int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));

    if (hi == 0)
        return Color.FromArgb(255, v, t, p);
    else if (hi == 1)
        return Color.FromArgb(255, q, v, p);
    else if (hi == 2)
        return Color.FromArgb(255, p, v, t);
    else if (hi == 3)
        return Color.FromArgb(255, p, q, v);
    else if (hi == 4)
        return Color.FromArgb(255, t, p, v);
    else
        return Color.FromArgb(255, v, p, q);
}

有许多颜色空间转换。对于RGB->HSV转换。

首先:确保有颜色作为位图,如下所示:

Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
paintcolor = bmp.GetPixel(e.X, e.Y);
Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            paintcolor = bmp.GetPixel(e.X, e.Y);
            float hue;
            float saturation;
            float brightness;
            hue = paintcolor.GetHue();
            saturation = paintcolor.GetSaturation();
            brightness = paintcolor.GetBrightness();
(e来自于选择我的颜色的事件处理程序!)

不久前我遇到这个问题时,我首先得到了rgba(红色、绿色、蓝色和alpha)值。 接下来,我创建了3个浮动:浮动色调、浮动饱和度、浮动亮度。然后您只需执行以下操作:

hue = yourcolor.Gethue;
saturation = yourcolor.GetSaturation;
brightness = yourcolor.GetBrightness;
整个地段看起来像这样:

Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
paintcolor = bmp.GetPixel(e.X, e.Y);
Bitmap bmp = (Bitmap)pictureBox1.Image.Clone();
            paintcolor = bmp.GetPixel(e.X, e.Y);
            float hue;
            float saturation;
            float brightness;
            hue = paintcolor.GetHue();
            saturation = paintcolor.GetSaturation();
            brightness = paintcolor.GetBrightness();
如果现在要在标签中显示它们,只需执行以下操作:

yourlabelname.Text = hue.ToString;
yourlabelname.Text = saturation.ToString;
yourlabelname.Text = brightness.ToString;
现在,您将RGB值转换为HSV值:)


希望这有帮助

而不是完全重复。HSL!=HSV。如何调整HSL帖子中的代码以用于HSV解决方案?维基百科:两者在数学上都是圆柱形的,但HSV在概念上可以被认为是颜色的倒锥,HSL在概念上代表一个双锥或球体。虽然HSL和HSV中的“色调”指的是同一个属性,但它们对“饱和度”的定义却有很大的不同。@Adam:我希望Paint.NET的人能弄明白这一点!:)重复:HSV与HSL非常不同。HSV有时被称为HSB(特别是在Photoshop和.NET中),正如您所指出的,这实际上并不能回答这个问题,因为这些方法提供了RGB到HSL的转换,而不是RGB到HSV的转换。@greg:我同意,这将导致可怕的结果,正如我自己所经历的那样。-1:因为这不是问题的答案。HSV与HSL非常不同。注:HSV有时被称为HSB(特别是在Photoshop和.NET中),我不确定亮度、亮度和值(一直认为它们是同义词)之间的区别,但看看
系统.Drawing.Color
实现,我发现它不是基于红色、绿色和蓝色的NTSC权重,而是一视同仁,产生次优结果。@IanBoyd,而您所陈述的是wrt。HSV、HSL和HSB都是正确的,问题在于
系统。事实上,HSB的实施似乎用词不当:他们实施了HSL。NET API声明
Color.GetBrightness()
,而不是值(即,它不是HSV中的“V”,而是HSL中的“L”)。我认为您在回答中转换了饱和度和值的样本值。当我将rgb(50120200)转换为色调饱和度值(HSV)时,我得到了HSV(212,75%,78.4%)。查看维基百科的HSV公式:V=Max(r,g,b)。在这种情况下,最大值(50120200)=200。200/255=0.7843我只编辑答案,转换饱和度和数值。饱和度应该是0.75,值应该是0.7843…知道如何将饱和度从0-1转换为MS Paint使用的饱和度值(即0-240刻度)吗?回答得很好!也许考虑使用浮点而不是双,以与.NET颜色.gthue()返回一致。得到它。HSV变量使用的是
double
类型,其粒度比8位RGB通道所能容纳的粒度高得多。因此,100%往返映射是不可能的。但是,我想知道这些函数是否可以改进以安全地为RGB子集执行。这种实现是不正确的。它似乎是,但它缺少一个部分(规范化部分)。让我绊倒了一会儿!这不是HSV,而是HSL。