Java的getRGB()
方法返回一个整数,表示在默认sRGB颜色空间中的颜色(位24-31是alpha,16-23是红色,8-15是绿色,0-7是蓝色)。
UIColor
没有这样的方法,但你可以定义自己的:
extension UIColor {
func rgb() -> Int? {
var fRed : CGFloat = 0
var fGreen : CGFloat = 0
var fBlue : CGFloat = 0
var fAlpha: CGFloat = 0
if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
let iRed = Int(fRed * 255.0)
let iGreen = Int(fGreen * 255.0)
let iBlue = Int(fBlue * 255.0)
let iAlpha = Int(fAlpha * 255.0)
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return rgb
} else {
return nil
}
}
}
用法:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
if let rgb = swiftColor.rgb() {
print(rgb)
} else {
print("conversion failed")
}
请注意,这仅适用于在“RGB兼容”颜色空间(例如RGB,HSB或GrayScale)中定义的
UIColor
。如果颜色是从
CIColor
或图案图像创建的,则可能会失败,在这种情况下返回
nil
。
备注:如@vonox7所指出的那样,在32位平台上返回的值可能为负数(Java
getRGB()
方法也是如此)。如果不想要这种情况,请将
Int
替换为
UInt
或
Int64
。
反向转换为:
extension UIColor {
convenience init(rgb: Int) {
let iBlue = rgb & 0xFF
let iGreen = (rgb >> 8) & 0xFF
let iRed = (rgb >> 16) & 0xFF
let iAlpha = (rgb >> 24) & 0xFF
self.init(red: CGFloat(iRed)/255, green: CGFloat(iGreen)/255,
blue: CGFloat(iBlue)/255, alpha: CGFloat(iAlpha)/255)
}
}
let red = (rgb >> 16) & 0xFF
。但是,如果你想要分别得到这些值,那么按照上述方法计算iRed、iGreen、iBlue、iAlpha会更容易,而不是将它们组合成一个数字。 - Martin R