ios - 如何在 Swift 5 中将 HSB 转换为十六进制
问题描述
我有一个带有 HSB(Hue, Saturation, Brightness) 值的颜色,我希望将 RBG 直接转换为十六进制字符串。我怎样才能做到这一点?有没有不使用 UIColor API 的方法,我想实现我自己的功能,比如:
func toHex(h: CGFloat, s: CGFloat, b: CGFloat) -> String {
var hex: String
//conversion
return hex // For example "#02AAFE"
}
解决方案
您可以使用 UIColor 初始化程序创建 UIColor,然后使用 UIColor getRed 方法提取 rgb 颜色。然后你只需要将组件值乘以 255 并使用字符串基数初始化器从它们创建一个六进制表示:
extension UIColor {
var rgb: (red: CGFloat, green: CGFloat, blue: CGFloat)? {
var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0
guard getRed(&r, green: &g, blue: &b, alpha: nil) else { return nil }
return (r,g,b)
}
var hexa: String? {
guard let (r,g,b) = rgb else { return nil }
return "#" + UInt8(r*255).hexa + UInt8(g*255).hexa + UInt8(b*255).hexa
}
}
extension UInt8 {
var hexa: String {
let value = String(self, radix: 16, uppercase: true)
return (self < 16 ? "0": "") + value
}
}
let red = UIColor(hue: 1, saturation: 1, brightness: 1, alpha: 1)
let white = UIColor(hue: 1, saturation: 0, brightness: 1, alpha: 1)
let black = UIColor(hue: 1, saturation: 0, brightness: 0, alpha: 1)
red.hexa // "#FF0000" red
white.hexa // "#ffffff" white
black.hexa // "#000000" black
现在,如果您真的想避免使用 UIColor api,您可以使用这篇文章作为从 HSB 转换为 RGB 的参考:
func toHex<F: BinaryFloatingPoint>(h: F, s: F, b: F) -> String {
var red, green, blue, i, f, p, q, t: F
i = (h * 6).rounded(.down)
f = h * 6 - i
p = b * (1 - s)
q = b * (1 - f * s)
t = b * (1 - (1 - f) * s)
switch h * 360 {
case 0..<60, 360: red = b; green = t; blue = p
case 60..<120: red = q; green = b; blue = p
case 120..<180: red = p; green = b; blue = t
case 180..<240: red = p; green = q; blue = b
case 240..<300: red = t; green = p; blue = b
case 300..<360: red = b; green = p; blue = q
default: fatalError()
return "#" + UInt8(red * 255).hexa + UInt8(green * 255).hexa + UInt8(blue * 255).hexa
}
toHex(h: 1, s: 1, b: 1) // "#FF0000" red
toHex(h: 1, s: 0, b: 1) // "#FFFFFF" white
toHex(h: 1, s: 0, b: 0) // "#000000" black
toHex(h: 0.8333, s: 1, b: 0.5) // "#7F007F" purple
推荐阅读
- json - Google Apps 脚本:尝试在 API 响应中选择特定对象时返回“null”,但我可以在原始响应中看到它
- java - 编译maven项目时如何隐藏警告?
- reactjs - 系统抛出异常并显示 playerProfile.map 不是函数
- python - 在密集网络中生成和检测社区的模型
- c# - vstudio 调试模式下的 CS0103 说东西不存在
- node.js - 在 alpine linux 上安装 nodejs 10 + npm
- python - seaborn的swarmplot可以调整点的标记形状吗?
- php - 覆盖 WordPress 插件类以更改上传图像大小
- python - 将 ReportLab Pdf 附加到模型
- sql - SQL 的 union 默认 order by 子句?