colorWithSRGBRed与colorWithDeviceRed和colorWithCalibratedRed之间的区别是什么

时间:2012-09-24 15:45:53

标签: objective-c macos nscolor

有几种方便类方法可用于创建NSColor。但是,我似乎无法确定何时使用下面的不同类方法:

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

2 个答案:

答案 0 :(得分:11)

tl; dr 使用校准的色彩空间。

而不是反驳文档 - 答案在Color Programming Topics

Color Space Overview

enter image description here

已编辑添加

sRGB是其中一个名为Color Spaces。

enter image description here

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

enter image description here

答案 1 :(得分:7)

一组RGB值并不能真正描述颜色。它只告诉你的图形适配器你想要的那种颜色的红色,绿色和蓝色光的百分比,但是50%纯红色的颜色在所有显示器上都不是同一种颜色,原因有两个:

  1. 50%与所有显示器上的相对亮度不同,因为伽玛曲线略有不同(由于背光亮度不同,它的绝对亮度也不一样,但是#39;实际上是不相关的 - 只有相对值很重要)

  2. 即使100%的红色也没有与显示器有不同的红色调相同的#34;阴影"红色,取决于它们的背光颜色和滤色镜。

  3. 因此RGB的相同组合在不同的显示器上可能看起来不同。作为你的显示器上的橙色,它可能看起来像一些非常明亮的红色,在其他显示器上看起来像一个深黄色。它到处都是相同的RGB值,但颜色不一样。

    要使RGB描述"颜色",它还需要一个颜色空间,它定义了一个颜色空间,其中RGB值就像是该空间中的坐标,因此描述了一种精确的颜色。

    enter image description here最初的上传者是英语维基百科的Cpesacreta - 由en.wikipedia转移到Commons by aboalbiss。

    如果您使用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。

    如果您使用数字色度计应用程序(总是随MacOS一起提供)的颜色选择器从屏幕上读取颜色,请务必选择以通用RGB显示在sRGB中显示但如果您打算在应用或网站上使用这些值,请不要使用显示原生值。原生值只是系统真正用于显示该颜色的值,但这种组合在您的系统上只是这样。

    当然,如果您的显示器没有正确校准,这一切都无法解决。现代显示器具有计算机可以下载的嵌入式校准配置文件,并且移动设备也将其校准存储在设备上。如果你有一台旧显示器,或者你认为配置文件不准确(或因显示器老化而不再准确!),你需要获得显示校准硬件并使用像DisplayCAL这样的工具来生成更好的配置文件(免费,OpenSource,所有主要平台,支持各种USB硬件)

    一个常见的问题是,如果我根据错误的色彩空间解释RGB值,究竟会发生什么?好吧,它看起来完全没错。如果您显示较小色彩空间的图像,就好像它是来自较大的色彩空间的图像一样,那么图像看起来非常“充满活力”#34; (所有颜色都有很多饱和度,对比度会增强,清晰度会提高),如果反过来,图像会看起来很平静" (颜色饱和度会降低很多,对比度会降低,脆度会降低)。请参阅此示例:图像具有正常的色彩空间,并在右侧显示正确的色彩空间,在左侧显示宽色域空间,将图像RGB值视为属于该宽色彩空间,事实上他们并没有,因此夸张的活力:

    enter image description here