Bagaimana cara mendapatkan nilai RGB dari UIColor?


99

Saya membuat objek warna menggunakan kode berikut.

curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];

Bagaimana cara mengambil nilai RGB dari objek warna yang dibuat?


kemungkinan duplikat Mengekstrak rgb dari UIColor
Roddy

5
Sebagai catatan, parameter yang diteruskan ke metode -initWithHue: saturation: brightness: alpha: semuanya harus antara 0,0 dan 1,0.
geekinit

Jawaban:


84
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Tautan ini memberikan detail lebih lanjut:


Jawaban di bawah ini seharusnya menjadi komentar. Ups.
defmech

17
Catatan: ini hanya berfungsi untuk warna dalam ruang RGB. Misalnya, ini tidak akan berfungsi pada [UIColor whiteColor] karena tidak dalam RGB.
Jason

2
Saya memposting beberapa kode contoh dalam pertanyaan ini agar ini berfungsi dalam konteks non-RGB: stackoverflow.com/questions/4700168/…
Jesse Rusak

4
Jika seseorang menemukan masalah tentang bagaimana mendapatkan nilai colors, Anda dapat menulis sesuatu seperti,CGFloat red = colors[0];
Hemang

error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
pkamb

119

Di iOS 5 Anda dapat menggunakan:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];

Ini hanya didukung di iOS 5.0 atau yang lebih baru.
Jon Trauntvein

3
Berhati-hatilah bahwa metode ini hanya akan berhasil jika warna awal berada dalam "ruang warna yang kompatibel", yang dapat bervariasi bergantung pada perangkat / OS. Misalnya, saya baru saja menemukan bahwa memanggil ini di [UIColor darkGrayColor] akan gagal di iPad 2 yang menjalankan iOS 7. Namun warna yang sama berfungsi dengan baik di iPad Air yang menjalankan iOS 8.
devios1

@ devios1 Hal ini mungkin dapat diselesaikan dengan membuat serialisasi warna terlebih dahulu kemudian deserialisasi menggunakan NSKeyedArchiver, seperti:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
Albert Renshaw

40

SWIFT 3 & 4

Saya menemukan bahwa cgColor.components tidak selalu mengembalikan 4 nilai warna, jadi saya mengubahnya sehingga mendapatkannya dari pembungkus CIColor

extension UIColor {
    var redValue: CGFloat{ return CIColor(color: self).red }
    var greenValue: CGFloat{ return CIColor(color: self).green }
    var blueValue: CGFloat{ return CIColor(color: self).blue }
    var alphaValue: CGFloat{ return CIColor(color: self).alpha }
}

SWIFT 2

extension UIColor {
    var red: CGFloat{ return CGColorGetComponents(self.CGColor)[0] }
    var green: CGFloat{ return CGColorGetComponents(self.CGColor)[1] }
    var blue: CGFloat{ return CGColorGetComponents(self.CGColor)[2] }
    var alpha: CGFloat{ return CGColorGetComponents(self.CGColor)[3] }
}

Ini bukan cara yang paling efisien jadi saya tidak akan menggunakan ini di mana tampilan akan terus digambar ulang.


11

Semoga bermanfaat

CGFloat red, green, blue, alpha;

//Create a sample color

UIColor *redColor = [UIColor redColor];

//Call 

[redColor getRed: &red 
  green: &green
  blue: &blue 
  alpha: &alpha];
NSLog(@"red = %f. Green = %f. Blue = %f. Alpha = %f",
  red,
  green,
  blue,
  alpha);

7

Baru saja membuat kategori untuk ini.

NSLog(@"%f", [UIColor blueColor].blue); // 1.000000

Itu seperti:

typedef enum { R, G, B, A } UIColorComponentIndices;

@implementation UIColor (EPPZKit)

-(CGFloat)red
{ return CGColorGetComponents(self.CGColor)[R]; }

-(CGFloat)green
{ return CGColorGetComponents(self.CGColor)[G]; }

-(CGFloat)blue
{ return CGColorGetComponents(self.CGColor)[B]; }

-(CGFloat)alpha
{ return CGColorGetComponents(self.CGColor)[A]; }

@end

Bagian dari eppz!kitdengan lebih banyak barang UIColor .


5
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Terima kasih. Saya harus menambahkan constdi awal baris karena itu menghasilkan peringatan.


apakah itu tidak menghasilkan peringatan untuk mencoba secara implisit melemparkan CGFloat ke float? :)
braden

5
 UIColor *color = [[UIColor greenColor] retain]; //line 1

//OR(You will have color variable either like line 1 or line 2)

color = curView.backgroundColor;//line 2
CGColorRef colorRef = [color CGColor];

int _countComponents = CGColorGetNumberOfComponents(colorRef);

if (_countComponents == 4) {
    const CGFloat *_components = CGColorGetComponents(colorRef);
    CGFloat red     = _components[0];
    CGFloat green = _components[1];
    CGFloat blue   = _components[2];
    CGFloat alpha = _components[3];

    NSLog(@"%f,%f,%f,%f",red,green,blue,alpha);
}

[color release];

2

Jawaban David Rees versi Swift 3:

extension UIColor {

