UicolorプリセットからRGB値を取得します
-
11-10-2019 - |
質問
私のアプリケーションは、RGBカラー値をサーバーに渡します。私のアプリは、[uicolor graycolor]、[uicolor redcolor]などのuicolor事前定義値を使用しています。次のコードを使用できることを知っています。
const CGFloat *c = CGColorGetComponents(color.CGColor)
ただし、RBGカラースペースにある色の場合だけ、[uicolor graycolor]はそうではありません。
非RBG色のRGB値を取得する方法はありますか?
ありがとう!
解決
uicolorには、RGBコンポーネントを提供するメソッドがあります(-getRed:green:blue:alpha:
)iOS 7以下でうまく機能します。 iOS 6以前に、この方法は失敗して戻ります NO
色がRGBカラースペースにない場合( [UIColor grayColor]
.)
iOS 6以前の場合、すべてのカラースペースで機能するこれを行うために私が知っている唯一の方法は、RGBカラー空間でコアグラフィックスビットマップコンテキストを作成し、色でそれを引き込むことです。その後、結果のビットマップからRGB値を読み取ることができます。これは、合理的なRGB値を持たないパターンの色(uicolor gruptableviewbackgroundcolor)などの特定の色では機能しないことに注意してください。
- (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]);
他のヒント
私はこれを行うための1つの正しい方法しか知っていません - それは電話することです CGGetColorComponents()
. 。使用してみました UIColor
's -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;
次に、Anを返す関数があります RGBA
与えられた構造 UIColor
.
RGBA RGBAFromUIColor(UIColor *color)
{
return RGBAFromCGColor(color.CGColor);
}
それは通過します UIColor
's 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の色では機能しません。
ジェシーの答えに加えて、アルファを保存する方法は次のとおりです。
- (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's 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];
ありがとう :-)