2011-10-13 8 views
7

Jest to związane z CSS kodów kolorystycznych:Jak przeglądarki obsługują rgb (procent); o dziwnych numerów

Dla hexcode możemy reprezentować 16,777,216 kolorów z # 000000 do #FFFFFF

Według dokumentacji W3C, Poprawne procenty RGB zmieścić się w przedziale od (0,0% do 100,0%) zasadniczo daje 100000000 kombinacji kolorów. (1001^3)

Według specyfikacji:

wartości poza gamy urządzeń powinny zostać przycięty lub odwzorowywane gamy gdy skala jest znana: czerwone, zielone i niebieskie wartości muszą być zmienione tak, aby mieściło się w zakresie obsługiwanym przez urządzenie . Użytkownicy mogą wykonywać odwzorowywanie kolorów o wyższej jakości z jednego zakresu do innego. Dla typowego monitora CRT, którego gama urządzeń jest taka sama jak sRGB, cztery zasady poniżej są równoważne:

Jestem wątpliwe, czy rzeczywiście może sprawić przeglądarek wszystkie te wartości. (ale jeśli tak, to proszę powiedz mi i zignoruj ​​resztę tego posta)

Zakładam, że istnieje pewne odwzorowanie od rgb (procent) do hex. (Ale jeszcze nie jestem pewien jak to działa)

Idealnie chciałabym się dowiedzieć RGB function (procent) -> HEX

Gdybym miał zgadywać będzie to prawdopodobnie jeden z tych 3.

1) okrągłych do najbliższego HEX

2) odgórnie najbliższego HEX

3) podłogi do najbliższego HEX

problemem jest to konieczne bądź dokładny na mapowaniu i nie mam pojęcia, gdzie szukać. Nie ma możliwości, aby moje oczy odróżniały kolor na tym poziomie, ale być może istnieje sprytny sposób przetestowania każdego z nich. Może to być również zależne od przeglądarki. Czy to może być testowane?

EDIT:

Firefox seems to round from empirical testing. 

EDIT:

szukam za pośrednictwem kodu źródłowego Firefoksa teraz,

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

Wydaje Fiefox ma miejsce tylko dla 255 wartości dla każdego R, G i B. Podpowiedź, że zaokrąglanie może być odpowiedzią, ale być może coś się robi z kanałem alfa.

+3

Jeśli nie możesz odróżnić "# 000000" od "# 000001", dlaczego potrzebujesz dokładnej formuły? Również okrężnym sposobem testowania byłoby wyświetlenie bloku koloru, kliknięcie ekranu drukowania i użycie narzędzia kroplomierza programu graficznego, aby znaleźć wynikową wartość heksadecymalną. – Toomai

+0

Wydaje mi się, że pracuję nad rodzajem analizatora składni, oczywiście użytkownik końcowy nie powinien być w stanie odróżnić wartości od 000000 do # 000001, ale kod musi być równoważny na wszystkich kontach. Podoba mi się pomysł kroplomierza jako pierwszy krok, dziękuję! – Ray

+0

Jeśli specyfikacja nie określa mapowania, to oczekuję, że będzie zależna od przeglądarki, lub przynajmniej jeśli nie zależy od przeglądarki, to tylko zbieg okoliczności, że tak nie jest. Wyobrażam sobie, że dopóki jesteś konsekwentny, jesteś tak dokładny, jak tylko możesz. Czy sprawdziłeś z firebugem lub innymi takimi w obliczonym stylu, aby zobaczyć, jak to się skończy? – jswolf19

Odpowiedz

1

Chyba znalazłem rozwiązanie dla Firefoksa anyways, że może chcesz kontynuacją:

Przeglądając kod źródłowy znalazłem plik:

nsCSSParser.CPP

Dla każdego rgb procenty wykonuje następujące zadania:

  1. trwa Procentową mnoży się przez 255.0f
  2. zapisuje go w obrocie
  3. przekazuje go do funkcji NSToIntRound
  4. Wynik NSToIntRound jest przechowywany w 8-bitowym typie danych całkowitych, , zanim zostanie połączony z pozostałymi 2 komponentami i kanałem alfa

Szukasz bardziej szczegółowo na NSToIntRound:

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

NSToIntRound jest funkcją otoki dla NS_lroundf

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

Funkcja ta jest rzeczywiście bardzo mądry, zajęło mi trochę czasu, aby rozszyfrować (nie naprawdę mają dobre tło w C++).

Zakładając x jest dodatnia

Dodaje 0.5f do x, a następnie rzuca na liczbę całkowitą

Jeśli ułamkową częścią X był mniejszy niż 0,5, dodając 0,5 nie zmieni liczbę całkowitą i ułamkową część jest obcięta,

W przeciwnym razie wartość całkowita zostanie odrzucona o 1, a część ułamkowa zostanie obcięta.

  1. Więc procent każdy składnik jest pierwszy pomnożony przez 255.0f
  2. Następnie Zaokrąglone i wrzucony do Integer 32bit
  3. A potem Obsada ponownie w 8-bitowa liczba całkowita

zgadzam się z większością Ty, który twierdzisz, że to wydaje się być zależny od przeglądarki, więc zrobię dalsze badania w innych przeglądarkach.

Wielkie dzięki!

Powiązane problemy