问题描述
我正在使用以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