Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 411 · После объектов и первых изображений Gmagick

Gmagick: яркость, гамма и предсказуемый контраст

Сравнить изменения тонов на собственном градиенте; увидеть и ограничить различия конкретной версии levelImage.

Осветлить карточку: яркость и гамма

Карточка товара выглядит тусклой. Сначала изменим одну настройку и сравним с исходником, затем попробуем другой способ осветления. На собственном градиенте фон идёт от 75 до 185 из 255; цветные плашки помогают заметить, меняются ли оттенки. Все картинки ниже — целые настоящие PNG320×200.

До: собственный малоконтрастный градиент и три цветные плашки
До: собственный малоконтрастный градиент и три цветные плашки
После modulateImage(115,100,100): изменена только настройка яркости
После modulateImage(115,100,100): изменена только настройка яркости
После gammaImage(1.4): средние тона осветлены другим преобразованием
После gammaImage(1.4): средние тона осветлены другим преобразованием
$image = new Gmagick(__DIR__ . "/tone.ppm");
$image->modulateImage(115, 100, 100);
$image->setImageDepth(8);
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/lighter.png");

Переменная $image хранит объект с изображением; -> вызывает его метод. Три числа modulateImage задают яркость, насыщенность и оттенок. Нейтральное значение каждого —100. Здесь 115 означает настройку яркости 115%, а 100 сохраняет остальные настройки. Это не прибавление 115 к каждому RGB-компоненту. setImageDepth(8) выбирает 8-битный результат, setImageFormat задаёт кодер, writeImage сохраняет файл. В полной программе clone создаёт независимые копии для сравнения.

Осветлить карточку: яркость и гаммаСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$neutral=clone $source;
$neutral->modulateImage(100,100,100);
$light=clone $source;
$light->modulateImage(115,100,100);
$gamma=clone $source;
$gamma->gammaImage(1.4);
gm97Png($source,'gm97-color-light-before.png');
gm97Png($light,'gm97-color-light-modulate.png');
gm97Png($gamma,'gm97-color-light-gamma.png');
$errors=['gamma_type'=>gmTry(fn()=>(new Gmagick(__DIR__.'/tone.ppm'))->gammaImage([]))];

gmReport('gm97-color-light',["modulateimage", "gammaimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-color-light-before.png", "gm97-color-light-modulate.png", "gm97-color-light-gamma.png"],
    ['neutral_100'=>$neutral->getImageSignature()===$source->getImageSignature(),'brightness_changes'=>$light->getImageSignature()!==$source->getImageSignature(),'gamma_differs'=>$gamma->getImageSignature()!==$light->getImageSignature()],
    $errors ?? [], []);
echo "light: neutral100=yes brightness-and-gamma=different png=3 size=320x200\n";
Ожидаемый результат
light: neutral100=yes brightness-and-gamma=different png=3 size=320x200

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Gamma — нелинейная коррекция тонов: gammaImage(1.4) в этой среде осветляет средние значения иначе, чем modulateImage. Единица нейтральна. У типичных фотографических настроек PHP.net приводит диапазон 0.8–2.3; это ориентир, а не обязательный предел PHP. Значение должно иметь смысл для выбранного изображения. Гамма не является калибровкой монитора или заменой работы с цветовым профилем. Упражнение: ослабить насыщенность, не меняя две другие настройки. Решение: modulateImage(100,80,100). Передача массива вместо числа отдельно ловится как TypeError.

Если это первый опыт с Gmagick, начните с чтения собственного изображения и проверенного сохранения. Здесь используются переменные, объекты и исключения. Сравнение вариантов основано на настоящих файлах; белый результат ошибки уровней показан как ошибка, не как художественная схема.

Далее: подавление шума; перед выпуском — глубина, метаданные и подписи файлов.

Задать точки чёрного и белого, проверить порядок

Нужно усилить контраст предсказуемо: выбрать, что считать чёрным и белым. Модель проста: исходные уровни 60 и 200 должны стать границами выходного диапазона, промежуточные — распределиться между ними. Значения ниже нижней точки и выше верхней обрезаются. Но сначала необходимо увидеть различие документации и проверенной библиотеки.

