Как браузеры обрабатывают rgb (процент);для странных чисел - PullRequest
7 голосов
/ 13 октября 2011

Это связано с цветовыми кодами CSS:

Для шестнадцатеричного кода мы можем представить 16 777 216 цветов от # 000000 до # FFFFFF

В соответствии со спецификациями W3C, действительные проценты RGB соответствуют диапазону от (От 0,0% до 100,0%), что дает вам 1 003 003 001 цветовых комбинаций.(1001 ^ 3)

В соответствии со спецификациями:

Значения за пределами гаммы устройства должны быть обрезаны или отображены в гамме, когда гамма известна: красная, зеленая исиние значения должны быть изменены, чтобы попасть в диапазон, поддерживаемый устройством.Пользовательские агенты могут выполнять более качественное отображение цветов из одной гаммы в другую.Для типичного монитора с ЭЛТ, чья гамма устройств такая же, как у sRGB, четыре приведенных ниже правила эквивалентны:

Я сомневаюсь, действительно ли браузеры могут отображать все эти значения.(но если они это сделают, пожалуйста, сообщите мне и проигнорируйте оставшуюся часть этого поста)

Я предполагаю, что есть некоторое сопоставление от rgb (процент) до гекса.(но опять же, я не совсем уверен, как это работает)

В идеале я хотел бы выяснить функцию rgb (процентное соотношение) -> HEX

Если бы мне пришлось угадывать, вероятно, это было бы одноиз них 3.

1) Округлить до ближайшего HEX

2) CEIL до ближайшего HEX

3) ПОЛ до ближайшего HEX

ПроблемаМне нужно быть точным в отображении, и я понятия не имею, где искать.Мои глаза не могут различить цвет на этом уровне, но, возможно, есть какой-то умный способ проверить каждый из этих 3.

Это также может зависеть от браузера.Можно ли это проверить?

РЕДАКТИРОВАТЬ:

Firefox seems to round from empirical testing.

РЕДАКТИРОВАТЬ:

Я просматриваю исходный код Firefoxпрямо сейчас,

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

Кажется, в Fiefox есть место только для 255 значений для каждого R, G и B. Подсказка, что округление может быть ответом, но, возможно, кое-что делается с альфа-каналом.

1 Ответ

1 голос
/ 14 октября 2011

Я думаю, что в любом случае нашел решение для Firefox, подумал, что вам может понравиться продолжение:

Просматривая исходный код, я нашел файл:

nsCSSParser.cpp

Для каждого процента rgb он делает следующее:

  1. Требуется, чтобы процентный компонент умножил его на 255.0f
  2. Сохраняет его в формате с плавающей запятой
  3. Передает его вфункция NSToIntRound
  4. Результат NSToIntRound сохраняется в 8-битном целочисленном типе данных, прежде чем он объединяется с двумя другими компонентами и альфа-каналом

Поиск дополнительных сведений о NSToIntRound:

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

NSToIntRound - это функция-обертка для NS_lroundf

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

Эта функция на самом деле очень умная, мне понадобилось время, чтобы расшифровать (у меня нет хорошего фона C ++).

Предполагая, что x положительный

Он добавляет 0.5f к x, а затем приводит к целому числу

Если дробная часть x была меньше 0.5, добавление 0.5 выигралне меняйте целое числои дробная часть усекается,

В противном случае целочисленное значение увеличивается на 1, а дробная часть усекается.

  1. Таким образом, процент каждого компонента сначала умножается на 255,0f
  2. Затем округлите и приведите к 32-битному целому числу
  3. И затем снова приведите к 8-битному целому числу

Я согласен с большинством из вас, кто говорит, что это зависит от браузераПроблема, поэтому я сделаю некоторые дальнейшие исследования в других браузерах.

Спасибо большое!

...