繁体   English   中英

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

[英]How would I represent an HSL and an RGB color as a class in C#?

如何用C#编写一个代表HSL颜色和RGB颜色的类?

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

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

当您发布“问题”要求他人为您编写代码时,人们会感到恼火。 新用户似乎提出了很多问题,甚至您的要求也很明确 希望这可以解释您从其他用户那里遇到的一些负面反应,包括拒绝投票,投票关闭甚至删除您的问题。 我希望这不会给您带来负面的体验,以至于您被赶走了。 将来,如果您显示一些先尝试帮助自己的证据,您会发现人们更愿意为您提供帮助。 向我们展示您已编写的代码(但不起作用),或提供一些您自己尝试解决问题的可能方法。 大多数问题不是“太琐碎的”,而是不是真实的问题。 我们不是代码编写服务,但我们仍然很乐意提供帮助。

话虽如此,我将尝试像在评论中一样继续实际回答问题。 仅仅是因为我喜欢编码涉及颜色和色彩空间转换的问题。 关于SO如何在色彩空间之间转换的问题已经在这里问过几次。 例如,我(和其他几个人)在此处提供了一种算法(使用几种不同的语言)。 将其中任何一种转换为您选择的任何语言都应该很简单。

至于“如何编写一个类来表示这些颜色空间中的值”,这很简单。 Google搜索也会发现已经做过同样事情的人们的一些结果。 就个人而言,我建议创建一个结构而不是一个类,因为它是一个非常轻巧的对象,并且颜色值是不可变的(意味着它们不会改变)。 这对于结构的完美契合,如果你想的差异更多的解释,你可以找到这个问题已经提出在这里找到答案,以及

但是无论您选择哪种,最终结果看起来都非常相似。 我认为,如果这是针对编程课程的,那么您已经学会了所有自己需要具备的知识。 意味着,您应该已经了解了私有字段(成员变量),公共属性和方法。 首先,创建一个具有3个私有字段的结构,以表示每个颜色值。 色相(H),饱和度(S)和亮度(L)。 它们的每个颜色可能应该是Integer类型,因为各个颜色值是介于0到100或0到360之间的Integer 。如果您关心最大精度,则可以将它们存储为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方法 ,该方法允许您创建一个包含“格式项”的字符串,该字符串将被相应对象的值替换。 例如,这是我的操作方法:

/// <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,自己编写代码,然后尝试几个不同的版本。 确保您了解它的工作原理,我已经完成的工作以及如何自己重新做一次。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM