質問

Cocoa Touch で色をある色空間から別の色空間に変換する方法はありますか?

このコードの最後には次のようになります。

UIColor *grey = [UIColor colorWithWhite: 0.5 alpha: 1.0];
CGColorRef greyRef = [grey CGColor];
int x = CGColorGetNumberOfComponents(greyRef);

...x は2です。

これが必要な理由は、色を色コンポーネントのリストにコピーしようとしているためです。 CGGradientCreateWithColorComponents, 、単一の色空間内のすべての色が必要です。問題は、グレーが RGB 色空間ではなく、グレースケール色空間にあることです。(名前は今のところわかりませんが、重要ではありません。)

CGGradientRef createGradient(NSInteger inCount, NSArray* inColors, CGFloat* inLocations) {
 CGColorSpaceRef theColorspace = CGColorSpaceCreateDeviceRGB( );
 size_t numberOfComponents = 4;
 NSInteger colorSize = numberOfComponents * sizeof( CGFloat );
 CGFloat *theComponents = malloc( inCount * colorSize );
 CGFloat *temp = theComponents;
 for ( NSInteger i = 0; i < inCount; i++ ) {
  UIColor *theColor = [inColors objectAtIndex: i];
  CGColorRef cgColor = [theColor CGColor];
  const CGFloat *components = CGColorGetComponents( cgColor );
  memmove( temp, components, colorSize );
  temp += numberOfComponents;
 }
 CGGradientRef gradient = CGGradientCreateWithColorComponents( theColorspace,
                                               theComponents, inLocations, inCount );
 CGColorSpaceRelease( theColorspace );
 free( theComponents );
 return gradient;
}

グレースケール色空間で色を検索して変換できることはわかっています。しかし、これで解決できるのは 1 件だけです。見るからに この質問で, HSBも扱っていると思います。しかし、私はここにコードを書き、それについては二度と考えないようにしておきたいと思います。つまり、現在存在する色空間だけでなく、Apple が将来追加する可能性のあるすべてのものをサポートすることを意味します。私は運が悪いのでしょうか?

役に立ちましたか?

解決

私はそれらを自動的に変換するかどうかはわかりませんが、あなたは色のCGColorSpaceModelからCGColorSpaceRefを得ることができます異なる色空間を識別するためにます:

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

次に、あなたはcolorSpaceModelで定義された定数でCoreGraphics/CGColorSpace.hを比較することができます。 UIColorのgetRed:green:blue:alphakCGColorSpaceModelRGBためgetWhite:alpha作品のに対し、kCGColorSpaceModelMonochromeのために働くます。

UIColorで作成されたcolorWithHue:saturation:brightness:alpha:が実際にRGBの色空間であることに注意してください。

他のヒント

を使用して作成された色については、 [UIColor colorWithRed:green:blue:alpha:], 、使用できます UIColor getRed:green:blue:alpha:, で説明されている UIColorクラスリファレンス. 。これは iOS 5 以降の一部です。

色が作成された場合 colorWithWhite:alpha: を使用できます getWhite:alpha: 代わりに、で説明されています UIColorクラスリファレンス.

どの色空間が使用されているかを確認するには、次を使用できます。 CGColorGetColorSpace([color colorSpace]). 。ただし、メソッド呼び出しの結果を確認するだけで、次の試行にフェイルオーバーする方がおそらく簡単です。このようなもの:

if ([color getRed:&red green:&green blue:&blue alpha:&alpha]) {
    // red, green and blue are all valid
} else if if ([color getWhite:&white alpha:&alpha]) {
    red = white; green = white; blue = white;
} else {
    // can't get it
}

次のような色定数の処理方法がわかりません。 [UIColor lightGrayColor], 、一時的なビットマップに描画して検出すること以外は。これらの色定数の一部は実際にはテクスチャです。最善の策はおそらくそれらを避けることです。

これを頻繁に行う予定がある場合は、カテゴリを使用するのが適切です。

@interface UIColor(sf)
- (BOOL)sfGetRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha;
@end

@implementation UIColor(sf)
- (BOOL)sfGetRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha {
    if ([self getRed:red green:green blue:blue alpha:alpha]) return YES;
    CGFloat white;
    if ([self getWhite:&white alpha:alpha]) {
        if (red) *red = white;
        if (green) *green = white;
        if (blue) *blue = white;
        return YES;
    }
    return NO;
}
@end
迅速な3では、我々は直接使用することができます。

 let colorSpace = uiColor.cgColor.colorSpace
 let csModel = colorSpace.model

UIColorから色空間と色空間モデルを取得します。

これらを変換する別の方法は、コンテキストにそれらを描画し、コアグラフィックスはあなたのための変換を行うせることです。この質問に対する私の答えを参照してください。

取得UIColorのプリセットからRGB値

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top