Frage

Gibt es eine Cocoa Touch Art und Weise Farben von einem Farbraum in einem anderen?

zu konvertieren

Am Ende dieses Codes:

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

... x 2.

Der Grund, warum ich brauche das ist Ich versuche Farben auf eine Liste von Farbkomponenten für CGGradientCreateWithColorComponents zu kopieren, die alle Farben in einem einzigen Farbraum benötigt. Das Problem ist, dass Grau in dem Graustufen-Farbraum ist, und nicht an dem RGB. (Der Name entgeht mir im Moment, aber es ist nicht wichtig.)

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;
}

Ich weiß, dass ich für Farben in der Graustufen-Farbraum aussehen kann und wandeln sie. Aber das löst nur einen Fall. auf diese Frage aus suchen, denke ich HSB auch gehandhabt wird. Aber ich mag einige Codes hier schreiben und denken, nie wieder darüber nach, was bedeutet, nicht nur die Farbräume unterstützt, die gibt es jetzt aber alles, was Apple könnte möglicherweise in der Zukunft hinzuzufügen. Bin ich kein Glück?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, wie sie automatisch zu konvertieren, aber unterschiedliche Farbräume identifizieren Sie den CGColorSpaceModel aus der CGColorSpaceRef der Farbe bekommen können:

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

Dann können Sie colorSpaceModel mit den Konstanten definiert in CoreGraphics/CGColorSpace.h vergleichen. UIColor des getRed:green:blue:alpha arbeitet für kCGColorSpaceModelRGB, während getWhite:alpha Arbeiten für kCGColorSpaceModelMonochrome.

Beachten Sie, dass ein UIColor, die mit colorWithHue:saturation:brightness:alpha: erstellt wurden tatsächlich im RGB-Farbraum.

Andere Tipps

Für Farben erstellt [UIColor colorWithRed:green:blue:alpha:] verwenden, können Sie UIColor getRed:green:blue:alpha:, beschrieben in UIColor Klassenreferenz . Es ist ein Teil von iOS 5 und höher.

Wenn die Farbe mit colorWithWhite:alpha: erstellt wurde Sie die getWhite:alpha: stattdessen verwenden können, beschrieben in UIColor Klassenreferenz .

Um zu bestimmen, welcher Farbraum verwendet wird, können Sie CGColorGetColorSpace([color colorSpace]) verwenden. Aber es ist wahrscheinlich einfacher, nur das Ergebnis des Methodenaufrufes zu überprüfen, dann nicht auf den nächsten Versuch. So etwas wie folgt aus:

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
}

Ich weiß nicht, wie Farbkonstanten wie [UIColor lightGrayColor] zu handhaben, anders als sie in eine temporäre Bitmap zeichnen und sie zu erfassen. Einige dieser Farbkonstanten sind tatsächlich Texturen; wahrscheinlich die beste Wahl ist, sie zu vermeiden.

Wenn Sie diese auf tun viel planen, es ist eine geeignete Verwendung einer Kategorie:

@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

In swift 3 können wir direkt verwenden

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

den Farbraum und Farbraummodell von einem UIColor erhalten.

Eine andere Möglichkeit, diese zu konvertieren, indem sie in Kontexten zeichnen und lassen Core-Grafik für Sie die Konvertierung zu tun. Siehe meine Antwort auf diese Frage:

Get RGB-Wert von UIColor Presets

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top