【问题标题】:How do I get red green blue (RGB) and alpha back from a UIColor object?如何从 UIColor 对象中获取红绿蓝 (RGB) 和 alpha?
【发布时间】:2010-12-02 13:47:39
【问题描述】:

我得到了从这个方法返回的 UIColor:

- (UIColor *)getUserSelectedColor {   
    return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0];
}

得到这样的颜色:

UIColor *selectedColor = [(ColorPickerView *)alertView getUserSelectedColor];

现在我想从 selectedColor 中获取红色、绿色、蓝色,以便使用这些值。我想要介于 0 和 1 之间的值。

【问题讨论】:

  • 附注;你应该看看命名约定。 getColor 不好有两个原因,首先它使用了 Java 开发人员常见的错误 get 前缀,其次它没有描述它是什么颜色。一个更好的名字可能是userSelectedColor。看看 UIKit 的名称 getter 和属性如何,并效仿。
  • @PeyloW,userSelectedColor 如何比getUserSelectedColor 更好地描述“它是什么颜色”?知道没有get 前缀,它是完全相同的东西。我个人不明白为什么 Apple 建议不要使用 get 前缀。在某些情况下,我使用它是为了更轻松地自动完成,并避免与私有 API 可能发生的冲突。例如,我在UIColor 上有一个类别,我可以轻松输入[UIColor get 并查看我所有方法的列表。如果我想要深红色,darkRedColor 会在 Apple 决定也添加它时造成问题,但 getDarkRedColor 不会。

标签: objective-c iphone cocoa-touch rgb uicolor


【解决方案1】:

我认为您应该有一个a look here,其中 Ars 的指南展示了如何扩展 UIColor 类以支持访问颜色组件。

【讨论】:

    【解决方案2】:

    访问SelectedColor.CGColor时崩溃的原因可能是你没有保留getColor的结果,或许你需要的是:

    SelectedColor = [[(ColorPickerView *)alertView getColor] retain];
    

    您只能从使用 RGB 颜色空间的UIColor 获取 RGB 颜色组件,因为您使用的是colorWithRed:green:blue:alpha:,这不是问题,但如果您的代码发生更改,请注意这一点。

    考虑到这一点,获取颜色组件真的很容易:

    const CGFloat* components = CGColorGetComponents(SelectedColor.CGColor);
    NSLog(@"Red: %f", components[0]);
    NSLog(@"Green: %f", components[1]); 
    NSLog(@"Blue: %f", components[2]);
    NSLog(@"Alpha: %f", CGColorGetAlpha(SelectedColor.CGColor));
    

    【讨论】:

    • 喜欢掩盖圆角之类的?确定添加一个新问题。
    • 嗨佩洛!我使用了相同的方法,但是当我通过黑色时,它会给出绿色分量。你知道为什么会这样吗你也可以在这里看到我的相同帖子-> stackoverflow.com/questions/4155642/…
    • @Ganesh - 这仅适用于 RGB 颜色,+[UIColor blackColor] 不是 RGB 颜色,并且对于 brightness 只有一个颜色分量。
    • 我提出了一个考虑到非 RGB 颜色的解决方案。
    【解决方案3】:

    这段代码的 sn-p 应该适用于 RGB 和灰度:

    CGFloat *components = (CGFloat *) CGColorGetComponents(<UIColor instance>.CGColor);
    if(CGColorGetNumberOfComponents(<UIColor instance>.CGColor) == 2)
    {
      //assuming it is grayscale - copy the first value
      components[2] = components[1] = components[0];
    }
    

    【讨论】:

      【解决方案4】:

      此解决方案也适用于非 RGB 颜色,例如黑色或白色。

      UIColor *color = [UIColor blackColor];
      CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;
      // iOS 5
      if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
           [color getRed:&red green:&green blue:&blue alpha:&alpha];
      } else {
           // < iOS 5
           const CGFloat *components = CGColorGetComponents(color.CGColor);
           red = components[0];
           green = components[1];
           blue = components[2];
           alpha = components[3];
      }
      
      // This is a non-RGB color
      if(CGColorGetNumberOfComponents(color.CGColor) == 2) {
          CGFloat hue;
          CGFloat saturation;
          CGFloat brightness;
          [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];
      
      }
      

      【讨论】:

      • “非 RGB”代码块也仅适用于 iOS5+。你可能想这样标记它。
      【解决方案5】:

      在大多数情况下,这将起作用,除非转换为 RGB 不起作用。

      float red, green, blue, alpha;
      BOOL conversionToRGBWentOk = [color getRed:&red green:&green blue:&blue alpha:&alpha];
      

      事实上,这就是这些方法的用途。不过,如果 conversionToRGBWentOkNO,你就会遇到问题。

      【讨论】:

      • 谢谢,您的解决方案是我见过的最好的解决方案。
      • 但这会导致我的 ios4.3 模拟器崩溃。兼容IOS5+。
      【解决方案6】:

      你这样做很简单

      CGFloat red,green,blue,alpha;
      
      [UIColorobject getRed:&red green:&green blue:&blue alpha:&alpha];
      

      在红色、绿色、蓝色和 alpha 中,您将获得 rgb 值 如果您有任何问题,请询问...

      谢谢

      【讨论】:

        【解决方案7】:

        只需添加属性ColorLiteral,如示例所示。 Xcode 会提示你一个完整的颜色列表供你选择。

        self.view.backgroundColor = ColorLiteral 
        

        【讨论】:

          【解决方案8】:

          我认为这是一条可行的路。如果您还需要使用 alpha 参数,您可以像处理 R G 和 B 一样从输入中插入 alpha。

          - (UIColor *)getColorBetweenColor:(UIColor *)color1 andColor:(UIColor *)color2 percentage:(CGFloat)percent {
              CGFloat red1, green1, blue1, alpha1;
              CGFloat red2, green2, blue2, alpha2;
          
              [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
              [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];
          
              double resultRed = red1 + percent * (red2 - red1);
              double resultGreen = green1 + percent * (green2 - green1);
              double resultBlue = blue1 + percent * (blue2 - blue1);
          
              return [UIColor colorWithRed:resultRed green:resultGreen blue:resultBlue alpha:1];
          }
          

          【讨论】:

            【解决方案9】:

            以下是我为这个和其他颜色控件制作的一些有用的宏:

            在您的情况下,您只需使用

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

            宏:

            #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) rgba_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) hsba_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;\
            })()\
            )
            */
            

            【讨论】:

              【解决方案10】:

              有一个 Swift 扩展 :)

              extension UIColor {
              
                  var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
                      var red: CGFloat = 0.0
                      var green: CGFloat = 0.0
                      var blue: CGFloat = 0.0
                      var alpha: CGFloat = 0.0
                      getRed(&red, green: &green, blue: &blue, alpha: &alpha)
              
                      return (red: red, green: green, blue: blue, alpha: alpha)
                  }
              
                  var redComponent: CGFloat {
                      var red: CGFloat = 0.0
                      getRed(&red, green: nil, blue: nil, alpha: nil)
              
                      return red
                  }
              
                  var greenComponent: CGFloat {
                      var green: CGFloat = 0.0
                      getRed(nil, green: &green, blue: nil, alpha: nil)
              
                      return green
                  }
              
                  var blueComponent: CGFloat {
                      var blue: CGFloat = 0.0
                      getRed(nil, green: nil, blue: &blue, alpha: nil)
              
                      return blue
                  }
              
                  var alphaComponent: CGFloat {
                      var alpha: CGFloat = 0.0
                      getRed(nil, green: nil, blue: nil, alpha: &alpha)
              
                      return alpha
                  }
              }
              

              它与 Swift 4.2 兼容,也适用于黑色、灰色等 2 种组件颜色。 您可以像这样访问特定的运河:

              myColor.rgba.blue
              

              或者,它的等价物:

              myColor.blueComponent
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-07-09
                • 2010-10-01
                • 2014-08-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多