好的,我正在尝试按照本指南在c#中创建转换器:http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace ColorPickerTest
{
// Given a Color (RGB Struct) in range of 0-255
// Return H,S,L in range of 0-1
class Program
{
public struct ColorRGB
{
public byte R;
public byte G;
public byte B;
public ColorRGB(Color value)
{
this.R = value.R;
this.G = value.G;
this.B = value.B;
}
public static implicit operator Color(ColorRGB rgb)
{
Color c = Color.FromArgb(rgb.R, rgb.G, rgb.B);
return c;
}
public static explicit operator ColorRGB(Color c)
{
return new ColorRGB(c);
}
}
public static void RGB2HSL(ColorPickerTest.Program.ColorRGB rgb, out double h, out double s, out double l)
{
double r = rgb.R / 255.0;
double g = rgb.G / 255.0;
double b = rgb.B / 255.0;
double v;
double m;
double vm;
double r2, g2, b2;
h = 0; // default to black
s = 0;
l = 0;
v = Math.Max(r, g);
v = Math.Max(v, b);
m = Math.Min(r, g);
m = Math.Min(m, b);
l = (m + v) / 2.0;
if (l <= 0.0)
{
return;
}
vm = v - m;
s = vm;
if (s > 0.0)
{
s /= (l <= 0.5) ? (v + m) : (2.0 - v - m);
}
else
{
return;
}
r2 = (v - r) / vm;
g2 = (v - g) / vm;
b2 = (v - b) / vm;
if (r == v)
{
h = (g == m ? 5.0 + b2 : 1.0 - g2);
}
else if (g == v)
{
h = (b == m ? 1.0 + r2 : 3.0 - b2);
}
else
{
h = (r == m ? 3.0 + g2 : 5.0 - r2);
}
h /= 6.0;
}
static void Main(string[] args)
{
Color slateBlue = Color.FromName("SlateBlue");
byte g = slateBlue.G;
byte b = slateBlue.B;
byte r = slateBlue.R;
byte a = slateBlue.A;
string text = String.Format("Slate Blue has these ARGB values: Alpha:{0}, " +
"red:{1}, green: {2}, blue {3}", new object[]{a, r, g, b});
Console.WriteLine(text);
Console.ReadKey();
ColorPickerTest.Program.ColorRGB rgb = new ColorPickerTest.Program.ColorRGB(slateBlue);
double h, s, l;
RGB2HSL(rgb, h, s, l);
}
}
}
当我调用最终方法时出现错误:'RGB2HSL',说该方法的参数无效。
不确定是否与我重载的ColorRGB结构有关,或者我是否打算对其进行限定
答案 0 :(得分:1)
你刚忘记了 out 这个词进入调用函数
RGB2HSL(rgb, out h, out s, out l);
如果这解决了您的问题,请告诉我。