Хотя в документации указано от -255 до +255, это не так! Это предполагается от -100 до +100. Но есть более глубокая проблема:
PHP не ограничивает число до 100. Он напрямую передается в базовый lib-gd с независимо от того, какое число вы укажете. lib-gd также не ограничивает диапазон до 100, поэтому любое число, которое вы используете, напрямую влияет на пиксели.
В lib-gd для вычисления контрастности используется следующая формула:
(100.0-contrast)/100.0
Вы можете сами убедиться в этом здесь: https://bitbucket.org/libgd/gd-libgd/src/cdea9eb0ad01/src/gd_filter.c
Эта формула должна превратить запрошенный в PHP контраст (между 0 и 100) в число от 0 до 1.
Проблема в том, что диапазон никогда не проверяется, это имеет странный математический эффект для чисел вне диапазона.
Если вы введете 90 в PHP, lib-GD преобразует это в 0,9 и применяет алгоритм контраста, используя это число. Имеет смысл. ОДНАКО , если вы введете 2000, lib-gd теперь использует -19 в своем алгоритме контрастности, который сильно отличается.
Во-первых, вы заметите, что любое значение выше 100 или ниже -100 имеет такой же эффект из , увеличивающий контрастность из-за математики.
Для достижения «абсолютного» эффекта контраста, то есть перемещения всех пикселей изображения на 0 или 255, 25600 - это желаемое число. Пиксель со значением 127 станет 0, а пиксель со значением 128 станет 255.
Это может быть полезно, если вы хотите сделать изображение полностью ровным (особенно если сначала вы примените фильтр в оттенках серого, вы получите черно-белое изображение).
Я бы не стал полагаться на это, потому что PHP или lib-gd могут начать ограничивать диапазон в новых выпусках.
Итак, в действительности:
- Диапазон
IMG_FILTER_CONTRAST
составляет от -25600 до + 25600
- Числа сверху и снизу не будут отклоняться, но не могут влиять на пиксели в дальнейшем.
- Числа ниже -100 снова становятся положительными, т.е. -100 === + 100
- По мере того как числа исчисляются тысячами, визуальные различия незначительны, поскольку пиксели очень экспоненциально близки к своему максимуму.