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

Điều này có trả về phao hoặc một mảng nổi không? Dường như dấu hoa thị là viết tắt để tạo mảng. Đúng không?CGColorGetComponents() trả về cái gì?

Khi tôi gọi hàm này trên thuộc tính CGColor của đối tượng UIColor HSB, nó có chuyển đổi giá trị thành RGB không?

Trả lời

4

Có, nó trả về một mảng CGFloats. Cụ thể, nó trả về "một mảng các giá trị cường độ cho các thành phần màu (bao gồm cả alpha) được kết hợp với màu được chỉ định".

Các thành phần màu sắc được trả về phụ thuộc vào không gian màu được sử dụng CGColorRef được chuyển.

Thông tin khác có thể được tìm thấy trong số CGColor documentation.

+0

@htw Cảm ơn. Điều này có nghĩa là nó luôn luôn là RGBA? Tôi đã không nhìn thấy một không gian màu HSBA bất cứ nơi nào trong api của. –

+0

Không phải luôn luôn - CGColor có thể đã được tạo trong không gian màu CMYK hoặc màu trắng. Tuy nhiên, theo tài liệu lập trình màu của Apple (http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/DrawColor/index.html), không gian màu HSBA được chỉ định là không gian màu RGBA. Vì vậy, vâng, trong trường hợp này, nó sẽ trả về các thành phần RGBA, vì màu sắc được tạo ra với các thành phần HSBA. – hbw

+0

@htw Cảm ơn! Tôi đã xem qua các tài liệu. Đây chắc chắn là những gì tôi cần tìm. Rất hữu ích! –

1

Từ Apple:

Nó trả về các giá trị của các thành phần màu (bao gồm alpha) kết hợp với một màu thạch anh. Một mảng các giá trị cường độ cho các thành phần màu (bao gồm cả alpha) được kết hợp với màu được chỉ định. Kích thước của mảng là nhiều hơn số lượng thành phần của không gian màu cho màu sắc.

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

Điều này trả về một float, hoặc một mảng phao? Dường như dấu hoa thị là viết tắt để tạo mảng. Đúng không?

Sắp xếp.

CGFloat *colors tuyên bố biến có chứa con trỏ đến ít nhất một CGFloat. CGColorGetComponents trả về một con trỏ tới một số CGFloats, một cái khác với một mảng C khác. Bạn lấy con trỏ đó và gán nó vào (đặt con trỏ vào) biến số colors.

Khai báo biến không tạo mảng. Trên thực tế, không phải CGColorGetComponents. Bất cứ thứ gì tạo ra đối tượng CGColor đã tạo mảng và lưu nó bên trong đối tượng; CGColorGetComponents cho phép bạn có con trỏ đến bộ nhớ đó.

Khai báo biến số CGFloat *colors chỉ tạo một vị trí — biến - để lưu con trỏ vào một hoặc nhiều CGFloats. Điều trong biến là con trỏ, và điều ở con trỏ đó là mảng.

Nếu điều này vẫn chưa rõ ràng, hãy xem Everything you need to know about pointers in C.

+0

Tuổi thọ của bộ nhớ (bốn bộ nhớ nổi trong bộ nhớ) là gì? Ai sở hữu nó? Khi nào nó được khai hoang? –

+1

@NicolasMiari: Đối tượng màu sở hữu một mảng mà nó cho phép bạn nhìn vào, trong trường hợp nó sẽ không còn dài hơn đối tượng màu hoặc đối tượng màu tạo và tự động sao chép một mảng đó, trong trường hợp này cuối cùng miễn là hồ bơi autorelease hiện tại. –

0

Để có được thành phần RGB tôi sử dụng:

// 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

Dưới đây là một ví dụ về cách bạn có thể chuyển đổi một cách chính xác một CGColorRef myColorRef một NSColor 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];