До: диапазон серого фона от 75 до 185 из 255
До: диапазон серого фона от 75 до 185 из 255
GraphicsMagick 1.3.42: документированный порядок дал полностью белый результат
GraphicsMagick 1.3.42: документированный порядок дал полностью белый результат
После адаптера для 1.3.42: точки 60 и 200 растянуты на полный диапазон
После адаптера для 1.3.42: точки 60 и 200 растянуты на полный диапазон
После normalizeImage(): границы выбрала библиотека
После normalizeImage(): границы выбрала библиотека
$image = new Gmagick(__DIR__ . "/tone.ppm");
$black = 60 * 257;
$white = 200 * 257;
$image->levelImage($black, 1.0, $white);
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/documented-order.png");

Это официальный порядок: blackPoint, gamma, whitePoint, затем необязательный канал. В Q16 максимальное значение 65535; поэтому 8-битные 60 и 200 умножаются на 257. Гамма 1.0 должна оставить линейное растяжение. На GraphicsMagick 1.3.42 этот конкретный вызов реально дал белый PNG. В исходниках Wand параметры gamma и white переставлены перед Core. Мы сохраняем этот результат рядом с исправленным, чтобы ошибку библиотеки нельзя было принять за обычное действие уровней.

Задать точки чёрного и белого, проверить порядокСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$documented=clone $source;
gm97KnownLevelRuntime();
$documented->levelImage(60*257,1.0,200*257);
$leveled=clone $source;
gm97Levels($leveled,60*257,1.0,200*257);
$normal=clone $source;
$normal->normalizeImage();
gm97Png($source,'gm97-color-levels-before.png');
gm97Png($documented,'gm97-color-levels-documented.png');
gm97Png($leveled,'gm97-color-levels-adapted.png');
gm97Png($normal,'gm97-color-levels-auto.png');
$errors=['normalize_channel'=>gmTry(fn()=>(new Gmagick(__DIR__.'/tone.ppm'))->normalizeImage(Gmagick::CHANNEL_RED))];

