2013-03-15 52 views
6

Tôi đang sử dụng thư viện colorsys của python để chuyển đổi giá trị màu RGB thành HLS. Chỉ cần để xác minh, tôi đã thử chuyển đổi trở lại RGB và nhận được một giá trị khác nhau trở lại. Tôi có thể hiểu được sự khác biệt nhỏ vì vấn đề chính xác, nhưng những giá trị này khác nhau đáng kể.Chuyển đổi RGB thành HLS và quay lại

Dưới đây là mã của tôi:

import colorsys 
r=192 
g=64 
b=1 

hlsval = colorsys.rgb_to_hls(r,g,b) 
rgbval=colorsys.hls_to_rgb(hlsval[0],hlsval[1],hlsval[2]) 

print hlsval, rgbval 

Output:

(0.16666666666666666, 96.5, -1.0) (191.99999999999994, 192.0, 1.0) 

Giá trị xanh tắt bởi hơn 200%

tôi đã cố gắng một số giá trị khác, và mỗi khi một trong những thành phần bị giảm một lượng đáng kể. Tui bỏ lỡ điều gì vậy?

+1

giá trị của 'a',' b' và 'c' ? –

+2

@AshwiniChaudhary: Rõ ràng là anh ta có tương đương với 'a, b, c = r, g, b' ở đâu đó (hoặc anh ta không quên chỉnh sửa mã của mình để sử dụng' r, g, b' thay vì 'a, b, c' hoặc một cái gì đó), bởi vì đó là chính xác các giá trị bạn nhận được với' a, b, c = 192, 64, 1'. – abarnert

+0

Vâng, xin lỗi về điều đó. Tôi đã chỉnh sửa nó ngay bây giờ. – user2175594

Trả lời

15

Giá trị của bạn là cách, cách bên ngoài giới hạn của không gian màu.

Từ the docs:

Tọa độ trong tất cả các không gian màu được nổi giá trị điểm. Trong không gian YIQ, tọa độ Y nằm trong khoảng từ 0 đến 1, nhưng tọa độ I và Q có thể dương hoặc âm. Trong tất cả các không gian khác, tọa độ là tất cả từ 0 đến 1.

Tôi đoán bạn đang mong đợi chúng là giá trị byte trong khoảng từ 0 đến 255? Chỉ cần chia cho 255 đầu tiên:

r, g, b = 192, 64, 1 
r, g, b = [x/255.0 for x in r, g, b] 
h, l, s = colorsys.rgb_to_hls(r, g, b) 
r, g, b = colorsys.hls_to_rgb(h, l, s) 
r, g, b = [x*255.0 for x in r, g, b] 
print r, g, b 

này sẽ cung cấp cho bạn:

192.0 64.0 1.0 

Nếu bạn muốn hiểu lý do tại sao bạn nhận được lỗi vô lý như vậy khi bạn đi theo con đường bên ngoài giới hạn của không gian màu. Trước tiên, hãy đọc hai tài liệu được liên kết từ các tài liệu để hiểu tại sao các giá trị bên ngoài vùng màu là vô nghĩa và tại sao bạn yêu cầu nó tạo ra các giá trị cho các ràng buộc không thể. Sau đó, để tìm ra chính xác tại sao nó thất bại theo cách nó thay vì một số cách khác, bạn cần biết thuật toán nào đang sử dụng - điều này khá dễ dàng, vì các tài liệu liên kết tới mã nguồn, đó là Python tinh khiết và khá dễ đọc .

(PS, tôi có thể tưởng tượng những gì 9650% nhẹ nhàng có thể trông như thế nào, nhưng tôi tò mò về -100% bão hòa. Có lẽ một cái gì đó Lovecraftian.)