首页 > 解决方案 > 从 UIExtendedSRGBColorSpace 转换为十六进制

问题描述

我正在使用一个以 UIExtendedSRGBColorSpace 格式输出颜色的框架。我需要向用户和只接受六字符十六进制代码的后端应用程序显示此输出颜色的六字符十六进制值。我尝试了许多转换方法,但它们似乎都导致奇怪的十六进制值。例如,获取输出UIExtendedSRGBColorSpace 0.276088 -0.0525 1.05 1并使用这样的扩展我之前已经成功使用过很多次)会导致46FFFFFFFFFFFFFFF310C. 简单地将 UIExtendedSRGBColorSpace 输出作为按钮/视图上的背景颜色应用没有问题,但它获取颜色的十六进制值是问题所在。

如果对此的任何解决方案会导致某种形式的色彩准确性损失,那将是很好的,只要我能够获得一个模糊相似的十六进制代码。我对编程很陌生,花了很长时间试图理解这一点,但没有运气,所以感谢任何帮助!

标签: iosswiftswift5uicolor

解决方案


您可以将 eRGB 转换UIColorCGColor和从 eRGB 转换为 sRGB。请注意,一旦将其转换为标准 RGB,就无法再转换回扩展 RGB:

extension CGColorSpace {
    static let sRGB = CGColorSpace(name: CGColorSpace.sRGB)!
    static let extendedSRGB = CGColorSpace(name: CGColorSpace.extendedSRGB)!
}

extension CGColor {
    var color: UIColor { .init(cgColor: self) }
}

extension UIColor {
    var extendedSRGB2sRGB: UIColor? {
        guard let components = cgColor.components else { return nil }
        return CGColor(colorSpace: .extendedSRGB, components: components)?
            .converted(to: .sRGB, intent: .relativeColorimetric, options: nil)?.color
    }
}

游乐场测试:

let extendedSRGB = UIColor(red: 0.276088, green: -0.0525, blue: 1.05, alpha: 1)
let sRGB = extendedSRGB.extendedSRGB2sRGB  // r 0.276 g 0.0 b 1.0 a 1.0

推荐阅读