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

Дерево руководства
Глава 362 · После RGB/RGBA и композиции OVER
Imagick: сохранить прозрачность и подготовить фон карточки
Канал alpha, реальные прозрачные пиксели и выбранный фон на собственной PNG-наклейке.
Сохранить наклейку и сделать карточку на выбранном фоне
Для сайта нужна PNG-наклейка, которую можно положить на любой цвет. Для скачивания в памятку нужна другая версия — готовая карточка со своим светлым фоном. У кружки есть прозрачное отверстие ручки и полупрозрачный край; просто выключить прозрачность недостаточно: могут проявиться скрытые чёрные пиксели. Сохраним оригинал и подготовим отдельный RGB-файл.
Наш собственный исходник 400×320 уже содержит вырезанный силуэт коробки и кружки. Эти методы не распознают товар и не удаляют фон фотографии. Надписи MUG/SKU — часть рисунка, они не являются измерением alpha. Фон окна просмотра не входит в PNG: ниже исходный RGBA-файл может быть показан на белом, тёмном или шахматном поле интерфейса.


| Термин | Значение в этом примере |
|---|---|
| RGB / RGBA | Красная, зелёная и синяя компоненты; четвёртая A — alpha, определяющая смешивание с подложкой. |
| Alpha A | 0 — полностью прозрачно; 1 — непрозрачно. В сохранённом PNG по 8 бит на компоненту, A от 0 до 255; во внутренней Q16-шкале максимум Q=QuantumRange=65535. |
| Канал / пиксели | Канал может присутствовать, даже когда все A=1. Ответ getter true не является подсчётом прозрачных пикселей. |
| Background | Сохранённая настройка цвета. Setter не закрашивает растр; REMOVE использует настройку при смешивании. |
| C, Cd, Cвид и A | C — одна RGB-компонента наклейки, Cd — компонента непрозрачного фона, Cвид — видимый результат; Cвид=A×C+(1−A)×Cd. A в формуле 0..1; × и + — обычные умножение и сложение. |
| RGB PNG / RGBA PNG | Здесь 8 бит на компоненту: color-type 2 без alpha и color-type 6 с alpha. Это отдельно от наличия реально прозрачных пикселей и не индексированный PNG. |

Getter задаёт вопрос и возвращает bool: true/false. False для RGB — нормальный ответ, не ошибка. Два setter меняют текущий объект и возвращают статус true, который не является новой картинкой. Чтобы получить файл, отдельно вызываем writeImage. При сохранении непрозрачного результата в принудительном RGBA контейнер снова содержит канал: после чтения getter может стать true при всех A=1. Это ожидаемое различие состояния и содержимого.
Пусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
Строка #e6edf1 задаёт непрозрачные RGB 230/237/241 в обычной шестнадцатеричной записи цвета. Первый вызов только сохраняет настройку. Следующий REMOVE использует её для смешивания с активной alpha. Возвращённые true — статусы; ни один не возвращает новую картинку:
$image->setImageBackgroundColor('#e6edf1');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.
Перед полной программой: <?php открывает PHP; declare(strict_types=1) включает строгие типы; require подключает helper из той же папки, __DIR__ обозначает её путь. loadAlphaSource восстанавливает исходный PNG из Base64 и проверяет его контрольную сумму; это упаковка входа, не обработка alpha. Функции alphaPreview/saveAlphaNative/saveAlphaComparison имеют открытый код ниже: первая накладывает на непрозрачную подложку через OVER, следующие сохраняют отдельный PNG и сравнение. [] — массив панелей по порядку, запятые разделяют элементы. Строка "\n" означает перевод строки, echo выводит имена файлов. Связи: файлы, функции, массивы, композиция OVER.
Подготовить карточку со своим светлым фоном и сохранить исходную наклейку
Слева исходная наклейка поверх белого, в середине тот же прозрачный вход поверх тёмного, справа готовая непрозрачная card-light.png поверх тёмного. У готовой карточки светлый прямоугольник и фон внутри отверстия ручки уже записаны в RGB-пикселях.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$card = clone $source;
if (!$card->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Background failed'); }
if (!$card->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
saveAlphaNative($card, 'card-light.png', false);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($source, '#243c4d'), alphaPreview($card, '#243c4d')], 'first-alpha.png');
echo "first-alpha.png\ncard-light.png\n";
Слева исходная наклейка поверх белого, в середине тот же прозрачный вход поверх тёмного, справа готовая непрозрачная card-light.png поверх тёмного. У готовой карточки светлый прямоугольник и фон внутри отверстия ручки уже записаны в RGB-пикселях. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
first-alpha.png
card-light.png
Разделить состояние канала и прозрачность пикселей
Чтобы не спутать канал и прозрачные пиксели, сравним вход с двумя одинаковыми светлыми полями. new Imagick() создаёт пустой объект, newImage(400,320,цвет) — полный непрозрачный растр. clone копирует его, OPAQUE создаёт/заполняет alpha единицами. getImageAlphaChannel не принимает аргументов:
$hasAlpha = $source->getImageAlphaChannel();
$opaque->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);(int) переводит bool в число 0/1 для понятного stdout; точка . соединяет строки. Поэтому одинаковый вид двух полей не требует одинакового ответа getter.
Сравнить канал alpha и непрозрачность пикселей
Слева наклейка на белом; в середине созданное RGB-поле без alpha; справа то же поле после OPAQUE с активным alpha и всеми A=1. Последние две панели выглядят одинаково, но getter возвращает разные ответы.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$rgb = new Imagick();
$rgb->newImage(400, 320, '#e6edf1');
$opaque = clone $rgb;
if (!$opaque->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE)) { throw new RuntimeException('Opaque failed'); }
$sourceHas = $source->getImageAlphaChannel();
$rgbHas = $rgb->getImageAlphaChannel();
$opaqueHas = $opaque->getImageAlphaChannel();
saveAlphaComparison([alphaPreview($source, 'white'), $rgb, alphaPreview($opaque, 'white')], 'alpha-controls.png');
echo "alpha-controls.png\nsource=" . (int)$sourceHas . " rgb=" . (int)$rgbHas . " opaque-rgba=" . (int)$opaqueHas . "\n";
Слева наклейка на белом; в середине созданное RGB-поле без alpha; справа то же поле после OPAQUE с активным alpha и всеми A=1. Последние две панели выглядят одинаково, но getter возвращает разные ответы. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-controls.png
source=1 rgb=0 opaque-rgba=1

Сохранить alpha и проверить доставленный файл
Первый сценарий сохраняет существующую наклейку как RGBA, не трогая её пиксели. Второй нужен при приёмке готового файла: наличие канала не подтверждает прозрачность. Мы намеренно записываем непрозрачную карточку в RGBA и считаем значения A после чтения.
Пусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
$hasAlpha получает логический ответ, а не изображение. if выполняет ветку, когда ответ true; false здесь не нужно превращать в исключение. Проверка не подтверждает наличие хотя бы одного пикселя с alpha меньше 1:
$hasAlpha = $image->getImageAlphaChannel();
if ($hasAlpha) {
echo "Channel is present\n";
}В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.
alphaCounts читает A у каждого пикселя. Imagick::getQuantumRange() — статический вызов класса, возвращающий массив; ['quantumRangeLong'] читает максимум по ключу, $Q хранит это число. exportImagePixels(...,'A',Imagick::PIXEL_SHORT) возвращает массив значений A в 16-битной шкале проверенной Q16-сборки. foreach проходит по значениям, === сравнивает точно, ++ увеличивает счётчик; $counts['zero'] читает итог. Это дополнительный проход по растру, а не скрытая работа getter.
Сохранить наклейку с существующим alpha-каналом
retained-alpha.png хранит исходные RGBA-пиксели, включая отверстие ручки и частично прозрачный край. Сравнение показывает один и тот же файл на двух подложках; белый фон слева не закрашен в самой наклейке.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$hasAlpha = $source->getImageAlphaChannel();
saveAlphaNative($source, 'retained-alpha.png', $hasAlpha);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($source, '#243c4d')], 'alpha-preserve.png');
echo "alpha-preserve.png\nhas-channel=" . (int)$hasAlpha . "\n";
retained-alpha.png хранит исходные RGBA-пиксели, включая отверстие ручки и частично прозрачный край. Сравнение показывает один и тот же файл на двух подложках; белый фон слева не закрашен в самой наклейке. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-preserve.png
has-channel=1
Проверить реальную прозрачность повторно прочитанного файла
REMOVE со светлым фоном даёт live-channel=0. Мы намеренно сохраняем этот результат как RGBA: при чтении reloaded-channel=1, хотя все 128000 пикселей непрозрачны. Две правые панели одинаковы; наличие канала и прозрачных пикселей — разные проверки.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$card = clone $source;
if (!$card->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Background failed'); }
if (!$card->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
$liveHas = $card->getImageAlphaChannel();
saveAlphaNative($card, 'delivery-rgba.png', true);
$reloaded = new Imagick(__DIR__ . '/delivery-rgba.png');
$reloadedHas = $reloaded->getImageAlphaChannel();
$counts = alphaCounts($reloaded);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($card, '#243c4d'), alphaPreview($reloaded, '#243c4d')], 'alpha-audit.png');
echo "alpha-audit.png\nlive-channel=" . (int)$liveHas . " reloaded-channel=" . (int)$reloadedHas . " zero=" . $counts['zero'] . " partial=" . $counts['partial'] . " opaque=" . $counts['opaque'] . "\n";
REMOVE со светлым фоном даёт live-channel=0. Мы намеренно сохраняем этот результат как RGBA: при чтении reloaded-channel=1, хотя все 128000 пикселей непрозрачны. Две правые панели одинаковы; наличие канала и прозрачных пикселей — разные проверки. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-audit.png
live-channel=0 reloaded-channel=1 zero=0 partial=0 opaque=128000
Выбрать режим и извлечь карту alpha
Пусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
:: обращается к именованной константе класса. В этой записи EXTRACT выбирает извлечение: исходная alpha становится непрозрачной серой картой, которую затем можно сохранить. Возвращённое true — статус, растр остаётся в $image:
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);| Режим | Действие и граница |
|---|---|
| ACTIVATE | Включает использование имеющихся значений alpha. Не обещает заполнить новый канал единицами; на RGB в нашей пробе значения не были непрозрачными. |
| ON / SET | При неиспользуемом для смешивания alpha инициализируют непрозрачные значения. Это отличается от простого ACTIVATE; проверять состояние до и после. |
| DEACTIVATE | Отключает смешивание через внутреннее разрешение Copy. В проверенной IM7 getter всё ещё true; принудительное сохранение PNG RGBA дало непрозрачные пиксели. |
| OFF | В проверенной пробе выключает канал для текущего изображения: getter false. Это не смешивание с белым и не обратимое сохранение исходного alpha; OFF→ACTIVATE его в пробе не восстановил. |
| OPAQUE | Присваивает всем alpha значение 1 и активирует канал. Getter true, но прозрачных пикселей нет. Скрытый RGB становится видимым. |
| REMOVE | При активном смешивании соединяет RGB с настройкой background и снимает alpha при непрозрачном фоне. У прозрачного background результат может остаться прозрачным. |
| EXTRACT | Переносит значения alpha в серые RGB-пиксели и отключает alpha. Получается непрозрачная карта значений, не прозрачная наклейка. |
| BACKGROUND | Записывает цвет background в RGB полностью прозрачных пикселей A=0; сами значения A=0 остаются прозрачными. Не равен REMOVE. |
В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.

