2012-12-27 11 views
13

Teraz mogę przekonwertować ciąg szesnastkowy do kolorów RGB tak:Jak mogę uzyskać ciąg szesnastkowy z UIColor lub RGB

// Input is without the # ie : white = FFFFFF 
+ (UIColor *)colorWithHexString:(NSString *)hexString 
{ 
    unsigned int hex; 
    [[NSScanner scannerWithString:hexString] scanHexInt:&hex]; 
    int r = (hex >> 16) & 0xFF; 
    int g = (hex >> 8) & 0xFF; 
    int b = (hex) & 0xFF; 

    return [UIColor colorWithRed:r/255.0f 
         green:g/255.0f 
         blue:b/255.0f 
         alpha:1.0f]; 
} 

bu jaki sposób można przekonwertować RGB hex ciąg?

+0

Spójrz na to dostaliśmy przyjemny odpowiedzi http: // stackoverflow. com/questions/372 3846/convert-from-hex-color-to-rgb-struct-in-c –

Odpowiedz

34

Zastosowanie tej metody:

- (NSString *)hexStringForColor:(UIColor *)color { 
     const CGFloat *components = CGColorGetComponents(color.CGColor); 
     CGFloat r = components[0]; 
     CGFloat g = components[1]; 
     CGFloat b = components[2]; 
     NSString *hexString=[NSString stringWithFormat:@"%02X%02X%02X", (int)(r * 255), (int)(g * 255), (int)(b * 255)]; 
     return hexString; 
} 
+3

+1, ale 'CGFloat * components' powinny być' const CGFloat * components', a rzutowanie nie jest potrzebne. –

+0

@ H2CO3: ok. Ten kod użyłem 3 lata temu podczas nauki kakao. W każdym razie Dzięki "Kwas węglowy": str. Zawsze nienawidziłem chemii, ale teraz zacząłem kochać ... –

+0

lol, to coś z osiągnięć: P –

4

Jest to kod, który użyłem w Swift, należy mieć świadomość, że to wydaje się działać poprawnie, gdy wyślesz mu UIColor utworzony z wartościami RGBA, ale zwraca jakiś dziwny wyniki podczas wysyłania predefiniowanych kolorów jak UIColor.darkGrayColor()

func hexFromUIColor(color: UIColor) -> String 
{ 
let hexString = String(format: "%02X%02X%02X", 
Int(CGColorGetComponents(color.CGColor)[0] * 255.0), 
Int(CGColorGetComponents(color.CGColor)[1] *255.0), 
Int(CGColorGetComponents(color.CGColor)[2] * 255.0)) 
return hexString 
} 
+4

Dziwne wyniki otrzymasz, ponieważ kolory zdefiniowane przez system nie znajdują się w przestrzeni kolorów RGB, ale w przestrzeni kolorów w skali szarości. Aby zapobiec awariom lub niewłaściwym zachowaniom, należy sprawdzić zgodność dopasowanych przestrzeni kolorów (CGColorGetColorSpace()) lub przynajmniej, jeśli liczba elementów przestrzeni kolorów jest zgodna (CGColorGetNumberOfComponents()). – Alfonso

3

użytkowania to rozszerzenie UIColor dostać hexString od niego.

extension: UIColor { 
     func toHexString() -> String { 
      var r:CGFloat = 0 
      var g:CGFloat = 0 
      var b:CGFloat = 0 
      var a:CGFloat = 0 

      getRed(&r, green: &g, blue: &b, alpha: &a) 

      let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0 

      return String(format:"#%06x", rgb) 
     } 
    } 
+0

Proszę dodać objaśnienie kodu, aby ludzie mogli go lepiej zrozumieć. –

+1

Musisz zrozumieć podstawy operacji binarnych: - Otrzyma wartość czerwonego, zielonego, niebieskiego, alfa między 0.0 a 1.0, a on mnoży przez 255 (Aby mieć wartość między 0 a 255.0).Następnie operator "<<" wykonuje operację przesunięcia bajtów, aby zrównoważyć wartość Int koloru: Nie musisz przesuwać koloru niebieskiego (ponieważ jest to już właściwa wartość Int), dla zieleni, którą musisz przenieść pomijając niebieską wartość, ponieważ wartość koloru (od 0 do 255) ma 8 bajtów, które należy przesunąć o 8. Czerwony jest odsunięty na bok g, więc trzeba przesunąć o 8 + 8 (16). % 06x drukuje wartość szesnastkową. – Beninho85

3

Anoop odpowiedź nie jest poprawna w przypadku próby jej [UIColor blackColor] zwróci ciąg szesnastkowy kolor zielony jest.
Powodem jest system Łuparka wystarczająco w celu zaoszczędzenia pamięci będzie ustawiony

dla czarnego koloru
składnika [0] = 0 (r = 0, g = 0, b = 0) i
składnik [1] = 1 (a = 1).

dla koloru białego
składnika [0] = 1 (R 1 = G = 1, b = 1) i
składnik [1] = 1 (a = 1).


Zastosowanie poniżej kategorii dla UIColor hex
UIColor+Utility.h

@interface UIColor (Utility) 

/** 
Return representaiton in hex 
*/ 
-(NSString*)representInHex; 
@end 

UIColor+Utility.m

@implementation UIColor (Utility) 
-(NSString*)representInHex 
{ 
    const CGFloat *components = CGColorGetComponents(self.CGColor); 
    size_t count = CGColorGetNumberOfComponents(self.CGColor); 

    if(count == 2){ 
     return [NSString stringWithFormat:@"#%02lX%02lX%02lX", 
       lroundf(components[0] * 255.0), 
       lroundf(components[0] * 255.0), 
       lroundf(components[0] * 255.0)]; 
    }else{ 
     return [NSString stringWithFormat:@"#%02lX%02lX%02lX", 
       lroundf(components[0] * 255.0), 
       lroundf(components[1] * 255.0), 
       lroundf(components[2] * 255.0)]; 
    } 
} 
@end 

+0

Masz rację (+1), Anoop zajmuje się tylko obrazami opartymi na RGBA, podczas gdy ty także pokrywasz obrazy monochromatyczne. ale faktycznie jest jeszcze więcej możliwości: https://developer.apple.com/reference/coregraphics/cgcolorspacemodel?language=objc – vikingosegundo

Powiązane problemy