如何在HS#中将HSL和RGB颜色表示为一个类?

时间:2011-01-22 22:02:43

标签: c# .net class colors color-space

如何在C#中编写代表HSL颜色和RGB颜色的类?

有了这个,是否可以添加打印出每个类属性的方法?我听说过ToString(),但我不确定如何使用它。

一些示例代码非常有用,因为我是一名学生并且正在尝试学习如何使用C#。谢谢!

1 个答案:

答案 0 :(得分:2)

当您发布“问题”并要求其他人为您编写代码时,人们会感到恼火。来自新用户的很多问题似乎要求这样做,而你甚至会明确地 。希望这可以解释您从其他用户那里遇到的一些负面反应,无论是在downvoting,投票关闭,甚至删除你的问题。我希望这并没有给你带来如此消极的经历,以至于你被赶走了。将来,如果你出现一些试图先帮助自己的证据,你会发现人们更愿意帮助你。向我们展示一些您编写的代码(但不起作用),或者建议您尝试自己解决问题的一些可能方法。大多数问题不是“太微不足道”,而是真正的问题。我们不是代码编写服务,但我们仍然很乐意提供帮助。

话虽这么说,我会像在评论中那样继续实际回答这个问题。如果只因为我喜欢编码处理颜色和色彩空间转换的问题。关于如何在色彩空间之间进行转换的问题已经在SO上多次提出并回答过。例如,我(和其他几个)提供了一种算法(用几种不同的语言)here。将其中任何一种转换为您选择的任何语言都应该很简单。

至于“我如何编写一个类来表示那些颜色空间中的值”,这很简单。谷歌搜索也会出现几个已经完成同样事情的人的结果。就个人而言,我建议创建一个结构,而不是一个类,因为它是一个非常轻量级的对象,颜色值是不可变的(意味着它们不会改变)。这是一个完美的结构,如果你想要更多解释差异,你可以找到that question already been askedanswered here as well

但无论你选择哪种,最终结果都非常相似。我认为,如果这是一个编程课程,你已经学到了所有你需要知道的能够自己做的事情。意思是,您应该已经了解了私有字段(成员变量),公共属性和方法。您将首先创建一个包含3个私有字段的结构来表示每个颜色值;色调(H),饱和度(S)和亮度(L)。它们应该都是Integer类型,因为各个颜色值是0到100之间的整数,或0到360.如果你关心最大精度,你可以将它们存储为类型Decimal和处理公开属性中向Integer转换的公共属性,但我怀疑这是必要的。在任何一种情况下,您接下来都需要创建将您的私有字段公开给全世界的公共属性。这是面向对象编程的基本概念,不应该是对您而言的新概念。 (如果是的话,你真的需要立即停下来并获得一本向你解释OOP的书。不要通过Go,不要收200美元。)那些公共属性应该是Integer类型,应该有3个它们对于每个单独的颜色组件值,它们应该(至少如果你创建一个不可变结构)是只读的(只包括一个getter,而不是一个setter)。像这样:

/// <summary>
/// Represents an HSL color, composed of individual
/// Hue, Saturation, and Lightness attributes.
/// </summary>
public struct HSLColor
{
    private int _hue;
    private int _saturation;
    private int _lightness;

    /// <summary>
    /// The hue attribute of the color.
    /// (This is a value, in degrees, from 0 to 360.)
    /// </summary>
    public int Hue
    {
        get { return _hue; }
    }

    /// <summary>
    /// The saturation attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Saturation
    {
        get { return _saturation; }
    }

    /// <summary>
    /// The lightness attribute of the color.
    /// (This is a percentage between 0 and 100.)
    /// </summary>
    public int Lightness
    {
        get { return _lightness; }
    }
}

最后,您说您需要覆盖ToString方法。正如您应该已经了解的那样,此方法由.NET Framework中的每个类提供,因为它继承自基础Object。当然,它标记为virtual,它允许您覆盖它并提供您自己的实现。最困难的部分是弄清楚其返回值应该是什么样子。您可以选择将颜色表示为三元组,显示其三个单独的组件值。无论如何,您需要使用String.Format method,它允许您创建一个包含“格式项”的字符串,该字符串将被相应对象的值替换。例如,我就是这样做的:

/// <summary>
/// Returns the "(HH, SS, LL)" representation of this HSLColor structure.
/// </summary>
public override string ToString()
{
    return string.Format("({0}, {1}, {2})",
                         this.Hue,
                         this.Saturation,
                         this.Lightness);
}

这应该足以让你入门。我高度鼓励您不要只复制并粘贴此处提供的代码作为您的作业。你没有这样学习任何东西。启动IDE,自己编写代码,并尝试几种不同的变体。确保你了解它是如何工作的,我做了什么,以及你如何能够自己做到这一点。祝你好运!