如何从 Swift 中的 UIColor 获取 RGB 代码 (INT)
How to get the RGB Code (INT) from an UIColor in Swift
我想获取 Swift 中 UIColor 的 RGB 值:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
println("RGB Value is:");
println(swiftColor.getRGB()); <<<<<< How to do that ?
在Java中我会做如下:
Color cnew = new Color();
int iColor = cnew.rgb(1, 165/255, 0);
System.out.println(iColor);
我应该如何获得这个值?
Java getRGB()
returns 表示默认 sRGB 颜色中颜色的整数 space(位 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)
// (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue).
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return rgb
} else {
// Could not extract RGBA components:
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")
}
请注意,这仅在 UIColor
已定义在
"RGB-compatible" 颜色space(例如 RGB、HSB 或灰度)。它可能
如果颜色是从 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)
}
}
来自 Martin R 的回答:该方法还可以 return 命名元组(Swift 2 特征):
extension UIColor {
func rgb() -> (red:Int, green:Int, blue:Int, alpha: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)
return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha)
} else {
// Could not extract RGBA components:
return nil
}
}
}
Swift 3.0 IOS 10
let colour = UIColor.red
let rgbColour = colour.cgColor
let rgbColours = rgbColour.components
写了一个你可以使用的扩展。我选择 return 值作为 CGFloat
s 而不是 Int
s 因为 CGFloat
是 UIColor 的 init 方法采用
extension UIColor {
var colorComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
guard let components = self.cgColor.components else { return nil }
return (
red: components[0],
green: components[1],
blue: components[2],
alpha: components[3]
)
}
}
注意:Swift 3.1/iOS 10 兼容,可能无法在 iOS 9 中使用,因为 UIColor.cgColor.components 可能不可用
Swift 4. 从 UIColor 获取十六进制代码 (UInt):
extension UIColor {
var coreImageColor: CIColor {
return CIColor(color: self)
}
var hex: UInt {
let red = UInt(coreImageColor.red * 255 + 0.5)
let green = UInt(coreImageColor.green * 255 + 0.5)
let blue = UInt(coreImageColor.blue * 255 + 0.5)
return (red << 16) | (green << 8) | blue
}
}
在 swift 中,您可以使用 Color Literal 来获取 RGB 颜色。
就这样
我希望这对某人有用。
看起来它在最近的版本中变得更简单了,值是 0-1,所以对于标准的 rbga 结果它们需要是 * 255(a 除外)
let red = yourColor.lottieColorValue.r * 255
let blue= yourColor.lottieColorValue.b * 255
let green= yourColor.lottieColorValue.g * 255
let alpha = yourColor.lottieColorValue.a
我想获取 Swift 中 UIColor 的 RGB 值:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
println("RGB Value is:");
println(swiftColor.getRGB()); <<<<<< How to do that ?
在Java中我会做如下:
Color cnew = new Color();
int iColor = cnew.rgb(1, 165/255, 0);
System.out.println(iColor);
我应该如何获得这个值?
Java getRGB()
returns 表示默认 sRGB 颜色中颜色的整数 space(位 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)
// (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue).
let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue
return rgb
} else {
// Could not extract RGBA components:
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")
}
请注意,这仅在 UIColor
已定义在
"RGB-compatible" 颜色space(例如 RGB、HSB 或灰度)。它可能
如果颜色是从 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)
}
}
来自 Martin R 的回答:该方法还可以 return 命名元组(Swift 2 特征):
extension UIColor {
func rgb() -> (red:Int, green:Int, blue:Int, alpha: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)
return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha)
} else {
// Could not extract RGBA components:
return nil
}
}
}
Swift 3.0 IOS 10
let colour = UIColor.red
let rgbColour = colour.cgColor
let rgbColours = rgbColour.components
写了一个你可以使用的扩展。我选择 return 值作为 CGFloat
s 而不是 Int
s 因为 CGFloat
是 UIColor 的 init 方法采用
extension UIColor {
var colorComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
guard let components = self.cgColor.components else { return nil }
return (
red: components[0],
green: components[1],
blue: components[2],
alpha: components[3]
)
}
}
注意:Swift 3.1/iOS 10 兼容,可能无法在 iOS 9 中使用,因为 UIColor.cgColor.components 可能不可用
Swift 4. 从 UIColor 获取十六进制代码 (UInt):
extension UIColor {
var coreImageColor: CIColor {
return CIColor(color: self)
}
var hex: UInt {
let red = UInt(coreImageColor.red * 255 + 0.5)
let green = UInt(coreImageColor.green * 255 + 0.5)
let blue = UInt(coreImageColor.blue * 255 + 0.5)
return (red << 16) | (green << 8) | blue
}
}
在 swift 中,您可以使用 Color Literal 来获取 RGB 颜色。
就这样
我希望这对某人有用。
看起来它在最近的版本中变得更简单了,值是 0-1,所以对于标准的 rbga 结果它们需要是 * 255(a 除外)
let red = yourColor.lottieColorValue.r * 255
let blue= yourColor.lottieColorValue.b * 255
let green= yourColor.lottieColorValue.g * 255
let alpha = yourColor.lottieColorValue.a