Je souhaite obtenir la valeur RVB d'un UIColor dans Swift:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
println("RGB Value is:");
println(swiftColor.getRGB()); <<<<<< How to do that ?
Dans Java je le ferais comme suit:
Color cnew = new Color();
int iColor = cnew.rgb(1, 165/255, 0);
System.out.println(iColor);
Comment devrais-je obtenir cette valeur?
Le Java getRGB()
) renvoie un entier représentant la couleur dans l'espace colorimétrique sRGB par défaut (les bits 24 à 31 sont alpha, 16 à 23 sont rouges). , 8-15 sont en vert, 0-7 sont en bleu).
UIColor
ne dispose pas d'une telle méthode, mais vous pouvez définir la vôtre:
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
}
}
}
Usage:
let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
if let rgb = swiftColor.rgb() {
print(rgb)
} else {
print("conversion failed")
}
Notez que cela ne fonctionnera que si UIColor
a été défini dans un espace colorimétrique "compatible RGB" (tel que RGB, HSB ou GrayScale). Il peut échouer si la couleur a été créée à partir d'un CIColor
ou d'une image de motif. Dans ce cas, nil
est renvoyé.
Remarque: Comme @ vonox7 l’a remarqué, la valeur renvoyée peut être négative sur les plates-formes 32 bits (ce qui est également le cas avec le Java getRGB()
méthode) .Si cela n'est pas voulu, remplacez Int
par UInt
ou Int64
.
La conversion inverse est
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)
}
}
Réponse de Martin R: La méthode pourrait également renvoyer un tuple nommé (a 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
Écrit une extension que vous pouvez utiliser. J'ai choisi de renvoyer les valeurs sous la forme CGFloat
s plutôt que Int
s parce que CGFloat
correspond à la méthode init de UIColor.
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]
)
}
}
Remarque: Swift 3.1/iOS 10, risque de ne pas fonctionner sous iOS 9, car UIColor.cgColor.components pourrait ne pas être disponible.
Swift 4. Obtenir le code hexadécimal (UInt) d’UIColor:
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
}
}