2011-10-13 34 views
7

này liên quan đến CSS mã màu:Trình duyệt xử lý rgb (phần trăm) như thế nào; cho số lạ

Đối hexcode chúng ta có thể đại diện cho 16.777.216 màu từ # 000000 đến #FFFFFF

Theo W3C Specs, tỷ lệ phần trăm RGB hợp lệ phù hợp trong một phạm vi từ (0.0% đến 100,0%) về cơ bản cho bạn 1,003,003,001 kết hợp màu sắc. (1001^3)

Theo thông số kỹ thuật:

giá trị bên ngoài gam thiết bị nên được cắt bớt hoặc ánh xạ vào gam khi gam là biết: các giá trị màu đỏ, xanh lá cây, và màu xanh phải đã thay đổi để nằm trong phạm vi được hỗ trợ bởi thiết bị. Tác nhân người dùng có thể thực hiện ánh xạ màu sắc có chất lượng cao hơn từ một gam màu đến cách khác. Đối với một màn hình CRT thông thường, mà gam thiết bị giống như sRGB, bốn quy tắc dưới đây là tương đương:

Tôi nghi ngờ nếu trình duyệt thực sự có thể làm cho tất cả những giá trị này. (nhưng nếu họ làm vui lòng cho tôi biết và bỏ qua phần còn lại của bài đăng này)

Giả sử có một số ánh xạ từ rgb (phần trăm) đến hex. (Nhưng một lần nữa Im không thực sự chắc chắn cách làm việc này)

Lý tưởng nhất là tôi muốn tìm hiểu chức năng rgb (tỷ lệ phần trăm) -> HEX

Nếu tôi phải đoán nó có lẽ sẽ là một trong những 3.

1) Vòng sang HEX gần

2) ceil đến HEX gần

3) sÀN đến HEX gần

vấn đề là tôi cần phải chính xác trên bản đồ và tôi không biết tìm kiếm ở đâu. Không có cách nào mà mắt tôi có thể phân biệt màu sắc ở cấp độ đó, nhưng có thể có một số cách thông minh để kiểm tra từng màu này.

Nó cũng có thể phụ thuộc vào trình duyệt. Điều này có thể được kiểm tra?

EDIT:

Firefox seems to round from empirical testing. 

EDIT:

Tôi đang tìm thông qua mã nguồn của Firefox ngay bây giờ,

nsColor.h 
// A color is a 32 bit unsigned integer with four components: R, G, B 
// and A. 
typedef PRUint32 nscolor; 

Dường Fiefox chỉ có chỗ cho 255 giá trị cho mỗi R, G và B. Hinting rằng làm tròn có thể là câu trả lời, nhưng có thể đôi khi được thực hiện với kênh alpha.

+3

Nếu bạn không thể biết sự khác biệt giữa '# 000000' và' # 000001', tại sao bạn cần công thức chính xác? Cũng là một cách kiểm tra mạch sẽ là để hiển thị một khối màu, nhấn Print Screen, và sử dụng công cụ Eyedropper của một chương trình đồ họa để tìm ra giá trị hex kết quả. – Toomai

+0

Tôi đang làm việc trên một loại trình phân tích cú pháp tôi đoán, rõ ràng người dùng cuối không thể biết sự khác biệt giữa # 000000 và # 000001, nhưng mã cần phải tương đương trên tất cả các tài khoản. Tôi làm như ý tưởng eyedropper như là một bước đầu tiên mặc dù, cảm ơn! – Ray

+0

Nếu spec không chỉ định ánh xạ, thì tôi hy vọng nó sẽ phụ thuộc vào trình duyệt, hoặc ít nhất nếu nó không phụ thuộc vào trình duyệt, thì đó chỉ là trùng hợp ngẫu nhiên mà nó không phải. Tôi tưởng tượng miễn là bạn nhất quán sau đó bạn đang được chính xác như bạn có thể được. Bạn đã kiểm tra với firebug hoặc một số như vậy trên phong cách tính toán để xem nó kết thúc như thế nào? – jswolf19

Trả lời

1

Tôi nghĩ rằng tôi tìm thấy một giải pháp cho Firefox anyways, nghĩ bạn có thể muốn một theo dõi:

Nhìn qua các mã nguồn Tôi tìm thấy một file:

nsCSSParser.cpp

Đối với mỗi rgb tỷ lệ nó như sau:

  1. Phải mất thành phần tỷ lệ nhân nó 255.0f
  2. Stores nó trong một phao
  3. Passes nó vào một hàm NSToIntRound
  4. Kết quả của NSToIntRound được lưu vào một kiểu dữ liệu số nguyên 8 bit, trước khi được kết hợp với 2 thành phần kia và một kênh alpha alpha

Nhìn để xem chi tiết thêm về NSToIntRound:

nsCoord.h 
inline PRInt32 NSToIntRound(float aValue) 
{ 
    return NS_lroundf(aValue); 
} 

NSToIntRound là một chức năng wrapper cho NS_lroundf

nsMathUtils.h 
inline NS_HIDDEN_(PRInt32) NS_lroundf(float x) 
{ 
    return x >= 0.0f ? PRInt32(x + 0.5f) : PRInt32(x - 0.5f); 
} 

Chức năng này thực sự rất thông minh, đã cho tôi một thời gian để giải mã (Tôi không thực sự có nền C++ tốt).

Giả sử x là tích cực

Nó cho biết thêm 0.5f để x và sau đó sử dụng một số nguyên

Nếu phần thập phân của x là nhỏ hơn 0,5, thêm 0,5 sẽ không thay đổi số nguyên và phân số một phần được cắt ngắn,

Nếu không giá trị số nguyên bị va chạm bởi 1 và phần phân số sẽ bị cắt bớt.

  1. Vì vậy, tỷ lệ phần trăm của từng thành phần là lần đầu tiên nhân 255.0f
  2. Sau đó tròn và đúc thành một Integer 32bit
  3. và sau đó bỏ lại thành một Integer 8 bit

Tôi đồng ý với hầu hết các bạn nói rằng điều này dường như là một vấn đề phụ thuộc trình duyệt, vì vậy tôi sẽ làm một số nghiên cứu thêm về các trình duyệt khác.

Cảm ơn một nhóm!

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