Увидеть различие OFF, OPAQUE и удаления alpha с фоном
После входа на белом идут OFF, OPAQUE, REMOVE со светлым фоном, все показаны на тёмной подложке. OFF/OPAQUE открывают скрытые RGB: снаружи силуэта они чёрные. Только REMOVE смешивает край с выбранным фоном. opaque-reset.png сохраняет результат OPAQUE как RGBA со всеми A=1.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$off = clone $source;
$opaque = clone $source;
$removed = clone $source;
if (!$off->setImageAlphaChannel(Imagick::ALPHACHANNEL_OFF)) { throw new RuntimeException('Off failed'); }
if (!$opaque->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE)) { throw new RuntimeException('Opaque failed'); }
$removed->setImageBackgroundColor('#e6edf1');
if (!$removed->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
saveAlphaNative($opaque, 'opaque-reset.png', true);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($off, '#243c4d'), alphaPreview($opaque, '#243c4d'), alphaPreview($removed, '#243c4d')], 'alpha-modes.png');
echo "alpha-modes.png\n";
После входа на белом идут OFF, OPAQUE, REMOVE со светлым фоном, все показаны на тёмной подложке. OFF/OPAQUE открывают скрытые RGB: снаружи силуэта они чёрные. Только REMOVE смешивает край с выбранным фоном. opaque-reset.png сохраняет результат OPAQUE как RGBA со всеми A=1. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-modes.png
Сделать отдельную непрозрачную карту alpha для проверки края
alpha-mask.png — самостоятельная RGB-карта: чёрное соответствует A=0, белое A=1, серое частичной прозрачности. Это непрозрачное изображение значений alpha, пригодное для осмотра и передачи в дальнейший явно выбранный алгоритм маскирования.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$mask = clone $source;
if (!$mask->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT)) { throw new RuntimeException('Extract failed'); }
saveAlphaNative($mask, 'alpha-mask.png', false);
saveAlphaComparison([alphaPreview($source, 'white'), $mask], 'alpha-mask-comparison.png');
echo "alpha-mask-comparison.png\n";
alpha-mask.png — самостоятельная RGB-карта: чёрное соответствует A=0, белое A=1, серое частичной прозрачности. Это непрозрачное изображение значений alpha, пригодное для осмотра и передачи в дальнейший явно выбранный алгоритм маскирования. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-mask-comparison.png
Подготовить настройку и выпустить светлую или тёмную карточку
Пусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
Строка #e6edf1 задаёт непрозрачные RGB 230/237/241 в обычной шестнадцатеричной записи цвета. Первый вызов только сохраняет настройку. Следующий REMOVE использует её для смешивания с активной alpha. Возвращённые true — статусы; ни один не возвращает новую картинку:
$image->setImageBackgroundColor('#e6edf1');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.

Задать фон в настройке и отдельно применить его к пикселям
Первые две панели имеют одинаковые RGBA-пиксели: setter записал только настройку. background-staged.png остаётся прозрачным. Третья панель после REMOVE уже содержит светлый фон в самих пикселях.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$staged = clone $source;
if (!$staged->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Background failed'); }
saveAlphaNative($staged, 'background-staged.png', true);
$removed = clone $staged;
if (!$removed->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($staged, 'white'), alphaPreview($removed, 'white')], 'background-setting.png');
echo "background-setting.png\n";
Первые две панели имеют одинаковые RGBA-пиксели: setter записал только настройку. background-staged.png остаётся прозрачным. Третья панель после REMOVE уже содержит светлый фон в самих пикселях. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
background-setting.png

