【发布时间】:2017-09-27 20:30:06
【问题描述】:
创建 NSColor 有几个方便的类方法。但是,我似乎无法确定何时使用以下不同的类方法:
colorWithSRGBRed:green:blue:alpha: vs colorWithDeviceRed:green:blue:alpha: vs colorWithCalibratedRed:green:blue:alpha:
【问题讨论】:
标签: objective-c macos nscolor
创建 NSColor 有几个方便的类方法。但是,我似乎无法确定何时使用以下不同的类方法:
colorWithSRGBRed:green:blue:alpha: vs colorWithDeviceRed:green:blue:alpha: vs colorWithCalibratedRed:green:blue:alpha:
【问题讨论】:
标签: objective-c macos nscolor
tl;dr使用校准的色彩空间。
而不是重复文档 - 答案在 Color Programming Topics
编辑添加
sRGB 是命名的颜色空间之一。
最后 - 这是文档中的最后一张图片,我希望它能回答你的问题 - 如果你想使用色彩空间,请使用校准过的。
【讨论】:
colorWithCalibratedRed 和colorWithDeviceRed 的回答是松散的,但是colorWithSRGBRed 呢?
一组 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 始终附带)的颜色选择器从屏幕读取颜色,请务必选择 以通用 RGB 显示或以 sRGB 显示,但如果您计划在应用程序或网站上使用这些值,请不要使用 显示原生值。本机值只是您的系统真正用于显示该颜色的值,但这种组合仅在您的系统上看起来如此。
当然,如果您的显示器没有正确校准,这一切都无法奏效。现代显示器具有计算机可以下载的嵌入式校准配置文件,并且移动设备的校准也存储在设备上。如果您的显示器较旧,或者您认为配置文件不准确(或由于显示器老化而不再准确!),您需要获得显示器校准硬件并使用DisplayCAL 之类的工具生成更好的配置文件(免费,开源,所有主要平台,支持广泛的 USB 硬件)
一个常见的问题是,如果我根据错误的色彩空间解释 RGB 值,实际会发生什么?好吧,它看起来不会完全错误。如果您将较小颜色空间的图像显示为来自较大颜色空间的图像,那么图像看起来会非常“充满活力”(所有颜色都有很多饱和度,对比度会增强,清晰度会增强),如果它的反之,图像会看起来相当“静音”(颜色饱和度会降低很多,对比度会降低,清晰度会降低)。看这个例子:图像具有正常的色彩空间,并在右侧以正确的色彩空间显示,在左侧显示在宽色彩空间中,将图像 RGB 值视为属于该宽色彩空间,他们实际上不是,因此夸张的活力:
【讨论】: