2009-04-27 12 views
7
CGFloat* colors = CGColorGetComponents(hsbaColor.CGColor); 

Gibt dies einen Float oder ein Array von Floats zurück? Es sieht so aus, als ob der Stern ein Kürzel für das Erstellen eines Arrays ist. Ist das korrekt?Was gibt CGColorGetComponents() zurück?

Wenn ich diese Funktion auf der CGColor-Eigenschaft eines HSB UIColor-Objekts aufrufen, konvertiert es die Werte in RGB?

Antwort

4

Ja, es gibt ein Array von CGFloats zurück. Insbesondere gibt es "ein Array von Intensitätswerten für die Farbkomponenten (einschließlich Alpha) zurück, die der angegebenen Farbe zugeordnet sind." Die zurückgegebenen Farbkomponenten hängen davon ab, welchen Farbraum die übergebene CGColorRef verwendet.

Weitere Informationen finden Sie in der .

+0

@htw Dank. Bedeutet das, dass es immer RGBA ist? Ich habe nirgends einen HSBA-Farbraum in den Apis gesehen. –

+0

Nicht immer - das CGColor könnte beispielsweise im CMYK- oder weißen Farbraum erstellt worden sein. Laut der Apple-Dokumentation zur Farbprogrammierung (http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/DrawColor/index.html), wird der HSBA-Farbraum als RGBA-Farbraum bezeichnet. Also, in diesem Fall würde es RGBA-Komponenten zurückgeben, da die Farbe mit HSBA-Komponenten erstellt wurde. – hbw

+0

@htw Danke! Ich habe die Dokumente durchgesehen. Das musste ich unbedingt finden. Sehr hilfreich! –

1

Von Apple:

Es gibt die Werte der Farbkomponenten (einschließlich alpha) mit einer Farbe Quarz verbunden. Ein Array von Intensitätswerten für die Farbkomponenten (einschließlich Alpha), die der angegebenen Farbe zugeordnet sind. Die Größe des Arrays ist um eins größer als die Anzahl der Komponenten des Farbraums für die Farbe.

5
CGFloat* colors = CGColorGetComponents(hsbaColor.CGColor); 

zurückgibt diese einen Schwimmer oder eine Reihe von Schwimmern? Es sieht so aus, als ob der Stern ein Kürzel für das Erstellen eines Arrays ist. Ist das korrekt?

Sortieren von.

CGFloat *colors deklariert eine Variable, die einen Zeiger auf mindestens einen CGFloat hält. CGColorGetComponents gibt einen Zeiger auf mehrere CGFloats nacheinander zurück - ein C-Array. Sie nehmen diesen Zeiger und weisen ihn der Variablen colors zu (setzen Sie den Zeiger hinein).

Deklarieren der Variablen nicht erstellen das Array. In der Tat tut auch keiner CGColorGetComponents. Was auch immer das CGColor-Objekt erstellt hat, erstellte das Array und speicherte es innerhalb des Objekts. CGColorGetComponents können Sie den Zeiger auf diesen Speicher haben.

Wenn Sie die Variable CGFloat *colors deklarieren, wird nur ein Platz (die Variable) erstellt, um einen Zeiger auf einen oder mehrere CGFloats zu speichern. Die Sache in der Variablen ist der Zeiger, und das Ding an diesem Zeiger ist das Array.

Wenn dies noch unklar ist, siehe Everything you need to know about pointers in C.

+0

Wie hoch ist die Lebensdauer des Speichers (die vier Floats im Speicher)? Wem gehört es? Wann wird es zurückgewonnen? –

+1

@NicolasMiari: Entweder besitzt das Farbobjekt genau das Array, in das man schauen kann, in diesem Fall dauert es nicht länger als das Farbobjekt, oder das Farbobjekt erstellt und gibt eine Kopie dieses Arrays automatisch wieder, in diesem Fall wird es so lange wie der aktuelle Autorelease-Pool. –

0

Um RGB-Komponenten Ich benutze:

// Get UIColor's RGB normalized components (0..1) 
CGFloat red, green, blue, alpha; 
[color getRed:&red green:&green blue:&blue alpha:&alpha]; 

// Convert RGB components to 8-bit values (0..255) 
int r = (int)(red * 255.0); 
int g = (int)(green * 255.0); 
int b = (int)(blue * 255.0);
0

Hier ist ein Beispiel dafür, wie man eine CGColorRef myColorRef zu einem NSColor richtig konvertieren myNSColor:

NSColorSpace *cp = [[NSColorSpace alloc] initWithCGColorSpace:CGColorGetColorSpace(myColorRef)]; 
const CGFloat *components = CGColorGetComponents(myColorRef); 
size_t componentCount = CGColorGetNumberOfComponents(myColorRef); 
NSColor* myNSColor = [NSColor colorWithColorSpace:cp components:components count:componentCount];