colorWithSRGBRed、colorWithDeviceRed和colorWithCalibratedRed之间有什么区别?

9

有几个方便的类方法可以创建NSColor。然而,我似乎无法确定何时使用以下不同的类方法:

colorWithSRGBRed:green:blue:alpha:colorWithDeviceRed:green:blue:alpha:colorWithCalibratedRed:green:blue:alpha:

2个回答

11

tl;dr 使用经过校准的颜色空间。

不要重复文档 - 答案在 Color Programming Topics 中。

还有 Color Space Overview.

enter image description here

编辑以添加

sRGB 是其中一个命名的颜色空间。

enter image description here

最后,这是文档中的最后一张图片,我希望它可以回答您的问题 - 如果您想使用颜色空间,请使用经过校准的颜色空间。

enter image description here


好的,这大致回答了colorWithCalibratedRedcolorWithDeviceRed的问题,但是colorWithSRGBRed呢? - haroldcampbell

9
一组RGB值并不能真正描述一种颜色。它只告诉您的显卡在该颜色中需要多少百分比的红、绿和蓝光,但是像50%纯红这样的颜色并不在所有监视器上都是相同的颜色,原因有两个:
  1. 由于略有不同的伽马曲线,50%在所有监视器上的相对亮度并不相同(实际上,由于不同的背光亮度,绝对亮度也不相同,但这实际上是无关紧要的-只有相对值很重要)
  2. 即使是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仅是大多数设备可以显示的所有颜色的子集,并且它也不提供16.7百万种不同的颜色(即使有那么多可能的RGB组合)。这就是为什么存在更广泛的颜色空间,例如在所有Adobe图形应用程序中找到的Adobe颜色空间。苹果公司提供了一个名为“校准颜色空间”的颜色空间 - 有时也称为“通用颜色空间”。您可以使用colorWithCalibratedRed:green:blue:alpha:来使用它,从我在文档中找到的内容来看,这基本上是HSB颜色空间,比sRGB更广泛(内部它以不同的格式存储颜色,但有一个固定的、设备中立的公式来将RBG转换为HSB,反之亦然)。

因此,如果颜色正确性对您很重要(用户应该看到与您在屏幕上看到的相同的颜色,无论需要什么RGB值来实现这一点),您应该始终在颜色空间的组合中指定颜色。无论您使用sRGB还是通用/校准,都没有关系,只需在整个应用程序中使用相同的颜色空间。

如果您使用一个报告 sRGB 颜色的工具,那么十六进制值只匹配该空间。请注意,所有的 Web 标准都隐式地使用 sRGB 颜色。因此,当您在 HTML 或 CSS 文件中使用十六进制颜色时,这些颜色始终被解释为 sRGB 值。同样,当您从外部来源接收颜色并且这个来源没有告诉您它们所属的颜色空间时,最安全的做法是假定为 sRGB。
如果您使用 Mac OS 系统自带的 Digital Color Meter 应用程序的颜色选择器从屏幕上读取颜色,请确保选择 Generic RGB 或 sRGB 显示,但如果您计划在应用程序或网站上使用这些值,则不要使用“显示本机值”。原生值只是您的系统真正用于显示该颜色的值,但该组合仅在您的系统上呈现出这种方式。
当然,如果您的显示器未正确校准,则这些都无法正常工作。现代显示器具有嵌入式校准配置文件,计算机可以下载,移动设备也将其校准存储在设备上。如果您有旧监视器或者认为配置文件不准确(或因显示老化而不再准确!),则需要获取显示器校准硬件并使用类似DisplayCAL的工具生成更好的配置文件(免费,开源,支持所有主要平台,支持广泛的USB硬件)。
常见的问题是,如果我按照错误的颜色空间解释RGB值,会发生什么?嗯,它看起来不完全错误。如果您显示一个较小颜色空间的图像,就好像它来自较大的颜色空间一样,那么图像将看起来非常“充满活力”(所有颜色都具有很高的饱和度,对比度将增强,清晰度将增强),如果反过来,图像将看起来相当“沉闷”(颜色将具有较少的饱和度,对比度将降低,清晰度将降低)。请参见此示例:该图像具有正常的颜色空间,并在正确的颜色空间中正确显示,左侧以广泛的颜色空间显示,将图像RGB值视为属于该广泛颜色空间,而实际上它们并不属于该颜色空间,因此夸张的活力:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接