gmReport('gm97-color-levels',["levelimage", "normalizeimage", "getimagedepth", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-color-levels-before.png", "gm97-color-levels-documented.png", "gm97-color-levels-adapted.png", "gm97-color-levels-auto.png"],
    ['known_runtime_threshold'=>$documented->getImageDepth()===1,'adapted_has_tones'=>$leveled->getImageDepth()>1,'adapted_differs'=>$leveled->getImageSignature()!==$documented->getImageSignature(),'normal_changes'=>$normal->getImageSignature()!==$source->getImageSignature()],
    $errors ?? [], []);
echo "levels: documented=white adapted=tones normalize=changed png=4\n";
Ожидаемый результат
levels: documented=white adapted=tones normalize=changed png=4

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Полный пример использует gm97Levels: он допускает только Gmagick 2.0.6RC1/GraphicsMagick 1.3.42 Q16, проверяет 0≤black<white и gamma>0, затем передаёт аргументы в порядке, исправляющем подтверждённую перестановку. В другой версии помощник останавливается. При переходе на исправленную реализацию сначала сравните результат контрольного входа, затем используйте обычный levelImage($black,$gamma,$white); не переносите перестановку вслепую. normalizeImage выбирает растяжение автоматически, поэтому его результат иной. В нашем runtime normalizeImage не принимает канал: дополнительный аргумент дал ArgumentCountError. Упражнение: восстановит ли растяжение уже потерянные светлые детали? Решение: нет, обрезанные значения нельзя восстановить из одной итоговой белой области.

Адаптер только для подтверждённой GraphicsMagick 1.3.42 Q16
function gm97KnownLevelRuntime():void {
    $version=Gmagick::getVersion()['versionString'];
    if(phpversion('gmagick')!=='2.0.6RC1'||!str_starts_with($version,'GraphicsMagick 1.3.42 ')||Gmagick::QUANTUM_DEPTH!==16) {
        throw new LogicException('Recheck levelImage argument order in this runtime before using the 1.3.42 adapter');
    }
}
function gm97Levels(Gmagick $image,float $black,float $gamma,float $white,int $channel=Gmagick::CHANNEL_ALL):void {
    gm97KnownLevelRuntime();
    if(!is_finite($black)||!is_finite($gamma)||!is_finite($white)||$black<0||$white<=$black||$gamma<=0) {
        throw new InvalidArgumentException('Require finite 0 <= black < white and gamma > 0');
    }
    // GraphicsMagick 1.3.42 Wand swaps gamma and white on its way to Core.
    // Only this explicitly checked runtime uses the reversed PHP arguments.
    $image->levelImage($black,$white,$gamma,$channel);
}

Далее: подавление шума; перед выпуском — глубина, метаданные и подписи файлов.

Сравнить растяжение диапазона и выравнивание гистограммы

Автоматическое улучшение бывает разным. Для каталога сравним две операции на одной копии входа: расширение диапазона и перераспределение значений по частоте. Гистограмма — это подсчёт, сколько пикселей относится к каждому уровню. Она не знает, какой цвет у товара должен быть в действительности.

До: много пикселей приходится на узкий диапазон
До: много пикселей приходится на узкий диапазон
normalizeImage: автоматическое усиление контраста
normalizeImage: автоматическое усиление контраста
equalizeImage: перераспределение по гистограмме, другой вид плашек
equalizeImage: перераспределение по гистограмме, другой вид плашек
$source = new Gmagick(__DIR__ . "/tone.ppm");
$normal = clone $source;
$normal->normalizeImage();
$equal = clone $source;
$equal->equalizeImage();
$equal->setImageFormat("PNG");
$equal->writeImage(__DIR__ . "/equalized.png");

normalizeImage усиливает контраст, растягивая используемые значения. equalizeImage выравнивает гистограмму: широко представленные и редкие уровни перераспределяются иначе. Оба метода меняют объект, не возвращают отдельный файл. clone отделяет варианты; исходный объект остаётся для сравнения. Скобки без аргументов означают, что собственных числовых настроек этим вызовам здесь не передаём.

Сравнить растяжение диапазона и выравнивание гистограммыСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$normal=clone $source;
$normal->normalizeImage();
$equal=clone $source;
$equal->equalizeImage();
gm97Png($source,'gm97-color-histogram-before.png');
gm97Png($normal,'gm97-color-histogram-normal.png');
gm97Png($equal,'gm97-color-histogram-equal.png');

gmReport('gm97-color-histogram',["normalizeimage", "equalizeimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-color-histogram-before.png", "gm97-color-histogram-normal.png", "gm97-color-histogram-equal.png"],
    ['normalize_changed'=>$normal->getImageSignature()!==$source->getImageSignature(),'equalize_changed'=>$equal->getImageSignature()!==$source->getImageSignature(),'different_algorithms'=>$normal->getImageSignature()!==$equal->getImageSignature()],
    $errors ?? [], []);
echo "histogram: normalize-and-equalize=different png=3 size=320x200\n";
Ожидаемый результат
histogram: normalize-and-equalize=different png=3 size=320x200

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Ожидаются три PNG320×200; подписи пикселей двух обработанных вариантов различны. Смотрите на фон и цвет плашек: «контрастнее» не означает «точнее передаёт цвет товара». Автоматическая коррекция может выделить шум и изменить цветовые отношения. Упражнение: какой метод выбрать для точного порога 60–200? Решение: levelImage с проверенным контрактом, потому что normalize/equalize не получают эти две границы. Для серии товаров сначала сравните несколько характерных входов, а не утверждайте универсальность одного пресета.

Далее: подавление шума; перед выпуском — глубина, метаданные и подписи файлов.

Собрать умеренную коррекцию для каталога

Соберём небольшой рабочий маршрут для тусклой карточки: осторожно расширим диапазон, затем немного ослабим насыщенность. Промежуточная картинка делает каждый шаг наблюдаемым. Здесь не пытаемся угадать правильный цвет товара: исходник остаётся рядом с результатом для осознанного выбора.

До: малоконтрастная карточка
До: малоконтрастная карточка
Шаг 1: умеренный диапазон 40–220 через адаптер 1.3.42
Шаг 1: умеренный диапазон 40–220 через адаптер 1.3.42
Шаг 2: яркость 105%, насыщенность 85%, оттенок 100%
Шаг 2: яркость 105%, насыщенность 85%, оттенок 100%
$source = new Gmagick(__DIR__ . "/tone.ppm");
$result = clone $source;
gm97Levels($result, 40 * 257, 1.0, 220 * 257);
$result->modulateImage(105, 85, 100);
$result->setImageFormat("PNG");
$result->writeImage(__DIR__ . "/catalog-tone.png");

gm97Levels — наша функция из предыдущего шага, а не метод расширения. Она ограничена проверенной версией 1.3.42. Числа 40 и 220 дают менее сильное растяжение, чем 60 и 200. Затем modulateImage получает яркость 105, насыщенность 85 и нейтральный оттенок 100. Полная программа сохраняет исходник, результат первого шага и окончательный PNG, поэтому видно вклад обоих действий.

Собрать умеренную коррекцию для каталогаСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$result=clone $source;
gm97Levels($result,40*257,1.0,220*257);
$levels=clone $result;
$result->modulateImage(105,85,100);
gm97Png($source,'gm97-color-preset-before.png');
gm97Png($levels,'gm97-color-preset-levels.png');
gm97Png($result,'gm97-color-preset-final.png');
$errors=['invalid_levels'=>gmTry(fn()=>gm97Levels(clone $source,200,1,100))];

gmReport('gm97-color-preset',["levelimage", "modulateimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-color-preset-before.png", "gm97-color-preset-levels.png", "gm97-color-preset-final.png"],
    ['levels_changed'=>$levels->getImageSignature()!==$source->getImageSignature(),'second_step_changed'=>$result->getImageSignature()!==$levels->getImageSignature(),'source_unchanged_object'=>$source->getImageSignature()===(new Gmagick(__DIR__."/tone.ppm"))->getImageSignature()],
    $errors ?? [], []);
echo "preset: levels40-220 then brightness105 saturation85 hue100 png=3\n";
Ожидаемый результат
preset: levels40-220 then brightness105 saturation85 hue100 png=3

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Ожидаются три разных состояния 320×200, исходный файл не изменяется. Переставленные точки 200 и 100 отвергает наша функция с InvalidArgumentException: это собственное правило, не обещание одинаковой проверки внутри каждой версии Gmagick. Упражнение: сохранить силу насыщенности, но оставить это осветление. Решение: заменить 85 на 100. Если каталогу нужна достоверная цветопередача, этот учебный пресет надо согласовать по эталонным изображениям и цветовому процессу.

Далее: подавление шума; перед выпуском — глубина, метаданные и подписи файлов.

Проверить порядок гаммы и выравнивания

Два хороших действия не обязательно взаимозаменяемы по порядку. Перед массовой обработкой проверим маршруты «гамма → гистограмма» и «гистограмма → гамма». У каждого маршрута независимый объект, а исходник один и тот же.

До: один и тот же вход для двух маршрутов
До: один и тот же вход для двух маршрутов
Маршрут A: сначала gamma 1.4, затем equalize
Маршрут A: сначала gamma 1.4, затем equalize
Маршрут B: сначала equalize, затем gamma 1.4
Маршрут B: сначала equalize, затем gamma 1.4
$source = new Gmagick(__DIR__ . "/tone.ppm");
$first = clone $source;
$first->gammaImage(1.4);
$first->equalizeImage();
$second = clone $source;
$second->equalizeImage();
$second->gammaImage(1.4);

Каждая строка действует на текущее состояние объекта. Во втором вызове входом служит уже изменённое изображение. Полная программа сохраняет оба результата отдельно, а getImageSignature сравнивает их пиксельные потоки. Эта строковая подпись понадобится в главе о проверке экспорта; она удобна для проверки равенства, но не оценивает красоту.

Проверить порядок гаммы и выравниванияСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$first=clone $source;
$first->gammaImage(1.4);
$first->equalizeImage();
$second=clone $source;
$second->equalizeImage();
$second->gammaImage(1.4);
gm97Png($source,'gm97-color-order-before.png');
gm97Png($first,'gm97-color-order-gamma-equal.png');
gm97Png($second,'gm97-color-order-equal-gamma.png');

gmReport('gm97-color-order',["gammaimage", "equalizeimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-color-order-before.png", "gm97-color-order-gamma-equal.png", "gm97-color-order-equal-gamma.png"],
    ['order_matters'=>$first->getImageSignature()!==$second->getImageSignature(),'first_changed'=>$first->getImageSignature()!==$source->getImageSignature(),'second_changed'=>$second->getImageSignature()!==$source->getImageSignature()],
    $errors ?? [], []);
echo "order: gamma-then-equalize differs-from equalize-then-gamma png=3\n";
Ожидаемый результат
order: gamma-then-equalize differs-from equalize-then-gamma png=3

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

На нашем входе подписи различаются: операции не переставляются без изменения результата. Упражнение: зачем clone, если переменная называется иначе? Решение: обычное присваивание объекта не создаёт независимый растр; обе переменные могут обращаться к одному объекту. Для рабочего каталога фиксируйте порядок обработки вместе со значениями настроек и сохраняйте исходник. Следующий шаг — убрать шум до финального кодирования, чтобы JPEG не закрепил его артефакты.

Далее: подавление шума; перед выпуском — глубина, метаданные и подписи файлов.

Из реального вопроса разработчика

How to change brightness using Imagick?. Автор вопроса об Imagick хочет изменить яркость, сохранив насыщенность и оттенок, и не знает нейтральных значений. Проблема применима к выбору настроек, но API другого расширения не переносим автоматически. Наш Gmagick-пример отдельно проверяет нейтральный набор100,100,100, сохраняет самостоятельные варианты яркости и гаммы и показывает разницу.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

Gmagick::equalizeimageВыровнять распределение гистограммы

PECL gmagick >= Unknown · gmagick

Gmagick::equalizeimage(): Gmagick
Gmagick::equalizeimage(): Gmagick

Аргументов нет. Метод выравнивает гистограмму изображения и возвращает изменённый Gmagick. Гистограмма считает распределение пикселей по значениям; выравнивание не равно простому растяжению диапазона normalizeImage. На нашем входе результаты разные. Порядок относительно gammaImage также изменил итог. Это числовая коррекция без знания содержания, поэтому одинаковый автоматический вызов не гарантирует одинаковую достоверность цвета разных товаров.

Параметров нет: вызов записывается с пустыми скобками.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Сравнить растяжение диапазона и выравнивание гистограммы; Проверить порядок гаммы и выравнивания.

Gmagick::gammaimageИзменить распределение тонов гаммой

PECL gmagick >= Unknown · gmagick

Gmagick::gammaimage(float $gamma): Gmagick
Gmagick::gammaimage(float $gamma): Gmagick

Единственный обязательный float gamma задаёт гамма-коррекцию. Нейтральное значение 1; на нашем входе 1.4 осветляет средние тона. PHP.net приводит типичные 0.8–2.3 и объясняет различия восприятия интенсивности на устройствах. Это ориентир, не диапазон валидации. Описание упоминает отдельные RGB-каналы, но текущий PHP-метод принимает только одно число, а C вызывает MagickGammaImage для изображения. Не добавляйте несуществующий аргумент канала. Это изменение пикселей, не замена управления профилями. Результат — Gmagick; неверный тип массива дал TypeError.

ПараметрКонтракт PHP.netНазначение
$gammafloat; обязательныйГамма-коррекция; нейтрально 1.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Осветлить карточку: яркость и гамма; Проверить порядок гаммы и выравнивания.

Gmagick::levelimageРастянуть диапазон между выбранными точками

PECL gmagick >= Unknown · gmagick

Gmagick::levelimage(float $blackPoint, float $gamma, float $whitePoint, int $channel = Gmagick::CHANNEL_DEFAULT): mixed
Gmagick::levelimage(float $blackPoint, float $gamma, float $whitePoint, int $channel = Gmagick::CHANNEL_DEFAULT): mixed

Официальный порядок: blackPoint, gamma, whitePoint, необязательный channel=CHANNEL_DEFAULT. Значения ниже чёрной точки становятся 0, выше белой — максимальным quantum; середину регулирует gamma. В Q16 точки задаются в 0…65535. Официальная сигнатура mixed, текст возвращаемого значения обещает Gmagick, фактически возвращён тот же объект. GraphicsMagick 1.3.42 переставляет gamma/white на пути Wand→Core: это отдельно показано реальным белым PNG и исправленным результатом. gm97Levels применяет перестановку только при точной проверке Gmagick 2.0.6RC1 / GM 1.3.42 / Q16 и отвергает другой runtime. После обновления нужен контрольный пример и обычный документированный порядок. PHP.net предлагает объединять каналы битовыми операциями, однако эта GM-реализация использует перечисление и switch, а не маску: RED=1, GREEN=3, их OR равно 3. Выбирайте один известный канал или CHANNEL_ALL; произвольное OR здесь не означает несколько каналов.

ПараметрКонтракт PHP.netНазначение
$blackPointfloat; обязательныйЧёрная точка в quantum-единицах.
$gammafloat; обязательныйГамма-коррекция; нейтрально 1.
$whitePointfloat; обязательныйБелая точка в quantum-единицах.
$channelint; необязательный; default Gmagick::CHANNEL_DEFAULTОфициальный параметр канала; поддержку и ограничения см. в пояснении.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Задать точки чёрного и белого, проверить порядок; Собрать умеренную коррекцию для каталога.

Gmagick::modulateimageУправлять яркостью, насыщенностью и оттенком

PECL gmagick >= Unknown · gmagick

Gmagick::modulateimage(float $brightness, float $saturation, float $hue): Gmagick
Gmagick::modulateimage(float $brightness, float $saturation, float $hue): Gmagick

Три обязательных float: brightness, saturation, hue. Нейтральный набор 100,100,100 фактически не изменил пиксели. Brightness 115 задаёт 115% настройки яркости, saturation 85 ослабляет насыщенность. Для hue 100 нейтрально; 50 соответствует повороту −90°, 150 — +90°, 0 и 200 — 180°. В таблице параметров PHP.net написано «−100…+100 percent change», но это не основание подавать 0 для сохранения цвета: текущая реализация использует нейтральные 100 и абсолютные величины. Возвращается тот же Gmagick; состояние изображения изменяется.

ПараметрКонтракт PHP.netНазначение
$brightnessfloat; обязательныйНастройка яркости; нейтрально 100.
$saturationfloat; обязательныйНасыщенность; нейтрально 100.
$huefloat; обязательныйПроцент поворота оттенка; нейтрально 100.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Осветлить карточку: яркость и гамма; Собрать умеренную коррекцию для каталога.

Gmagick::normalizeimageАвтоматически усилить контраст

PECL gmagick >= Unknown · gmagick

Gmagick::normalizeimage(int $channel = ?): Gmagick
Gmagick::normalizeimage(int $channel = ?): Gmagick

Операция расширяет используемые значения изображения на доступный диапазон. На PHP.net указан необязательный int channel с неопределённым default. Текущий upstream C и Reflection Gmagick 2.0.6RC1 показывают метод без аргументов; реальная передача CHANNEL_RED дала ArgumentCountError. Для проверенной среды вызывайте normalizeImage(). Результат — тот же Gmagick. Автоматическое усиление контраста не знает эталонный цвет товара и может выделить шум; не путайте с явным заданием black/white через levelImage.

ПараметрКонтракт PHP.netНазначение
$channelint; необязательныйОфициальный параметр канала; поддержку и ограничения см. в пояснении.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Задать точки чёрного и белого, проверить порядок; Сравнить растяжение диапазона и выравнивание гистограммы.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.