2009-05-20 23 views
12

Tôi đang cố gắng trích xuất các thành phần rgb của UIColor để vẽ tay các pixel trong một CGBitmapContext. Mã mẫu sau hoạt động tốt cho hầu hết các hằng số UIColor nhưng, gây nhầm lẫn, không phải tất cả. Để wit:Kết quả bất thường nhận được các thành phần màu của một số UIColors

CGColorRef color = [[UIColor yellowColor] CGColor]; 
const float* rgba = CGColorGetComponents(color); 

float r = rgba[0]; 
float g = rgba[1]; 
float b = rgba[2]; 
float a = rgba[3]; 

NSLog(@"r=%f g=%f b=%f a=%f", r, g, b, a); 

Kết quả cho [UIColor yellowColor] trên là
r = 1,000000 g = 1,000000 b = 0,000000 a = 1,000000, như mong đợi.

[UIColor redColor] cung cấp cho r = 1,000000 g = 0,000000 b = 0,000000 a = 1,000000, lại như mong đợi. Tương tự cho blueColorgreenColor.

Tuy nhiên, kết quả cho [UIColor blackColor][UIColor whiteColor] có vẻ hoàn toàn bất thường và tôi không biết mình đang làm gì sai (nếu thực sự là tôi).

Vì chưng [UIColor blackColor] cho r = 0,000000 g = 1,000000 b = 0,000000 a = 0,000000, mà là một tranparent xanh,

[UIColor whiteColor] cho r = 1,000000 g = 1,000000 b = 0,000000 a = 0,000000 , là màu vàng trong suốt.

Tôi đánh giá cao nó nếu ai đó có thể một trong hai:

(1) giải thích những gì tôi đang làm sai
(2) sao chép kết quả bất thường của tôi và cho tôi biết nó không phải là tôi, hoặc
(3) đánh vào đầu tôi bằng một cái búa lớn để nó ngừng đập quá nhiều.

Howard

Trả lời

11

Bạn giả sử không gian màu luôn là RGBA, không phải như vậy.

Hãy thử mã này:

CGColorRef color = [[UIColor blackColor] CGColor]; 
const CGFloat* rgba = CGColorGetComponents(color); 
CGColorSpaceRef space = CGColorGetColorSpace(color); 
CGColorSpaceModel model = CGColorSpaceGetModel(space); 
NSLog(@"%d", model); 

Và mô hình sẽ mang lại kCGColorSpaceModelMonochrome.

+0

Tuyệt vời! Cảm ơn bạn. Trước đây tôi đã bị nhầm lẫn bởi tham chiếu thường xuyên tới 'CGColorGetNumberOfComponents (color)' trước khi gọi 'CGColorGetComponents (color)'. Bây giờ tôi hiểu tại sao. Nhân tiện, không phải là cách in ra * tên * của mô hình ở trên, và không chỉ là giá trị của nó? – hkatz

+0

Trình gỡ lỗi sẽ hiển thị cho bạn tên, tôi không chắc chắn bạn có thể in nó, vì đó là định nghĩa của một số. – pgb

2

Tôi nghĩ rằng điều bạn đang thiếu là màu sắc có thể được xác định trong không gian màu khác nhau: bạn đang giả định tất cả họ đang RGBA.

Ví dụ: the docs tuyên bố rằng blackColor "Trả về đối tượng màu có giá trị thang độ xám là 0.0 và giá trị alpha là 1.0". Vì vậy, tôi nghĩ rằng chỉ có hai thành phần có giá trị cho màu đen, không phải bốn.

Các vấn đề liên quan