EN

Введение. Секретный метод интерполяции градиентов

Также доступно на английском

Введение

Этой статьёй я открываю серию статей “Photoshop Algorithms Arcana”, призванную раскрыть алгоритмы Photoshop для рендеринга градиентов, эффектов, adjustment layers и т.д.

Зачем? Я работаю над инструментом, который позволяет, не имея Photoshop, рендерить отдельные слои/группы PSD/PSB, с сохранением всех эффектов. И так оказалось, что информации о проприетарных алгоритмах Photoshop — невероятно мало, и в большинстве своём они являются очень далёким приближением, результаты которого разительно отличаются от того, что рендерит фотошоп.

Кроме того, я надеюсь, что сделанные мною открытия помогут улучшить открытые инструменты, такие как Krita, GIMP, Photopea и другие, позволяя им взглянуть на пайплайн эффектов с другого угла и поддержать полноценно пайплайн photoshop особенно в области рендеринга эффектов и градиентов.

Disclaimer

Все алгоритмы, приведённые в этой статье — следствие black-box reverse engineering. Что означает, что все полученные алгоритмы в результате исследования — построены на попытках воспроизвести изображения, идентичные тем, что выдаёт Photoshop. Я не декомпилировал код Photoshop или других инструментов, всё что я имел на руках — готовые изображения, которые я рендерил в Photoshop и пытался их воспроизвести независимо.

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

С этим разобрались. Теперь перейдём к тому, с чего началось исследование.

Секретный метод интерполяции

Пока я работал над разбором формата и алгоритмов Photoshop, наткнулся на удивительную вещь — в версии 2026 методом интерполяции по умолчанию является не Perceptual, который занимал эту роль начиная с версии 2022, а некий Smooth.

Почему «некий»? Потому что он нигде не описан: ни в официальной документации (там упоминаются только Perceptual, Classic и Linear), ни на форумах, ни в туториалах. О его существовании можно узнать лишь по пункту в выпадающем меню. При этом он существенно отличается от всех остальных алгоритмов интерполяции, хотя ближе всего к Perceptual.

У Smooth отсутствует параметр Smoothness, и можно было бы предположить, что это просто частный случай Perceptual со Smoothness, выставленным на 100%, 75% или 50%.

Но оказывается, что нет — это отдельный вид интерполяции. Если сравнить два градиента с одинаковыми color-stops, один с методом Perceptual, а другой со Smooth, то ни одно из значений Smoothness не воспроизводит результат Smooth.

Если присмотреться, то можно увидеть, что в Perceptual синий глубже проникает в середину, а Smooth, оправдывая своё название, делает переходы мягче.

Для человеческого глаза они почти неотличимы при равномерных параметрах, когда midpoint находится в середине градиента. Однако чем ближе мидпоинт к границам, тем заметнее становится разница.

Давайте посмотрим на примеры, демонстрирующие явную разницу:

Red -> Blue, Midpoint: 5%
Smooth interpolation
Perceptual interpolation
Perceptual Smooth Difference between Perceptual and Smooth
Red -> Blue, Midpoint: 95%
Smooth interpolation
Perceptual interpolation
Perceptual Smooth Difference between Perceptual and Smooth
Red -> Green -> Blue, R -> G Midpoint: 15%, G -> B Midpoint: 85%
Smooth interpolation
Perceptual interpolation
Perceptual Smooth Difference between Perceptual and Smooth

Что Diff говорит нам об алгоритме

Включите Diff-режим для градиентов с двумя цветами (Red → Blue) — результат очень показателен.

Стартовые позиции цвета и мидпоинт идентичны (выражены чёрным цветом), а вот промежутки между ними создают ощутимую разницу.

И эта разница принимает интересную форму: она набирает интенсивность в центре сегментов start → midpoint и midpoint → end, а затем сходит на нет к границам. Это наводит на мысли о сглаживающей per-segment S-curve.

Однако стоит переключить Diff на трёхцветный градиент (Red → Green → Blue) — и картина сильно усложняется. Разница уже не укладывается в простую посегментную кривую. Градиенты с несколькими цветовыми остановами имеют либо другой механизм, либо адаптированный, с которым нужно разбираться отдельно.

Что дальше

Разобраться в Smooth — конечная цель. Но перед этим мы обязаны понять Classic, Linear и Perceptual — три метода интерполяции, которые дадут нам базу.

Именно этим мы и займёмся в следующих статьях: как Photoshop рисует Classic, Linear и Perceptual градиенты.