Cómo obtener el Código RGB (INT) a partir de un UIColor en Swift

Me gustaría obtener el Valor RGB de un UIColor en Swift:

let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
println("RGB Value is:");
println(swiftColor.getRGB()); <<<<<< How to do that ?

En Java me gustaría hacerlo de la siguiente manera:

Color cnew = new Color();
int iColor = cnew.rgb(1, 165/255, 0);
System.out.println(iColor);

¿Cómo debo obtener este valor?

InformationsquelleAutor mcfly soft | 2015-02-21

6 Kommentare

  1. 81

    El Java getRGB()
    devuelve un entero que representa el color por defecto en el espacio de color sRGB (bits 24-31 son alfa, 16-23 son de color rojo, 8-15 son de color verde, 0-7 son de color azul).

    UIColor no tiene un método, pero usted puede definir su propio:

    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
            }
        }
    }

    Uso:

    let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
    if let rgb = swiftColor.rgb() {
        print(rgb)
    } else {
        print("conversion failed")
    }

    Tenga en cuenta que esto sólo funcionará si el UIColor ha sido definida en un
    «RGB compatible con el» espacio de color (como RGB, HSB o escala de Grises). Puede
    fallar si el color ha sido creado a partir de un CIColor o un patrón
    la imagen, en ese caso nil se devuelve.

    Comentario: Como @vonox7 notado, el valor devuelto puede ser negativo
    en plataformas de 32 bits (que es también el caso con el Java getRGB() método).
    Si eso no es querido, reemplazar Int por UInt o Int64.

    El inverso de conversión es

    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)
        }
    }
    • Muchas gracias. Eso es lo que buscaba. ¿Usted tiene probablemente la misma ? (Soy muy nuevo en swift) -> getRed(iRGBValue:Int) -> Int ?
    • No estoy seguro si entiendo tu pregunta correctamente. Usted puede extraer los componentes del valor rgb con simple mayús+máscara de operaciones, por ejemplo let red = (rgb >> 16) & 0xFF. Pero si quieres que los valores por separado, entonces sería más fácil calcular iRed, iGreen, iBlue, iAlpha como en el método anterior y no combinarlos en un solo número.
    • Usted entiende correcta. vamos rojo = (rgb >> 16) & 0xFF es lo que yo buscaba. Muchas gracias !
    • Tenga en cuenta que este código incorrecto devuelve los valores de 32 bits dispositivos! Cada Int debe ser reemplazado con Int64.
    • El valor de retorno de hecho puede ser negativo. (Yo supongamos que el de Java getRGB método al que se hace referencia en la pregunta, se comporta de la misma.) Pero he añadido un comentario para aclarar que, gracias por los comentarios!
    • He sustituido todos los Int con Int64 pero me estoy poniendo demasiado grandes valores. Por ejemplo, tengo 4288243251 que convierte a valor hexadecimal es FF996633, y no es un código de color hexadecimal válido (debe ser de 6 dígitos). Alguna idea?
    • Las más significativas de 8 bits de mantener el valor de alfa, en su caso 0xFF = 255 correspondiente a la alfa = 1.0. Que es un valor normal para un color opaco.
    • hay una manera de hacer la conversión hacia atrás, de int a UIColor?

  2. 49

    De Martin R respuesta :El método también podría devolver una llamada tupla (un 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
            }
        }
    }
    • Me gusta esta respuesta mejor. Es más informativo y más listos-para-usar. 🙂 Gracias!
    • Parece que el componente alfa no debe ser multiplicado para 255.0 y el último componente de la tupla debe ser de tipo Double.
    • ¿Por qué no multiplicar el alfa por 255? Si usted está devolviendo Int, y no multiplicar por 255, sólo se va a conseguir nunca 0 o 1, ambos de los cuales son prácticamente invisibles.
  3. 6

    Escribió una extensión puede utilizar. Elegí para devolver los valores como CGFloats en lugar de Ints porque CGFloat es lo que el método init de UIColor toma

    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]
            )
        }
    }

    Nota: Swift 3.1/iOS 10 compatible, puede que no funcione en iOS 9 como UIColor.cgColor.los componentes pueden no estar disponibles

    • se bloquea si el color es UIColor.blanco, que supongo que es construido usando el 2 de parámetros de inicialización de la UIColor UIColor(blanco: CGFloat, alfa: CGFloat). Se muestra como dos parámetros en lugar de 4 y un índice fuera de rango excepción se produce
  4. 3

    Swift 4. Obtención de código hexadecimal (UInt) de 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
        }
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...