Выпустить две скачиваемые карточки на разных фонах
Из одного RGBA-оригинала получены card-light-final.png и card-dark-final.png. Обе карточки RGB, включая фон отверстия ручки и сглаженный край. Новый фон выбирается до REMOVE; исходная наклейка остаётся отдельным прозрачным файлом.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$light = clone $source;
$dark = clone $source;
if (!$light->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Light background failed'); }
if (!$dark->setImageBackgroundColor('#243c4d')) { throw new RuntimeException('Dark background failed'); }
if (!$light->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Light remove failed'); }
if (!$dark->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Dark remove failed'); }
saveAlphaNative($light, 'card-light-final.png', false);
saveAlphaNative($dark, 'card-dark-final.png', false);
saveAlphaComparison([alphaPreview($source, 'white'), $light, $dark], 'background-cards.png');
echo "background-cards.png\n";
Из одного RGBA-оригинала получены card-light-final.png и card-dark-final.png. Обе карточки RGB, включая фон отверстия ручки и сглаженный край. Новый фон выбирается до REMOVE; исходная наклейка остаётся отдельным прозрачным файлом. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
background-cards.png
Проверить результат и не потерять прозрачный оригинал
| Наблюдение | Что проверить |
|---|---|
| Getter true, но всё непрозрачно | OPAQUE и принудительный RGBA могут иметь все A=1. Для наличия прозрачных пикселей считать A, а не только канал. |
| Setter background вернул true, вид не изменился | Настройка записана, но пиксели не закрашены. Для нашей активной RGBA-наклейки следующий REMOVE с непрозрачным фоном создаёт карточку. |
| После OFF проявился чёрный прямоугольник | Выключено использование alpha, а не добавлен белый фон. Скрытые RGB вне силуэта у этого входа чёрные; сохранить оригинал и смешать его с выбранным фоном. |
| После ACTIVATE новый RGB не стал гарантированно непрозрачным | ACTIVATE не инициализирует все A=1. Для такой цели в проверенной версии OPAQUE/ON/SET имеют другой смысл; не считать все режимы синонимами. |
| После сохранения состояние другое | У живого объекта, экспорта, записанного PNG и перечитанного объекта разные точки проверки. DEACTIVATE в нашей пробе сохранил getter true и живые A, но принудительный PNG RGBA перечитался непрозрачным. |
| REMOVE с прозрачным background не убрал прозрачность | Для обещания непрозрачной карточки явно задать непрозрачный фон. Alpha цвета background участвует в операции. |
| Исключение при цвете или пустом объекте | В проверках получен ImagickException. Для внешних размеров/имён файлов/цветов нужна отдельная валидация; фиксированные программы не реализуют веб-загрузчик. |
Результаты относятся к собственной RGBA-графике и проверенному окружению. Полупрозрачные края в сохранённом 8-битном PNG могут округляться; обратно восстановить удалённую alpha по карточке нельзя. Сохранение alpha не гарантирует одинаковую цветопередачу всех приложений; CMYK/PDF, профили, последовательности кадров и безопасность недоверенного reader — отдельные задачи. Все программы здесь CLI: они не отправляют HTTP-ответ и не проверяют загрузку через браузер. Для PNG-наклейки нужен формат с alpha; один выбор JPEG её не сохранит.
Полный переносимый helper
<?php
declare(strict_types=1);
function loadAlphaSource(): Imagick {
$encoded = file_get_contents(__DIR__ . '/source.png.b64');
if ($encoded === false) { throw new RuntimeException('Cannot read source.png.b64'); }
$bytes = base64_decode($encoded, true);
if ($bytes === false || hash('sha256', $bytes) !== 'f51e5780445e0f5130a7f23112b2a00618035afd5545b8e3042c7ccff09b617c') {
throw new RuntimeException('Unexpected RGBA source bytes');
}
if (file_put_contents(__DIR__ . '/source.png', $bytes) === false) { throw new RuntimeException('Cannot restore source.png'); }
return new Imagick(__DIR__ . '/source.png');
}
function alphaPreview(Imagick $image, string $background): Imagick {
$canvas = new Imagick();
$canvas->newImage($image->getImageWidth(), $image->getImageHeight(), $background);
$canvas->compositeImage($image, Imagick::COMPOSITE_OVER, 0, 0);
return $canvas;
}
function saveAlphaNative(Imagick $image, string $filename, bool $withAlpha): void {
$saved = clone $image;
$saved->setImageFormat('png');
$saved->setImageDepth(8);
$saved->setOption('png:color-type', $withAlpha ? '6' : '2');
if (!$saved->writeImage(__DIR__ . '/' . $filename)) { throw new RuntimeException('Cannot save ' . $filename); }
}
function saveAlphaComparison(array $panels, string $filename): void {
$width = 0; $height = 0;
foreach ($panels as $panel) { $width += $panel->getImageWidth(); $height = max($height, $panel->getImageHeight()); }
$canvas = new Imagick();
$canvas->newImage($width, $height, 'white');
$x = 0;
foreach ($panels as $panel) {
$canvas->compositeImage($panel, Imagick::COMPOSITE_OVER, $x, intdiv($height - $panel->getImageHeight(), 2));
$x += $panel->getImageWidth();
}
saveAlphaNative($canvas, $filename, false);
}
function alphaCounts(Imagick $image): array {
$Q = Imagick::getQuantumRange()['quantumRangeLong'];
$values = $image->exportImagePixels(0, 0, $image->getImageWidth(), $image->getImageHeight(), 'A', Imagick::PIXEL_SHORT);
$counts = ['zero' => 0, 'partial' => 0, 'opaque' => 0];
foreach ($values as $alpha) {
if ($alpha === 0) { ++$counts['zero']; }
elseif ($alpha === $Q) { ++$counts['opaque']; }
else { ++$counts['partial']; }
}
return $counts;
}
| Проблема из обсуждения | Граница нашего решения |
|---|---|
| SO 41089170 | Выключение alpha до смешивания отключает использование её значений. Наш порядок: выбрать фон → REMOVE. DEACTIVATE в проверке сохранил живые значения A, но отключил их применение при записи. |
| SO 10805122 | Версия и доступность режимов важнее старого числового кода. Не переносим numeric 11 и IM6-константы в текущую сборку без проверки. |
| SO 29296779 | Прозрачность и цветовое пространство — разные свойства. Наш sRGB-вход не является готовым конвертером произвольного PDF/CMYK и не требует внешнего PDF reader. |
| SO 41335513 | Вопрос о созданной маске и применении её alpha напоминает о формате результата: он должен уметь хранить прозрачность. Здесь сохраняем RGBA PNG; отдельную непрозрачную карточку готовим осознанно. |
| SO 78262402 | Внешний редактор и способ кодирования PNG влияют на показ. Сравниваем decoded alpha и явно заданный RGB/RGBA-формат; не обещаем одинаковое поведение всех редакторов. |
| SO 20927148 | Присваивание всем alpha одинакового значения заполняет прозрачные отверстия. OPAQUE здесь только диагностический режим, не замена смешиванию; ослабление слоя умножением рассматривается в другой главе. |
Самостоятельная карточка и следующий шаг

Упражнение: подготовить ещё одну карточку на белом фоне, сохранив отверстие ручки белым в самом файле. Решение: взять копию исходного $source, вызвать setImageBackgroundColor('white'), затем setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE) и saveAlphaNative(...,false). Проверить угол (0,0) и отверстие (340,150): оба должны быть белыми, а RGB непрозрачных деталей — прежними. Этот вариант выполните отдельно; сохранённые свидетельства относятся к исходным восьми программам.
Для уменьшения видимости слоя с сохранением нулевых отверстий смотрите умножение alpha; для готовой композиции — тень и OVER; для рамки — границы и размеры PNG. Исторические setImageOpacity/setImageMatte остаются отдельными узлами полного справочника: этот пакет их не заменяет и не исключает. В текущей IM7-сборке старый setImageOpacity не нужно считать обязательной доступной альтернативой.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::getImageAlphaChannelПроверяет состояние канала текущего изображения и возвращает bool. Не меняет пиксели и не считает прозрачные точки.
PECL imagick 2 >= 2.3.0, PECL imagick 3 · imagick
Imagick::getImageAlphaChannel(): boolПусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
$hasAlpha получает логический ответ, а не изображение. if выполняет ветку, когда ответ true; false здесь не нужно превращать в исключение. Проверка не подтверждает наличие хотя бы одного пикселя с alpha меньше 1:
$hasAlpha = $image->getImageAlphaChannel();
if ($hasAlpha) {
echo "Channel is present\n";
}В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.
Официальная сигнатура и проверенная версия
Imagick::getImageAlphaChannel(): bool| Аргумент | Значение |
|---|---|
| Нет аргументов | Пустые скобки (). True/false — ответ на вопрос о канале, false является нормальным результатом для RGB, а не статусом ошибки. |
Официальная доступность: PECL imagick 2 >= 2.3.0, PECL imagick 3. Полный исходный XML ниже сохранён вместе с параметрами, return, errors, see also и changelog. Проверено PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Методы относятся к текущему изображению; для последовательности файлов обработку каждого кадра задают отдельно.
С PECL Imagick 3.6.0 официальный return стал bool; раньше возвращался int. Текущая библиотека проверяет, что внутреннее состояние alpha не Undefined: это шире проверки разрешения смешивать. Поэтому DEACTIVATE на нашей RGBA-пробе оставил getter true, а OPAQUE дал true при всех A=1. Для задачи «есть ли реально прозрачные пиксели?» отдельно просматривают значения A; пример аудита считает их после чтения сохранённого PNG.
Пустой Imagick во всех трёх проверках дал ImagickException; некорректная строка цвета также дала ImagickException. Неверный PHP-тип может дать TypeError. Getter false — нормальный ответ, setter true — успешное выполнение выбранного действия, а не обещание нужного вида. Проверяйте пиксели, формат сохранения и повторное чтение. Скрытые RGB при A=0 могут стать видны после OFF/OPAQUE; выключение alpha не восстанавливает уже потерянные значения. Создание копий и просмотр всех пикселей требуют памяти, подсчёт alpha проходит по ширине×высоте; скорость здесь не измерялась.
Полный официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagealphachannel">
<refnamediv>
<refname>Imagick::getImageAlphaChannel</refname>
<refpurpose>Checks if the image has an alpha channel</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::getImageAlphaChannel</methodname>
<void />
</methodsynopsis>
<para>
Returns whether the image has an alpha channel.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Returns &true; if the image has an alpha channel value and &false; if not,
i.e. the image is <acronym>RGB</acronym> rather than <acronym>RGBA</acronym>
or <acronym>CMYK</acronym> rather than <acronym>CMYKA</acronym>.
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
&imagick.imagick.throws;
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>PECL imagick 3.6.0</entry>
<entry>
Returns a &boolean; now; previously, an &integer; was returned.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Сохранить наклейку с существующим alpha-каналом
retained-alpha.png хранит исходные RGBA-пиксели, включая отверстие ручки и частично прозрачный край. Сравнение показывает один и тот же файл на двух подложках; белый фон слева не закрашен в самой наклейке.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$hasAlpha = $source->getImageAlphaChannel();
saveAlphaNative($source, 'retained-alpha.png', $hasAlpha);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($source, '#243c4d')], 'alpha-preserve.png');
echo "alpha-preserve.png\nhas-channel=" . (int)$hasAlpha . "\n";
retained-alpha.png хранит исходные RGBA-пиксели, включая отверстие ручки и частично прозрачный край. Сравнение показывает один и тот же файл на двух подложках; белый фон слева не закрашен в самой наклейке. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-preserve.png
has-channel=1
Проверить реальную прозрачность повторно прочитанного файла
REMOVE со светлым фоном даёт live-channel=0. Мы намеренно сохраняем этот результат как RGBA: при чтении reloaded-channel=1, хотя все 128000 пикселей непрозрачны. Две правые панели одинаковы; наличие канала и прозрачных пикселей — разные проверки.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$card = clone $source;
if (!$card->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Background failed'); }
if (!$card->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
$liveHas = $card->getImageAlphaChannel();
saveAlphaNative($card, 'delivery-rgba.png', true);
$reloaded = new Imagick(__DIR__ . '/delivery-rgba.png');
$reloadedHas = $reloaded->getImageAlphaChannel();
$counts = alphaCounts($reloaded);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($card, '#243c4d'), alphaPreview($reloaded, '#243c4d')], 'alpha-audit.png');
echo "alpha-audit.png\nlive-channel=" . (int)$liveHas . " reloaded-channel=" . (int)$reloadedHas . " zero=" . $counts['zero'] . " partial=" . $counts['partial'] . " opaque=" . $counts['opaque'] . "\n";
REMOVE со светлым фоном даёт live-channel=0. Мы намеренно сохраняем этот результат как RGBA: при чтении reloaded-channel=1, хотя все 128000 пикселей непрозрачны. Две правые панели одинаковы; наличие канала и прозрачных пикселей — разные проверки. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-audit.png
live-channel=0 reloaded-channel=1 zero=0 partial=0 opaque=128000
Imagick::setImageAlphaChannelВыбранный режим изменяет alpha или способ его использования у текущего изображения; возвращает bool true при успехе.
PECL imagick 2 >= 2.1.0, PECL imagick 3 · imagick
Imagick::setImageAlphaChannel(int $mode): boolПусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
:: обращается к именованной константе класса. В этой записи EXTRACT выбирает извлечение: исходная alpha становится непрозрачной серой картой, которую затем можно сохранить. Возвращённое true — статус, растр остаётся в $image:
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);| Режим | Действие и граница |
|---|---|
| ACTIVATE | Включает использование имеющихся значений alpha. Не обещает заполнить новый канал единицами; на RGB в нашей пробе значения не были непрозрачными. |
| ON / SET | При неиспользуемом для смешивания alpha инициализируют непрозрачные значения. Это отличается от простого ACTIVATE; проверять состояние до и после. |
| DEACTIVATE | Отключает смешивание через внутреннее разрешение Copy. В проверенной IM7 getter всё ещё true; принудительное сохранение PNG RGBA дало непрозрачные пиксели. |
| OFF | В проверенной пробе выключает канал для текущего изображения: getter false. Это не смешивание с белым и не обратимое сохранение исходного alpha; OFF→ACTIVATE его в пробе не восстановил. |
| OPAQUE | Присваивает всем alpha значение 1 и активирует канал. Getter true, но прозрачных пикселей нет. Скрытый RGB становится видимым. |
| REMOVE | При активном смешивании соединяет RGB с настройкой background и снимает alpha при непрозрачном фоне. У прозрачного background результат может остаться прозрачным. |
| EXTRACT | Переносит значения alpha в серые RGB-пиксели и отключает alpha. Получается непрозрачная карта значений, не прозрачная наклейка. |
| BACKGROUND | Записывает цвет background в RGB полностью прозрачных пикселей A=0; сами значения A=0 остаются прозрачными. Не равен REMOVE. |
В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.
Официальная сигнатура и проверенная версия
Imagick::setImageAlphaChannel(int $mode): bool| Аргумент | Значение |
|---|---|
| $mode | Обязательное целое число — именованная константа Imagick::ALPHACHANNEL_*. Это выбор режима, а не новое значение alpha и не доля прозрачности. Разные режимы выполняют разные действия. |
Официальная доступность: PECL imagick 2 >= 2.1.0, PECL imagick 3. Полный исходный XML ниже сохранён вместе с параметрами, return, errors, see also и changelog. Проверено PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Методы относятся к текущему изображению; для последовательности файлов обработку каждого кадра задают отдельно.
Официальное условие [imagick.method.available.0x638] означает ImageMagick 6.3.8 или новее. Режимы и экспортированные константы зависят от сборки: OFF_IF_OPAQUE отсутствовал в проверенном DLL, поэтому примеры его не требуют. RESET/FLATTEN из старых IM6-решений также нельзя механически требовать от IM7. Неизвестное целое число не обязано вызвать исключение; внешний список разрешённых режимов — отдельная проверка приложения. Наши программы используют только проверенные именованные константы.
Пустой Imagick во всех трёх проверках дал ImagickException; некорректная строка цвета также дала ImagickException. Неверный PHP-тип может дать TypeError. Getter false — нормальный ответ, setter true — успешное выполнение выбранного действия, а не обещание нужного вида. Проверяйте пиксели, формат сохранения и повторное чтение. Скрытые RGB при A=0 могут стать видны после OFF/OPAQUE; выключение alpha не восстанавливает уже потерянные значения. Создание копий и просмотр всех пикселей требуют памяти, подсчёт alpha проходит по ширине×высоте; скорость здесь не измерялась.
Полный официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagealphachannel">
<refnamediv>
<refname>Imagick::setImageAlphaChannel</refname>
<refpurpose>Sets image alpha channel</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageAlphaChannel</methodname>
<methodparam><type>int</type><parameter>mode</parameter></methodparam>
</methodsynopsis>
<para>
Activate or deactivate image alpha channel. The <parameter>mode</parameter>
is one of the <constant>Imagick::ALPHACHANNEL_<replaceable>*</replaceable></constant> constants.
&imagick.method.available.0x638;
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>mode</parameter></term>
<listitem>
<para>
One of the <constant>Imagick::ALPHACHANNEL_<replaceable>*</replaceable></constant> constants
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
&imagick.imagick.throws;
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>Imagick::setImageMatte</function></member>
<member> <link linkend="imagick.constants.alphachannel">Imagick Alpha Channel Constants</link></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Увидеть различие OFF, OPAQUE и удаления alpha с фоном
После входа на белом идут OFF, OPAQUE, REMOVE со светлым фоном, все показаны на тёмной подложке. OFF/OPAQUE открывают скрытые RGB: снаружи силуэта они чёрные. Только REMOVE смешивает край с выбранным фоном. opaque-reset.png сохраняет результат OPAQUE как RGBA со всеми A=1.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$off = clone $source;
$opaque = clone $source;
$removed = clone $source;
if (!$off->setImageAlphaChannel(Imagick::ALPHACHANNEL_OFF)) { throw new RuntimeException('Off failed'); }
if (!$opaque->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE)) { throw new RuntimeException('Opaque failed'); }
$removed->setImageBackgroundColor('#e6edf1');
if (!$removed->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
saveAlphaNative($opaque, 'opaque-reset.png', true);
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($off, '#243c4d'), alphaPreview($opaque, '#243c4d'), alphaPreview($removed, '#243c4d')], 'alpha-modes.png');
echo "alpha-modes.png\n";
После входа на белом идут OFF, OPAQUE, REMOVE со светлым фоном, все показаны на тёмной подложке. OFF/OPAQUE открывают скрытые RGB: снаружи силуэта они чёрные. Только REMOVE смешивает край с выбранным фоном. opaque-reset.png сохраняет результат OPAQUE как RGBA со всеми A=1. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-modes.png
Сделать отдельную непрозрачную карту alpha для проверки края
alpha-mask.png — самостоятельная RGB-карта: чёрное соответствует A=0, белое A=1, серое частичной прозрачности. Это непрозрачное изображение значений alpha, пригодное для осмотра и передачи в дальнейший явно выбранный алгоритм маскирования.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$mask = clone $source;
if (!$mask->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT)) { throw new RuntimeException('Extract failed'); }
saveAlphaNative($mask, 'alpha-mask.png', false);
saveAlphaComparison([alphaPreview($source, 'white'), $mask], 'alpha-mask-comparison.png');
echo "alpha-mask-comparison.png\n";
alpha-mask.png — самостоятельная RGB-карта: чёрное соответствует A=0, белое A=1, серое частичной прозрачности. Это непрозрачное изображение значений alpha, пригодное для осмотра и передачи в дальнейший явно выбранный алгоритм маскирования. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
alpha-mask-comparison.png
Imagick::setImageBackgroundColorСохраняет цвет background в настройке текущего изображения; сам по себе не перекрашивает пиксели. Возвращает bool true при успехе.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::setImageBackgroundColor(mixed $background): boolПусть $image уже содержит загруженную картинку: $image = new Imagick('source.png'); new создаёт объект, строка в кавычках — путь. $ обозначает переменную, = присваивает результат, -> вызывает метод этой картинки, () содержит аргументы, ; завершает инструкцию. :: обращается к именованной константе класса; например, ALPHACHANNEL_REMOVE выбирает режим удаления alpha с фоном. RGB — красная, зелёная и синяя компоненты; RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно, промежуточное значение смешивает с подложкой.
Строка #e6edf1 задаёт непрозрачные RGB 230/237/241 в обычной шестнадцатеричной записи цвета. Первый вызов только сохраняет настройку. Следующий REMOVE использует её для смешивания с активной alpha. Возвращённые true — статусы; ни один не возвращает новую картинку:
$image->setImageBackgroundColor('#e6edf1');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);В полных программах clone создаёт отдельную копию, чтобы оригинал остался доступен. ! означает отрицание; if (!$image->...) проверяет отказ setter; throw new RuntimeException прерывает цепочку. writeImage сохраняет результат в файл. Основа: объекты и методы, копия через clone, if, исключения.
Официальная сигнатура и проверенная версия
Imagick::setImageBackgroundColor(mixed $background): bool| Аргумент | Значение |
|---|---|
| $background | Обязательный цвет: строка вроде #e6edf1/white либо ImagickPixel. В raw указан mixed, но это не означает произвольную структуру данных. Для готовой непрозрачной карточки нужен непрозрачный цвет. |
Официальная доступность: PECL imagick 2, PECL imagick 3. Полный исходный XML ниже сохранён вместе с параметрами, return, errors, see also и changelog. Проверено PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Методы относятся к текущему изображению; для последовательности файлов обработку каждого кадра задают отдельно.
С PECL Imagick 2.1.0 допускается строка цвета; раньше параметром мог быть только ImagickPixel. Не путайте настройку текущего изображения с фоном нового canvas или фоном окна просмотра. В нашей RGBA-пробе setter с непрозрачным и прозрачным цветом оставил все пиксели без изменений. REMOVE с непрозрачным фоном дал непрозрачный результат, с прозрачным фоном — сохранил прозрачность; слово background само по себе не обещает белую подложку.
Пустой Imagick во всех трёх проверках дал ImagickException; некорректная строка цвета также дала ImagickException. Неверный PHP-тип может дать TypeError. Getter false — нормальный ответ, setter true — успешное выполнение выбранного действия, а не обещание нужного вида. Проверяйте пиксели, формат сохранения и повторное чтение. Скрытые RGB при A=0 могут стать видны после OFF/OPAQUE; выключение alpha не восстанавливает уже потерянные значения. Создание копий и просмотр всех пикселей требуют памяти, подсчёт alpha проходит по ширине×высоте; скорость здесь не измерялась.
Полный официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagebackgroundcolor">
<refnamediv>
<refname>Imagick::setImageBackgroundColor</refname>
<refpurpose>Sets the image background color</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageBackgroundColor</methodname>
<methodparam><type>mixed</type><parameter>background</parameter></methodparam>
</methodsynopsis>
<para>
Sets the image background color.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>background</parameter></term>
<listitem>
<para>
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
&imagick.imagick.throws;
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>PECL imagick 2.1.0</entry>
<entry>
Now allows a string representing the color as the parameter.
Previous versions allow only an ImagickPixel object.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
Задать фон в настройке и отдельно применить его к пикселям
Первые две панели имеют одинаковые RGBA-пиксели: setter записал только настройку. background-staged.png остаётся прозрачным. Третья панель после REMOVE уже содержит светлый фон в самих пикселях.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$staged = clone $source;
if (!$staged->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Background failed'); }
saveAlphaNative($staged, 'background-staged.png', true);
$removed = clone $staged;
if (!$removed->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Remove failed'); }
saveAlphaComparison([alphaPreview($source, 'white'), alphaPreview($staged, 'white'), alphaPreview($removed, 'white')], 'background-setting.png');
echo "background-setting.png\n";
Первые две панели имеют одинаковые RGBA-пиксели: setter записал только настройку. background-staged.png остаётся прозрачным. Третья панель после REMOVE уже содержит светлый фон в самих пикселях. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
background-setting.png
Выпустить две скачиваемые карточки на разных фонах
Из одного RGBA-оригинала получены card-light-final.png и card-dark-final.png. Обе карточки RGB, включая фон отверстия ручки и сглаженный край. Новый фон выбирается до REMOVE; исходная наклейка остаётся отдельным прозрачным файлом.
<?php
declare(strict_types=1);
require __DIR__ . '/alpha-fixture.php';
$source = loadAlphaSource();
$light = clone $source;
$dark = clone $source;
if (!$light->setImageBackgroundColor('#e6edf1')) { throw new RuntimeException('Light background failed'); }
if (!$dark->setImageBackgroundColor('#243c4d')) { throw new RuntimeException('Dark background failed'); }
if (!$light->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Light remove failed'); }
if (!$dark->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE)) { throw new RuntimeException('Dark remove failed'); }
saveAlphaNative($light, 'card-light-final.png', false);
saveAlphaNative($dark, 'card-dark-final.png', false);
saveAlphaComparison([alphaPreview($source, 'white'), $light, $dark], 'background-cards.png');
echo "background-cards.png\n";
Из одного RGBA-оригинала получены card-light-final.png и card-dark-final.png. Обе карточки RGB, включая фон отверстия ручки и сглаженный край. Новый фон выбирается до REMOVE; исходная наклейка остаётся отдельным прозрачным файлом. В одной папке нужны example.php, alpha-fixture.php и source.png.b64; сохраните и остальные файлы ZIP. Запуск: php example.php в окружении с Imagick. Все исходные данные включены; PHP не загружает сеть и не ищет шрифты. Основной PNG — сравнение, отдельные файлы результата названы в программе.
Ожидаемый вывод
background-cards.png
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


