我的应用程序我将RGB颜色值传递给服务器。我的应用程序使用uicolor预定义值,例如[Uicolor GrayColor],[Uicolor Redcolor]。我知道我可以使用以下代码:

const CGFloat *c = CGColorGetComponents(color.CGColor)

但是,仅对于RBG颜色空间中的颜色,[Uicolor GrayColor]不是。

有什么方法可以获取非RBG颜色的RGB值?

谢谢!

有帮助吗?

解决方案

uicolor有一种方法可以为您提供RGB组件(-getRed:green:blue:alpha:)在iOS 7或更高版本上效果很好。在iOS 6和更早的iOS上,此方法将失败并返回 NO 如果颜色不在RGB颜色空间中(如 [UIColor grayColor].)

对于iOS 6和更早的iOS,我知道在所有颜色空间中起作用的唯一方法是在RGB颜色空间中创建核心图形位图上下文,并用颜色绘制其中。然后,您可以从结果位图中读取RGB值。请注意,这对某些颜色不起作用,例如图案颜色(例如[Uicolor GrouptableViewBackgroundColor]),它们没有合理的RGB值。

- (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color {
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char resultingPixel[4];
    CGContextRef context = CGBitmapContextCreate(&resultingPixel,
                                                 1,
                                                 1,
                                                 8,
                                                 4,
                                                 rgbColorSpace,
                                                 kCGImageAlphaNoneSkipLast);
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
    CGContextRelease(context);
    CGColorSpaceRelease(rgbColorSpace);

    for (int component = 0; component < 3; component++) {
        components[component] = resultingPixel[component] / 255.0f;
    }
}

您可以使用类似的东西:

    CGFloat components[3];
    [self getRGBComponents:components forColor:[UIColor grayColor]];
    NSLog(@"%f %f %f", components[0], components[1], components[2]);

其他提示

我只知道一种正确的方法 - 那就是打电话 CGGetColorComponents(). 。我尝试使用 UIColor' -getRed:green:blue:alpha, ,但它在灰度颜色上无法正常工作。所以这是我要做的:

首先,我很简单 struct 这让我可以轻松地操纵RGBA颜色。这种结构在其他地方可用于执行各种颜色操纵的事情,例如伽玛校正和颜色平均。

typedef struct
{
  CGFloat r;  // Red component (0 <= r <= 1)
  CGFloat g;  // Green component (0 <= g <= 1)
  CGFloat b;  // Blue component (0 <= b <= 1)
  CGFloat a;  // Alpha/opacity component (0 <= a <= 1)
}
RGBA;

然后,我有一个返回的函数 RGBA 结构给定 UIColor.

RGBA RGBAFromUIColor(UIColor *color)
{
  return RGBAFromCGColor(color.CGColor);
}

它通过 UIColor' CGColor 要进行较低的功能进行繁重的工作。

RGBA RGBAFromCGColor(CGColorRef color)
{
  RGBA rgba;

  CGColorSpaceRef color_space = CGColorGetColorSpace(color);
  CGColorSpaceModel color_space_model = CGColorSpaceGetModel(color_space);
  const CGFloat *color_components = CGColorGetComponents(color);
  int color_component_count = CGColorGetNumberOfComponents(color);

  switch (color_space_model)
  {
    case kCGColorSpaceModelMonochrome:
    {
      assert(color_component_count == 2);
      rgba = (RGBA)
      {
        .r = color_components[0],
        .g = color_components[0],
        .b = color_components[0],
        .a = color_components[1]
      };
      break;
    }

    case kCGColorSpaceModelRGB:
    {
      assert(color_component_count == 4);
      rgba = (RGBA)
      {
        .r = color_components[0],
        .g = color_components[1],
        .b = color_components[2],
        .a = color_components[3]
      };
      break;
    }

    default:
    {
      NSLog(@"Unsupported color space model %i", color_space_model);
      rgba = (RGBA) { 0, 0, 0, 0 };
      break;
    }
  }

  return rgba;
}

因此,这非常适合灰度颜色(例如 UIColor.whiteColor, UIColor.blackColor, UIColor.grayColor, 等等)以及任何红色/绿色/蓝色/α颜色。但是,它与HSB颜色无法使用。

加上杰西的答案,这是如何保存alpha的方法:

- (void)getRGBAComponents:(CGFloat [4])components forColor:(UIColor *)color {
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char resultingPixel[4] = {0};
    CGContextRef context = CGBitmapContextCreate(&resultingPixel,
                                                 1,
                                                 1,
                                                 8,
                                                 4,
                                                 rgbColorSpace,
                                                 kCGImageAlphaPremultipliedLast);
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
    CGContextRelease(context);
    CGColorSpaceRelease(rgbColorSpace);

    CGFloat a = resultingPixel[3] / 255.0;
    CGFloat unpremultiply = (a != 0.0) ? 1.0 / a / 255.0 : 0.0;
    for (int component = 0; component < 3; component++) {
        components[component] = resultingPixel[component] * unpremultiply;
    }
    components[3] = a;
}

我对“如何将颜色从一种颜色空间转换为另一种颜色空间”的答案?.

要识别不同的颜色空间,您可以得到 CGColorSpaceModel 从颜色的 CGColorSpaceRef:

UIColor* color = some color;
CGColorSpaceRef colorSpace = CGColorGetColorSpace([color CGColor]);
CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);

那你可以比较 colorSpaceModel 定义的常数 CoreGraphics/CGColorSpace.h. 。 Uicolor的 getRed:green:blue:alpha 效劳于 kCGColorSpaceModelRGB, , 然而 getWhite:alpha 效劳于 kCGColorSpaceModelMonochrome.

您只需使用此功能即可获得RGB值

UIColor *chooseColor = view.backgroundColor;
CGFloat red,green,blue,alpha;

[chooseColor getRed:&red green:&green blue:&blue alpha:&alpha]; 

谢谢 :-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top