    var redValue: CGFloat{
        return cgColor.components! [0]
    }

    var greenValue: CGFloat{
        return cgColor.components! [1]
    }

    var blueValue: CGFloat{
        return cgColor.components! [2]
    }

    var alphaValue: CGFloat{
        return cgColor.components! [3]
    }
}

2

Anda dapat menggunakan komponen CIColor (swift 5)

let ciColor = CIColor(color: backgroundColor)
let alpha = ciColor.alpha
let red = ciColor.red
let blue = ciColor.blue
let green = ciColor.green

ini juga berfungsi untuk ruang warna non-RGB


1

Sejak iOS 2.0, ada metode instance pribadi yang UIColordipanggil styleStringyang mengembalikan representasi string RGB atau RGBA dari warna, bahkan untuk warna seperti whiteColor di luar ruang RGB.

Objective-C:

@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

Di Swift Anda bisa menggunakan header penghubung untuk mengekspos antarmuka. Dengan Swift murni, Anda perlu membuat @objcprotokol dengan metode privat, dan unsafeBitCast UIColordengan protokol:

@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)

1

Jawaban pilihan teratas sudah usang:

error:: 3: 1: error: 'CGColorGetComponents' telah diganti dengan properti 'CGColor.components'

Sebagai gantinya, gunakan

myUIColor.cgColor.components


1
biarkan color = myUIColor.cgColor.components biarkan r = color! [0] biarkan g = color! [1] biarkan b = color! [2]
Gurjinder Singh

0

Saya ingin mendapatkan warna latar belakang UITableViewStyle"UITableViewStyleGrouped" jadi dalam viewDidAppear:metode saya menambahkan kode:

NSLog(@"%@", self.tableView.backgroundView.backgroundColor);

Itu melakukan apa yang saya antisipasi dan mengembalikan log:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

Jadi singkatnya ketik saja NSLog(@"%@", [UIColor whateverColor]);


0

Menggunakan HandyUIKit membuatnya sangat mudah :

import HandyUIKit    

let color = UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 0.4)

// get any of the rgba values
color.rgba.red    // => 0.1
color.rgba.green  // => 0.2
color.rgba.blue   // => 0.3
color.rgba.alpha  // => 0.4

Ada juga opsi serupa untuk mendapatkan hsbanilai :

let color = UIColor(hue: 0.1, saturation: 0.2, brightness: 0.3, alpha: 0.4)

// you can get any of the hsba values, too
color.hsba.hue         // => 0.1
color.hsba.saturation  // => 0.2
color.hsba.brightness  // => 0.3
color.hsba.alpha       // => 0.4

Cukup instal menggunakan Carthage dan Anda siap melakukannya.

Saya harap ini membantu!


0

Beberapa makro berguna yang saya buat untuk ini dan kontrol warna lainnya:

Dalam kasus Anda, Anda hanya akan menggunakan

getRGBA(myColor, red, green, blue, alpha);

NSLog(@"Red Value: %f", red);
NSLog(@"Blue Value: %f", green);
NSLog(@"Green Value: %f", blue);

Makro:

#define rgba(r,g,b,a) [UIColor colorWithRed:((float)(r))/255.0f green:((float)(g))/255.0f blue:((float)(b))/255.0f alpha:a]
#define rgb(r,g,b) rgba(r, g, b, 1.0f)

#define rgbaf(r,g,b,a) [UIColor colorWithRed:(r) green:(g) blue:(b) alpha:a]
#define rgbf(r,g,b) rgbaf(r, g, b, 1.0f)

#define rgba_fromColor(__color, __r, __g, __b, __a) \
CGFloat __r, __g, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getRed:&__r green:&__g blue:&__b alpha:&__a];
#define getRGBA(__color, __r, __g, __b, __a) hsba_fromColor(__color, __r, __g, __b, __a)

#define getRed(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return r;\
})()\
)

#define getGreen(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return g;\
})()\
)

#define getBlue(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return b;\
})()\
)

#define getAlpha(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return a;\
})()\
)










#define hsba(h,s,b,a) [UIColor colorWithHue:((float)(h))/360.0f saturation:((float)(s))/100.0f brightness:((float)(b))/100.0f alpha:a]
#define hsb(h,s,b) hsba(h, s, b, 1.0f)

#define hsbaf(h,s,b,a) [UIColor colorWithHue:(h) saturation:(s) brightness:(b) alpha:a]
#define hsbf(h,s,b) rgbaf(h, s, b, 1.0f)

#define hsba_fromColor(__color, __h, __s, __b, __a) \
CGFloat __h, __s, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getHue:&__h saturation:&__s brightness:&__b alpha:&__a];
#define getHSBA(__color, __h, __s, __b, __a) rgba_fromColor(__color, __h, __s, __b, __a)

#define getHue(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return h;\
})()\
)

#define getSaturation(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return s;\
})()\
)

#define getBrightness(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return b;\
})()\
)

/*
///already defined in RGBA macros
#define getAlpha(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return a;\
})()\
)
*/

-5

atur UIColor Anda seperti ini

UIColor.FromRGB(128, 179, 255)

ini untuk Xamarin ios ... tetapi yang pasti ada metode seperti ini dengan cepat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.