在 Swift 中初始化通用 RGB

Posted

技术标签:

【中文标题】在 Swift 中初始化通用 RGB【英文标题】:Init Generic RGB in Swift 【发布时间】:2017-05-05 14:33:38 【问题描述】:

我正在尝试将包含通用 RGB 颜色空间中颜色的字符串转换为 Swift 中的 UIColor。例如,典型的字符串如下所示:

0.121569 0.129412 0.156863 1

使用 macOS 中的颜色选择器,我发现这些值使用的是 Generic RGB 颜色空间。

但是,当我尝试将这些值转换为 UIColor 时,它使用的是 sRGB 颜色空间。

let red = CGFloat((components[0] as NSString).doubleValue)
let green = CGFloat((components[1] as NSString).doubleValue)
let blue = CGFloat((components[2] as NSString).doubleValue)
let alpha = CGFloat((components[3] as NSString).doubleValue)
 
print(UIColor(red: red, green: green, blue: blue, alpha: alpha))
// Log Result: NSCustomColorSpace sRGB IEC61966-2.1 colorspace 0.121569 0.129412 0.156863 1 

因此,我的应用程序中显示了不同的颜色。我通过将颜色选择器中的颜色空间更改为 IEC61966-2.1 来确认这一点,它确实显示了不同的值:

知道如何将通用 RGB 值转换为正确的 UIColor 值吗?

编辑为了澄清,我无法将字符串中的颜色值更改为另一个方案,因为我正在从 XML 文件中的外部源读取颜色

【问题讨论】:

您的意思是正确的 UIColor 值? NSColor 仅适用于 OS X 【参考方案1】:

颜色空间的颜色转换是在 CGColor 级别执行的。示例:

let sp = CGColorSpace(name:CGColorSpace.genericRGBLinear)!
let comps : [CGFloat] = [0.121569, 0.129412, 0.156863, 1]
let c = CGColor(colorSpace: sp, components: comps)!
let sp2 = CGColorSpace(name:CGColorSpace.sRGB)!
let c2 = c.converted(to: sp2, intent: .relativeColorimetric, options: nil)!
let color = UIColor(cgColor: c2)

编辑我认为你原来问题的前提是错误的。事实证明,您正在尝试使用 Xcode FontAndColorThemes 文件中的数字。这些数字是 sRGB,而不是通用 RGB。

为了证明这一点,我运行了这段代码:

    let sp = CGColorSpace(name:CGColorSpace.sRGB)!
    let comps : [CGFloat] = [0.0, 0.456, 0.0, 1]
    let c = CGColor(colorSpace: sp, components: comps)!
    let v1 = UIView(frame:CGRect(x: 50, y: 50, width: 50, height: 50))
    v1.backgroundColor = UIColor(cgColor:c)
    self.view.addSubview(v1)

该颜色取自默认颜色主题的评论颜色。嗯,结果与评论颜色相同,如此屏幕截图所示:

当我使用“吸管”工具时,我得到的答案与我简单地打开色样读取检查器时的答案相同。当我在 Xcode 的样本和我的 ios 样本上使用“吸管”工具时,我得到了相同的答案。在我看来,这似乎证明了这些颜色始终是 sRGB。

【讨论】:

其实我觉得不需要转换;您可以直接将c 包装在 UIColor 中。 我扩展了我的答案以表明问题的前提是错误的。 对于默认的xib颜色空间(Generic RGB)我们需要以编程方式使用什么颜色空间来实现相同的颜色,“genericRGBLinear”颜色空间不起作用!

以上是关于在 Swift 中初始化通用 RGB的主要内容,如果未能解决你的问题,请参考以下文章

iOS音视频采集与格式转换(yuv转rgb)

初始化前不能访问“变量”

来自表示 RGB 图像的浮点数组的初始 CV::MAT

如何在 Swift 中初始化 ALAssetsGroupType 常量?

如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController

在 Swift 中初始化 C 结构体