Я использую libvips для преобразования изображений на сервере с предварительным просмотром css / svg на интерфейсе для экономии ресурсов.
Я борюсь с реализацией функции фильтра контраста css / svg.
Спецификация показывает контраст в виде линейного преобразования в виде:
out = slope * in + intercept
, где intercept
должно быть:
intercept = - (0.5 * slope) + 0.5
Таким образом, я могу использовать contrast(1.25)
для предварительного просмотра модификаций изображений css.
Однако, реализация этой линейной функции в libvips через JS Library Sharp:
sharp.linear(contrast, - (0.5 * contrast) + 0.5)
Если посмотреть глубже на контрастность изображения, ожидаемый результат состоит в том, что максимумы ставятся еще выше, а минимумы - еще ниже. Это похоже на противоречие со спецификацией, потому что спецификация применяет линейное преобразование, поэтому она всегда должна быть кратной и складываемой, повышая максимумы, но немного увеличивая минимумы.
Используя linear in sharp (и, следовательно, в libvips) для изменения контраста, вывод фактически выглядит как фильтр яркости, который в фильтре css / svg находится в форме линейного преобразования без добавления
out = slope * in
Мне кажется, что я неправильно понимаю, что делает перехват в линейной функции SVG. Кроме того, сравнение SVG и CSS показывает различия. Использование contrast(2)
в css должно имитировать slope = 2
и intercept = -(0.5 * 2) + 0.5 = -0.5
в svg, что не так в этой скрипке:
Хорошо видно, что второе изображение с svg-фильтром выглядит иначе, чем третье с использованием css-фильтра.
Мое понимание фильтров совершенно неверно? Я ожидаю, что должен быть какой-то порог, чтобы инвертировать умножение в деление для минимумов.
Как я могу реализовать контраст CSS в разных средах как линейную функцию с одинаковым результатом?