初始化 UIColor displayP3 颜色时的最佳实践

精灵

创建 UIColor 时,默认情况下是否最好使用init(displayP3Red:green:blue:alpha:)进行可用性检查?老实说,我看不出两者之间的区别,所以我不确定这有多重要,但我希望有人能对此有所了解。

if #available(iOS 10.0, *) {
    self.init(displayP3Red: r, green: g, blue: b, alpha: a)
} else {
    self.init(red: r, green: g, blue: b, alpha: a)
}
瑞克斯特

不,这些调用不是等价的。将相同的 RGBA 值传递给每个将导致不同的颜色。

这是一篇讨论色彩空间差异的方便文章它很好地类比颜色空间就像标尺上的长度单位。如果我说某个对象的长度为 1.0,那么除非您知道“1.0”的长度,否则这没有任何意义。英寸?米?福隆?秒差距?单位的定义与测量中数量的含义有很大不同。

同样,如果我说一种颜色的红色成分为 1.0,那也没有任何意义,除非我还说1.0有多红(绿色和蓝色组件同上。)在 Web 和应用程序设计的大部分历史中,可以安全地假设所有测量都与 sRGB 标准相关——1.0 红色意味着“与 sRGB 一样红”。

但是随着手机、电脑、电视等的出现,支持更大的色域,这种假设不再安全。Display P3 是较新的 Apple 设备使用的色彩空间(与较新的 4K HDR 电视使用的色彩空间非常匹配)。P3 支持的颜色范围比 sRGB 更广,这意味着“sRGB 所能达到的红色”还不够红色。

为了更轻松地在 sRGB 和 P3 设备之间进行互操作,Apple 的 API 包括“扩展 sRGB”色彩空间。在常规 sRGB 中,就像在大多数颜色空间中一样,分量值被限制在 0.0-1.0 范围内——也就是说,你不能有 1.1 的红色分量,如果你尝试,你只会把它限制在 1.0 . 对于 0.0-1.0 范围内的分量值,扩展 sRGB 被定义为与 sRGB 相同,但允许使用该范围之外的值来表示 sRGB 色域之外的颜色。(这就是 Apple 文档所说的UIColor(red:green:blue:alpha:)使用扩展 sRGB 色彩空间的意思。)


UIColorCGColor它位于其下方)在 iOS 中不提供用于色彩空间转换的方便实用程序,但NSColor在 macOS 中提供,这使得它可以方便地说明差异:

显示 sRGB 与 P3 红色差异的 Xcode 游乐场屏幕截图

第一个红色相当于UIColor(displayP3Red: 1, green: 0, blue: 0, alpha: 1)在iOS中。第二个相当于UIColor(red: 1, green: 0, blue: 0, alpha: 1)在iOS中。如果您在 P3 显示器*上查看此答案,您可能至少会注意到色样中的细微差别。

在下面,注意转换后的值。“sRGB max red”,也UIColor(red: 1, green: 0, blue: 0, alpha: 1)就是大致相当于(r: 0.918, g: 0.2, b: 0.139, a: 1)P3 中的。“P3 max red”,又名UIColor(displayP3Red: 1, green: 0, blue: 0, alpha: 1)在 sRGB 之外,但可以在“extended sRGB”中表示为(r: 1.093, g: -0.227, b: -0.15, a: 1).

* 配备 P3 显示屏的 Apple 设备包括 iPhone 7、iPad Pro 2016、iMac 2015 秋季、MacBook Pro 2016 秋季及更新机型

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章