有几种方便的类方法用于创建 NSColor。但是,我似乎无法确定何时使用以下不同的类方法:
colorWithSRGBRed:green:blue:alpha:
对比colorWithDeviceRed:green:blue:alpha:
对比colorWithCalibratedRed:green:blue:alpha:
有几种方便的类方法用于创建 NSColor。但是,我似乎无法确定何时使用以下不同的类方法:
colorWithSRGBRed:green:blue:alpha:
对比colorWithDeviceRed:green:blue:alpha:
对比colorWithCalibratedRed:green:blue:alpha:
一组 RGB 值并不能真正描述颜色。它只会告诉您的图形适配器您想要该颜色中的红色、绿色和蓝色光的百分比,但是像 50% 纯红色这样的颜色在所有显示器上并不是相同的颜色,原因有两个:
由于伽马曲线略有不同,所有显示器的 50%相对亮度并不相同(由于背光亮度不同,绝对亮度也不相同,但这实际上无关紧要 - 只有相对值很重要)
即使是 100% 的红色也不是相同的红色调,因为显示器具有不同的红色“阴影”,具体取决于它们的背光颜色和滤色器。
因此,相同的 RGB 组合在不同的显示器上可能看起来会有所不同。作为显示器上的漂亮橙色,它在某些显示器上可能看起来像非常亮的红色,而在其他显示器上看起来像深黄色。到处都是相同的 RGB 值,但颜色不同。
为了使 RGB 描述一种“颜色”,它还需要一个颜色空间,它定义了一个颜色空间,其中 RGB 值就像是该空间的坐标,从而描述了一种精确的颜色。
(原始上传者是英文维基百科的 Cpesacreta - 由 aboalbiss 从 en.wikipedia 转移到 Commons。)
如果您使用colorWithDeviceRed:green:blue:alpha:
, RGB 值不会被转换,它们会完全像这样报告给您的图形适配器。因此,颜色确实会具有这些 RGB 值,但用户在屏幕上看到的结果会因屏幕而异。
如果使用colorWithSRGBRed:green:blue:alpha:
,则 RGB 值将被解释为 sRGB 颜色空间的 RGB 值。系统知道那个空间,因此它知道这里描述的是什么颜色。如果系统还知道您的显示器的色彩空间(例如,因为它已经在工厂校准或由用户使用校准工具校准),那么它可以将 RGB 值从 sRGB 色彩空间转换为您的本机色彩空间监视器。这种转换将改变绝对 RGB 值在它们传送到您的显示器的过程中。您可能已经使用过#758299
并且显示器会实际显示#7483A1
,但那是因为颜色#7483A1
看起来与 sRGB 颜色完全一样#758299
在此显示器上,因此用户会看到预期的正确颜色(即使它可能没有相同的 RGB 值 - 但用户看不到 RGB 值,他们看到的是颜色)。
sRGB 是一种非常流行的颜色空间,它是最兼容的颜色空间,大多数图形应用程序和系统都知道它,您可以期望每台现代显示器都能够正确显示几乎所有现有的 sRGB 颜色。但这也是一个非常有限的色彩空间。sRGB 只是目前大多数设备可以显示的所有颜色的一个子集,它也不提供 1670 万种不同的颜色(即使有很多可能的 RGB 组合)。这就是为什么存在更广泛的色彩空间的原因,就像您在所有 Adobe 图形应用程序中都可以找到的那种来自 Adobe 的色彩空间。Apple 提供了一个名为“校准色彩空间”的色彩空间——有时也称为“通用色彩空间”。你用它colorWithCalibratedRed:green:blue:alpha:
从我在文档中可以找到的内容来看,这基本上是 HSB 颜色空间,比 sRGB 更宽(在内部它以不同的格式存储颜色,但有一个固定的设备中性公式将 RBG 转换为 HSB 和 HSB 回为 RGB)。
因此,如果颜色正确性对您很重要(用户应该在屏幕上看到与您在屏幕上看到的颜色相同的颜色,无论需要什么 RGB 值来实现),您应该始终结合颜色空间指定颜色。无论您使用 sRGB 还是 Generic/Calibrated 都没有关系,只需在整个应用程序中使用同一个即可。
如果您使用以 sRGB 报告颜色的工具,则十六进制值仅与该空间匹配。请注意,所有 Web 标准都隐式使用 sRGB 颜色。因此,当您在 HTML 或 CSS 文件中使用十六进制颜色时,它们总是被解释为 sRGB 值。此外,当您从外部来源接收颜色并且该来源没有告诉您它们属于哪个颜色空间时,假设 sRGB 总是最安全的。
如果您使用Digital Color Meter应用程序(MacOS 始终附带)的颜色选择器从屏幕上读取颜色,请务必选择Display in Generic RGB或Display in sRGB ,但如果您打算使用,请不要使用Display native values这些值在应用程序或网站上。本机值只是您的系统真正用于显示该颜色的值,但这种组合仅在您的系统上看起来如此。
当然,如果您的显示器没有正确校准,这些都不起作用。现代显示器具有计算机可以下载的嵌入式校准配置文件,并且移动设备的校准也存储在设备上。如果您的显示器较旧,或者您认为配置文件不准确(或由于显示器老化而不再准确!),您需要获得显示器校准硬件并使用DisplayCAL等工具生成更好的配置文件(免费、开源、所有主要平台,支持广泛的USB硬件)
一个常见的问题是,如果我根据错误的色彩空间解释 RGB 值,实际会发生什么?好吧,它看起来不会完全错误。如果您将较小颜色空间的图像显示为来自较大颜色空间的图像,则图像看起来会非常“充满活力”(所有颜色都有很多饱和度,对比度会增强,清晰度会增强),如果它的反之,图像看起来会相当“静音”(颜色饱和度会降低很多,对比度会降低,清晰度会降低)。看这个例子:图像具有正常的色彩空间,并在右侧以正确的色彩空间显示,在左侧显示在宽色彩空间中,将图像 RGB 值视为属于该宽色彩空间,他们实际上不是,因此夸张的活力: