Подтвердить что ты не робот

Как получить код RGB (INT) из UIColor в Swift

Я хотел бы получить значение RGB для UIColor в Swift:

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);

Как мне получить это значение?

4b9b3361

Ответ 1

Java getRGB() возвращает целое число, представляющее цвет в цветовом пространстве sRGB по умолчанию (биты 24-31 - альфа, 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-совместимое" цветовое пространство (например, RGB, HSB или GrayScale). Это может потерпеть неудачу, если цвет был создан из 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)
    }
}

Ответ 2

От Martin R answer: метод может также вернуть именованный кортеж (функция 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
        }
    }
}

Ответ 3

Swift 3.0 IOS 10

let colour = UIColor.red
let rgbColour = colour.cgColor
let rgbColours = rgbColour.components

Ответ 4

Написал расширение, которое вы можете использовать. Я решил вернуть значения как CGFloat, а не Int, потому что CGFloat - это то, что метод init 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]
        )
    }
}

Примечание. Совместимость Swift 3.1/iOS 10 может не работать в iOS 9, поскольку UIColor.cgColor.com могут быть недоступны

Ответ 5

Swift 4. Получение шестнадцатеричного кода (UInt) из 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
    }
}

Ответ 6

В Swift вы можете использовать Color Literal, чтобы получить RGB Color.

enter image description here

Просто так

enter image description here

Надеюсь это кому-нибудь пригодится.