我既是一名程序员,又是一名在艺术学校取得了色彩理论专业的人,然后才开始明智地从事软件工程事业。
HSL/HSV 非常适合轻松编写编程功能来处理颜色,而无需处理大量边缘情况。它们在准确复制人类对颜色的感知方面很糟糕。
CMYK 非常适合渲染打印内容,因为它近似于打印机所依赖的颜料。准确地复制人类对颜色的感知也很糟糕(虽然不是因为它本身很糟糕,而是因为计算机真的不擅长在屏幕上显示它。稍后会详细介绍)。
RGB 是技术中唯一能够准确有效地反映人类视觉的颜色实用程序。 LAB 本质上只是在引擎盖下解析为 RGB。还值得考虑的是,屏幕上的文字像素是 RGB 的表示,这意味着您使用的任何其他颜色空间在实际显示时都会被解析回 RGB。真的,最好只是去掉中间人,几乎在每一种情况下都使用它。
RGB 在编程意义上的问题在于,它在表示上本质上是立方的,而 HSL/HSV 都以半径解析,这使得以编程方式创建“色轮”变得更加容易。如果不编写大量代码来处理,RGB 很难做到这一点,因为它在数据表示方面是立方解析的。然而,RGB 非常准确地反映了人类的视觉,它也是显示器所包含的实际硬件的基础。
TLDR;如果你想死在颜色上并且不介意额外的工作,那就一直使用 RGB。如果您想开发一个“足够好”的颜色实用程序,并且可能在以后遇到您无法真正做任何事情的错误票,请使用 HSL/HSV。如果您正在打印,请使用 CMYK,不是因为它好,而是因为如果您不使用它,打印机会窒息,即使它很糟糕。
顺便说一句,如果您像艺术家而不是程序员那样处理色彩理论,您会发现与任何关于色彩的技术规范真正传达的截然不同的看法。请记住,任何使用您创建的颜色实用程序的人基本上都会按照这些思路进行思考,至少如果他们在颜色理论方面有扎实的基础教育。以下是艺术家处理颜色概念的基本方法:
从艺术角度来看,颜色基本上是在五个平面上表示的。
- 颜料(或色调),这是您所追求的实际基础颜色。
- Tint,即与纯白色混合的颜料。
- 色度,即与纯黑色混合的颜料。
- 色调(或“True Tone”),即混合了不同程度灰色的颜料。
- Rich Tone(或“Earth Tones”),即与其互补色混合的颜料。丰富的色调不会出现在色轮上,因为它们本质上是对立面的混合,并且由于物理介质中的细微差异无法在机器上有效复制,因此在视觉上反映的效果与“真实色调”略有不同。李>
以编程方式表示这种范式的典型问题是没有任何好的方法来表示丰富的色调。材料艺术家在使用绘画时基本上没有问题,因为笔触的细微差异允许补语之间的潜在差异反映在构图中。同样地,数码摄影和视频在这方面都很糟糕,但实际的模拟电影在这方面并没有那么糟糕。它更多地反映在摄影和视频中而不是计算机图形中,因为相机视口中所有东西的纹理都会吸收其中的一部分,但仍然比实际观看相同的东西要少得多(这就是为什么你永远无法真正拍摄例如,一张日落的好照片,没有大量的后期制作来破解它的字面意思)。但是,计算机并不擅长复制这些差异,因为颜色基本上会解析为 RGB 像素映射的一致矩阵,在视觉上看起来像是一个平坦的规则色调。没有计算颜色空间可以准确地反映丰富的色调,因为没有计算方法可以使颜色在空间上以漫反射、非重复随机方式轻微变化,并且仍然有一个唯一标识符,而且你不能很好将其存储为没有唯一标识符的数据。
你可以用计算机做的最好的近似是创建某种颜色的扩散重叠另一种颜色,它不能解析为一个单一的值,你可以表示为一个十六进制代码或单个数据库中的东西柱子。即便如此,计算机将固有地反映统一的模式,其中真正丰富的色调依赖于随机性和不重复的纹理和变化,如果不付出相当大的努力,你就无法在机器上做到这一点。所有真正使色彩流行的艺术作品都依赖于这个原则,如果没有大量的辅助工作来模拟它,计算表示基本上是无法访问的(这就是我们有 Photoshop 和 Corel Painter 的原因,因为它们可以很好地模拟这些东西需要做一些工作,但代价是执行大量对运行时效率不高的过滤)。
从艺术的角度来看,RGB 是其他四个特征的一个很好的近似值。我们几乎明白它不会涵盖丰富的色调,我们将不得不破解一个设计实用程序并手动将这部分混合在一起。然而,用 RGB 编程的根本问题是它想要解析为 3 维空间(因为它是立方体),而您试图在二维显示器上呈现它,这使得创建合理的 UI 变得非常困难直观,因为您无法以任何对最终用户来说直观的方式有效地表示计算机显示器上第三轴的深度。
您还需要考虑表示为光的颜色与表示为颜料的颜色之间的区别。 RGB 是表示为光的颜色表示,对应于用于混合照明以表示颜色的主要值,并且使用 1:1 映射来实现。 CMYK 代表色素沉着光谱。区别在于,当你等量混合光时,你会得到白色,当你等量混合颜料时,你会得到黑色。如果您正在对任何使用计算机的实用程序进行编程,那么您就是在使用光,因为像素本质上是显示器上发出 RGB 光波的单个节点。我说 CMYK 很烂的原因不是因为它不准确,而是因为它不准确当您尝试将其表示为光时,所有计算机显示器都是这种情况。如果您使用实际的油漆、记号笔、彩色铅笔等,它就可以了。但是在屏幕上表示 CMYK 仍然必须解析为 RGB,因为这是计算机显示器的工作方式,所以它在显示时的外观总是有点偏差。
不要大谈特谈,因为这是一个编程论坛,而您作为程序员提出了这个问题。但是,如果您追求准确性,则需要考虑一个明显的“非技术性”方面,即您的工作在实现其预期目标方面的有效性,即很好地解决视觉感知问题,这在大多数计算色彩空间。归根结底,任何颜色实用程序的目标都是使其在人类对颜色的感知方面看起来正确。 HSL/HSV 在这方面都失败了。它们之所以突出,是因为它们易于编码,而且仅出于这个原因。如果您的截止日期很短,它们是可以接受的答案。如果你想要一些真正能很好用的东西,那么你需要做繁重的工作并考虑这些东西,这是你的观众在决定是否要使用你的工具时考虑的问题。
为您提供一些参考点(我有意避免任何技术参考,因为它们仅涉及计算视角,而不是对颜色的实际潜在感知,无论如何您可能已经阅读了所有这些内容):
Color Theory Wiki
Basic breakdown of hue, tint, tone, and shade
Earth Tones (or rich tones if you prefer)
Basic fundamentals of color schemes