ある色空間から別の色空間に色を変換するにはどうすればよいですか?
-
11-09-2019 - |
質問
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:alpha
はkCGColorSpaceModelRGB
ため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
let colorSpace = uiColor.cgColor.colorSpace
let csModel = colorSpace.model
UIColor
から色空間と色空間モデルを取得します。
これらを変換する別の方法は、コンテキストにそれらを描画し、コアグラフィックスはあなたのための変換を行うせることです。この質問に対する私の答えを参照してください。