Как десятичные значения цвета SVG (от 0 до 1) преобразуются в значения цвета (от 0 до 255)?

Следующий код ясно демонстрирует, что десятичные значения цвета (0,1) не переводятся линейно в дискретные значения (0,255). Если бы они были, 0,5 означало бы примерно 128, но это не так. Вместо этого он переводится примерно в 187.

<svg height = "100%" width = "100%" viewbox = "0 0 100 100">
  <defs>
    <filter id = "coltrans">
      <feComponentTransfer in = "SourceGraphic">
        <feFuncG type = "discrete" tableValues = "0 1"/>
        <feFuncB type = "discrete" tableValues = "0 1"/>
      </feComponentTransfer>
    </filter>
  </defs>
  <lineargradient id = "0to1gradient">
    <stop offest = "0" stop-color = "rgb(255, 255, 255)"/>
    <stop offset = "1" stop-color = "rgb(255,0,0)"/>
  </lineargradient>
  <rect filter = "url(#coltrans)" x = "0" y = "0" width = "100" height = "50" fill = "url(#0to1gradient)" stroke = "blue"/>
  <rect x = "0" y = "50" width = "100" height = "50" fill = "url(#0to1gradient)" stroke = "blue"/>
</svg>

В нижнем прямоугольнике цвет линейно изменяется от белого к красному. Верхний прямоугольник имеет такой же переход цвета, только он отфильтрован, так что значения зеленого и синего десятичных цветов округляются вверх или вниз до ближайшего запятого (0 или 1).

developer.mozilla.org/en-US/docs/Web/SVG/Attribute/…
Robert Longson 15.12.2020 00:20
Создание фильтров для вашего сайта
Создание фильтров для вашего сайта
Фильтры - удобный инструмент в арсенале веб-дизайнера. Они позволяют изменять элементы на странице с помощью всего нескольких строк кода. Эти...
Анимация SVG-узоров без единой строки CSS
Анимация SVG-узоров без единой строки CSS
Недавно я работал над веб-проектом, который позволил мне поэкспериментировать с шаблонами SVG. С SVG очень приятно работать, как только вы получите...
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
0
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Большинство операций с цветом в SVG выполняются в цветовом пространстве sRGB. Но из соображений визуального качества операции фильтрации (по умолчанию) выполняются в цветовом пространстве linearRGB. Любые входные изображения преобразуются в линейное RGB, применяются примитивы фильтра, а затем выходные данные фильтра преобразуются обратно в sRGB.

Для получения более подробной информации прочитайте статью Википедии о sRGB или спецификацию SVG.

Но в основном это сводится к тому, что sRGB — это гамма-корректированная версия RGB. Первоначально это было сделано для того, чтобы компенсировать отклик старых ЭЛТ-мониторов. Чтобы отобразить пиксель примерно с половинной яркостью, нужно было отправить на экран 187 вместо 128.

Общий гамма-фактор составляет примерно 2,2.

Таким образом, чтобы (примерно) преобразовать из linearRGB в sRGB, возведите входное значение в степень (1/2,2)

0.5 ^ (1/2.2) = 0.7297

0.7297 * 256 ~= 187

Другие вопросы по теме