从UIExtendedSRGBColorSpace转换为Hex

问题描述

我正在使用以UIExtendedSRGBColorSpace格式输出颜色的框架。我需要为用户和仅接受六位字符十六进制代码的后端应用程序显示此输出颜色的六位字符十六进制值。我尝试了许多转换方法,但它们似乎都导致奇数十六进制值。例如,获得输出UIExtendedSRGBColorSpace 0.276088 -0.0525 1.05 1并使用像this这样的扩展名(我已经多次成功使用过)会产生46FFFFFFFFFFFFFFF310C。只需将UIExtendedSRGBColorSpace输出作为背景颜色应用到按钮/视图上就没有问题,但是它会得到问题的颜色的十六进制值。

任何解决方案都会导致某种形式的色彩准确性下降,这是很好的,只要我能够获得大致相似的十六进制代码即可。我是编程的新手,花了很多时间尝试理解这一点,所以请多加帮助!

解决方法

您可以将UIColor转换为CGColor,然后从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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...