2012-12-27 5 views
13

Теперь я могу конвертировать шестнадцатеричную строку в RGB цвета, как это:Как я могу получить шестнадцатеричную строку из UIColor или 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]; 
} 

б, как я могу конвертировать RGB в шестнадцатеричную строку?

+0

Посмотрите на это, получил хороший ответ HTTP: // StackOverflow. ком/вопросы/372 3846/convert-from-hex-color-to-rgb-struct-in-c –

ответ

34

Используйте этот метод:

- (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, но 'CGFloat * components' должен быть' const CGFloat * components', и приведение не требуется. –

+0

@ H2CO3: нормально. Этот код я использовал 3 года назад, изучая какао. В любом случае спасибо «Углеродная кислота»: p. Я всегда ненавидел химию, но теперь я начал любить ... –

+0

lol, это что-то вроде достижения: P –

4

Это код, который я использовал в Swift, пожалуйста, знайте, что это, кажется, работает хорошо, когда вы посылаете ему UIColor созданный со значениями RGBA, но возвращает какое-то странное результаты при отправке предварительно определенных цветов, как 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

Странные результаты, которые вы получаете, - это то, что цвета, определенные системой, не находятся в цветовом пространстве RGB, а в цветовом пространстве оттенков серого. Чтобы предотвратить сбои или неправильное поведение, вы должны проверить соответствие цветового пространства (CGColorGetColorSpace()) или, по крайней мере, если совпадение цветового пространства компонента (CGColorGetNumberOfComponents()). – Alfonso

3

Используйте это расширение UIColor получить шестнадцатеричной от него.

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

Пожалуйста, добавьте некоторое объяснение вокруг кода, чтобы люди могли лучше понять его. –

+1

Вам нужно понять некоторые основы двоичных операций: - Он получает значение красного, зеленого, синего, альфа между 0.0 и 1.0 и умножается на 255 (для значения от 0 до 255,0).После этого оператор «<<» выполняет операцию сдвига байтов для смещения значения значения Int: вам не нужно перемещать синий цвет (потому что это уже правильное значение Int), для зеленого вам нужно перемещаться просто в сторону синего значения, потому что значение цвета (от 0 до 255) находится на 8 байтах, вам нужно сдвинуть на 8. Красный - это в сторону g, поэтому вам нужно двигаться на 8 + 8 (16). % 06x печатает шестнадцатеричное значение. – Beninho85

3

Anoop ответ не является правильным, как если бы вы попробовать его с [UIColor blackColor] он возвращает шестнадцатеричный строку зеленый цвет в.
Причины система Скалывателя достаточно, чтобы сохранить память он установит

Для получения черного цвета
компонента [0] = 0 (г = 0, г = 0, B = 0) и
компонента [1] = 1 (а = 1).

Для получения белого цвета
компонента [0] = 1 (г = 1, г = 1, B = 1) и
компонента [1] = 1 (а = 1).


Использование ниже категории для UIColor проклясть
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

Вы правы (+1), Anoop просто работает с изображениями на основе RGBA, в то время как вы также покрываете монохромные изображения. но на самом деле есть еще больше возможностей: https://developer.apple.com/reference/coregraphics/cgcolorspacemodel?language=objc – vikingosegundo

Смежные вопросы