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

Дерево руководства
Глава 369 · После объектов, пикселей, alpha и файлов
Imagick: тип изображения, палитра и реальное хранение PNG
Сохранить серую наклейку с alpha, увидеть потерю палитры и отделить текущее представление от запроса PNG-кодировщику.
Сделать полезную серую наклейку с прозрачностью
Нужна серая версия собственной PNG-наклейки: цвет убрать, прозрачное отверстие ручки и мягкие края оставить. Получим отдельный gray-sticker.png, откроем именно сохранённый файл и покажем его на двух фонах. Затем разберём, почему тип текущего изображения и способ записи PNG отвечают на разные вопросы.
Надпись BLUE BOX и числа цветов внутри исходных рисунков — нарисованный текст. При преобразовании они не переписываются и не измеряют новый цвет пикселя. В дополнительном каталоге строка Q16/PNG8 также остаётся частью рисунка: Q16 — внутренний 16-битный диапазон сборки, PNG8 здесь означает 8 бит на компоненту, а не палитровый формат. Фактические типы записанных файлов проверяются отдельно.


| Понятие до модели | Значение здесь |
|---|---|
| RGB / RGBA / alpha | RGB — три цветовые компоненты; RGBA добавляет alpha от 0 до 1. Alpha управляет наложением: 0 показывает фон, 1 закрывает, промежуточное значение смешивает. |
| Тип и enum | IMGTYPE_* — именованный целый код выбора. MATTE в этих исторических именах означает alpha; канал может быть активен и полностью непрозрачен. |
| Хранение внутри изображения | При прямой организации у пикселя хранятся компоненты. При палитровой — индекс и таблица цветов. Распаковать индекс можно, вернуть утраченные оттенки без исходника нельзя. |
| Цветовое пространство | Правило смысла компонент, например sRGB или GRAY. Это не то же самое, что IMGTYPE и не файловый формат. |
| Формат и хранение PNG | PNG — устройство файла. IHDR — основной заголовок PNG: он задаёт серое/RGB/палитровое хранение и число бит. PLTE — таблица цветов внутри палитрового PNG. Код IMGTYPE не является числом IHDR. |
| tRNS | Дополнительный блок PNG, задающий прозрачность, в том числе цветовой ключ у RGB. Поэтому RGB в IHDR ещё не означает полностью непрозрачный файл. |
| Два setter | setImageType преобразует текущие данные; setType сохраняет запрос последующей записи. getImageType читает текущее представление, а не минимально возможное по всем пикселям. |
| Просмотр и файл | Самостоятельные PNG могут автоматически сохраняться с типом хранения 0/3/4/6. Для иллюстраций PHP перечитывает их и создаёт отдельные RGB/RGBA PNG8-просмотры. Они не подменяют заголовок файла доставки. |

Самая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$type = $image->getImageType();
echo $type;Getter читает текущее представление без анализа всех пикселей на минимально возможный тип. Для нашей наклейки это IMGTYPE_TRUECOLORMATTE, в проверенной сборке код 7. Другое значение узнаём сравнением с именованной константой. Для формата нужен отдельный getImageFormat(); для структуры записанного PNG — его заголовок и повторное чтение.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.
Самая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$gray = clone $image;
$ok = $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);clone создаёт рабочую копию. GRAYSCALEMATTE делает её серой и оставляет alpha данного RGBA. MATTE в исторических именах этих констант означает alpha, а не отдельную краску или обязательно прозрачные пиксели. Для сравнения GRAYSCALE отключает использование alpha: это не наложение на белый фон. Setter возвращает true при успехе, а картинка остаётся в $gray.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.
Перед полной программой: <?php открывает PHP, declare(strict_types=1) включает строгие типы. require подключает type-fixture.php; restoreTypeInputs восстанавливает два проверенных PNG из Base64. new Imagick(путь) читает файл. typePreview открыто накладывает слой поверх непрозрачного фона через OVER. Массив [$sourceWhite, $white, $dark] — упорядоченный список панелей, запятые разделяют элементы. saveTypeComparison размещает целые панели без изменения масштаба; saveTypePreview создаёт только картинку просмотра. Самостоятельный PNG записывается явным writeImage без png:color-type. В первом отчёте gray-type читается после всей подготовки и записи. Непосредственно после setImageType предварительная проверка дала 3, а в поздней точке основного кода получилось 7. Не считаем эти разные этапы одним наблюдением и не приписываем смену одному вызову без доказательства; записанный серый файл при чтении даёт 3. setImageDepth(8)/png:bit-depth выбирают восемь бит записи на уже восьмибитном входе, не обещая отсутствия потерь при другой подготовке.
Сохранить серую наклейку с прозрачной ручкой
Получается самостоятельный gray-sticker.png с серыми значениями и alpha. Оба просмотра взяты после повторного чтения именно этого файла; тёмный фон показывает сохранённые отверстия. Числа 7/3 — коды типов этой сборки, не файловые форматы. Поле gray-type=7 читается после подготовки и записи, а read-type=3 относится к заново открытому серому файлу; это не непосредственный результат setter.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$before = $source->getImageType();
$gray = clone $source;
if (!$gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE)) { throw new RuntimeException('Gray alpha conversion failed'); }
$gray->setImageFormat('png'); $gray->setImageDepth(8); $gray->setOption('png:bit-depth', '8');
if (!$gray->writeImage(__DIR__ . '/gray-sticker.png')) { throw new RuntimeException('PNG write failed'); }
$read = new Imagick(__DIR__ . '/gray-sticker.png');
$white = typePreview($read, 'white'); $dark = typePreview($read, '#243c4d');
saveTypePreview($sourceWhite, 'source-preview8.png'); saveTypePreview($read, 'first-gray-decoded.png', true);
saveTypePreview($white, 'first-gray-white.png'); saveTypePreview($dark, 'first-gray-dark.png');
saveTypeComparison([$sourceWhite, $white, $dark], 'types-first.png');
echo "types-first.png\ngray-sticker.png\nsource-preview8.png\nfirst-gray-decoded.png\nfirst-gray-white.png\nfirst-gray-dark.png\n";
printf("source-type=%d gray-type=%d read-type=%d alpha=%d\n", $before, $gray->getImageType(), $read->getImageType(), (int)$read->getImageAlphaChannel());
Получается самостоятельный gray-sticker.png с серыми значениями и alpha. Оба просмотра взяты после повторного чтения именно этого файла; тёмный фон показывает сохранённые отверстия. Числа 7/3 — коды типов этой сборки, не файловые форматы. Поле gray-type=7 читается после подготовки и записи, а read-type=3 относится к заново открытому серому файлу; это не непосредственный результат setter. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-first.png
gray-sticker.png
source-preview8.png
first-gray-decoded.png
first-gray-white.png
first-gray-dark.png
source-type=7 gray-type=7 read-type=3 alpha=1
Выбрать серое преобразование с нужным режимом alpha
Для сохранения отверстий нужен вариант с alpha. Обычный GRAYSCALE отключает её использование: это не выбранный белый фон и не аккуратное удаление прозрачности. Показан реальный нежелательный результат рядом с правильной наклейкой; Скрытые RGB, раньше закрытые alpha, становится видимым. Чёрные области не являются результатом намеренного наложения на чёрный фон.

Отличить серый цвет от отключённого использования alpha
GRAYSCALEMATTE оставляет прозрачность, GRAYSCALE отключает её использование. У обычного серого файла исчезло прозрачное окно: скрытый RGB теперь виден. Это контрпример, а не готовая наклейка на выбранном фоне. Старые значения alpha могли остаться в текущем объекте; режим их смешивания и файл проверяем отдельно.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$grayA = clone $source; $grayA->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
$plain = clone $source; $plain->setImageType(Imagick::IMGTYPE_GRAYSCALE);
$plain->setImageFormat('png'); $plain->setImageDepth(8); $plain->setOption('png:bit-depth', '8');
if (!$plain->writeImage(__DIR__ . '/plain-gray.png')) { throw new RuntimeException('Plain gray write failed'); }
$readPlain = new Imagick(__DIR__ . '/plain-gray.png');
$white = typePreview($grayA, 'white'); $dark = typePreview($grayA, '#243c4d');
saveTypePreview($grayA, 'control-gray-alpha.png', true); saveTypePreview($readPlain, 'control-plain-decoded.png');
saveTypePreview($white, 'control-gray-white.png'); saveTypePreview($dark, 'control-gray-dark.png');
saveTypeComparison([$sourceWhite, $white, $readPlain, $dark], 'types-controls.png');
echo "types-controls.png\nplain-gray.png\ncontrol-gray-alpha.png\ncontrol-plain-decoded.png\ncontrol-gray-white.png\ncontrol-gray-dark.png\n";
printf("MATTE-use-alpha=%d GRAY-use-alpha=%d saved-GRAY-alpha=%d\n", (int)$grayA->getImageAlphaChannel(), (int)$plain->getImageAlphaChannel(), (int)$readPlain->getImageAlphaChannel());
GRAYSCALEMATTE оставляет прозрачность, GRAYSCALE отключает её использование. У обычного серого файла исчезло прозрачное окно: скрытый RGB теперь виден. Это контрпример, а не готовая наклейка на выбранном фоне. Старые значения alpha могли остаться в текущем объекте; режим их смешивания и файл проверяем отдельно. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-controls.png
plain-gray.png
control-gray-alpha.png
control-plain-decoded.png
control-gray-white.png
control-gray-dark.png
MATTE-use-alpha=1 GRAY-use-alpha=0 saved-GRAY-alpha=0
Прочитать тип и не перепутать его с форматом или прозрачными пикселями
Самая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$type = $image->getImageType();
echo $type;Getter читает текущее представление без анализа всех пикселей на минимально возможный тип. Для нашей наклейки это IMGTYPE_TRUECOLORMATTE, в проверенной сборке код 7. Другое значение узнаём сравнением с именованной константой. Для формата нужен отдельный getImageFormat(); для структуры записанного PNG — его заголовок и повторное чтение.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.

Сравнить текущий TRUECOLOR и автоматически серый PNG
Серые числа могут находиться в текущем TRUECOLOR-изображении. Getter перед записью сообщает 6; кодировщик сохраняет серый PNG, повторное чтение даёт 2. Две последние панели выглядят одинаково. Формат PNG узнаём отдельным getImageFormat, не из IMGTYPE.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$neutral = clone $catalogue;
$neutral->setImageType(Imagick::IMGTYPE_GRAYSCALE);
$neutral->setImageType(Imagick::IMGTYPE_TRUECOLOR);
$liveType = $neutral->getImageType();
$neutral->setImageFormat('png'); $neutral->setImageDepth(8); $neutral->setOption('png:bit-depth', '8');
if (!$neutral->writeImage(__DIR__ . '/neutral-auto.png')) { throw new RuntimeException('Neutral write failed'); }
$read = new Imagick(__DIR__ . '/neutral-auto.png');
saveTypePreview($neutral, 'neutral-live.png'); saveTypePreview($read, 'neutral-decoded.png');
saveTypeComparison([$sourceWhite, $neutral, $read], 'types-get.png');
echo "types-get.png\nneutral-auto.png\nneutral-live.png\nneutral-decoded.png\n";
printf("live-type=%d read-type=%d format=%s\n", $liveType, $read->getImageType(), $read->getImageFormat());
Серые числа могут находиться в текущем TRUECOLOR-изображении. Getter перед записью сообщает 6; кодировщик сохраняет серый PNG, повторное чтение даёт 2. Две последние панели выглядят одинаково. Формат PNG узнаём отдельным getImageFormat, не из IMGTYPE. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-get.png
neutral-auto.png
neutral-live.png
neutral-decoded.png
live-type=6 read-type=2 format=PNG
Вторая задача — проверить пригодность прозрачного слоя. Минимум массива alpha показывает, есть ли значения ниже 1; PIXEL_DOUBLE задаёт нормированный вывод чисел. Метод exportImagePixels здесь читает все A, а не преобразует цвет. Два одинаковых IMGTYPE_TRUECOLORMATTE не гарантируют одинаковую прозрачность: у одного изображения есть отверстие, другое полностью непрозрачно.
Проверить одинаковый MATTE-тип у прозрачного и полностью непрозрачного входов
Оба объекта дают 7, но только наклейка имеет alpha меньше 1. У каталога канал активен и полностью непрозрачен. Тип не заменяет проверку значений alpha и пригодности файла.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$opaque = clone $catalogue; $opaque->setImageType(Imagick::IMGTYPE_TRUECOLORMATTE);
$sourceType = $source->getImageType(); $opaqueType = $opaque->getImageType();
$a = $source->exportImagePixels(0, 0, 400, 320, 'A', Imagick::PIXEL_DOUBLE);
$b = $opaque->exportImagePixels(0, 0, 400, 320, 'A', Imagick::PIXEL_DOUBLE);
$opaqueWhite = typePreview($opaque, 'white'); $dark = typePreview($source, '#243c4d');
saveTypePreview($opaque, 'opaque-catalogue-alpha.png', true); saveTypePreview($dark, 'getter-source-dark.png');
saveTypeComparison([$sourceWhite, $opaqueWhite, $dark], 'types-alpha-diagnostic.png');
echo "types-alpha-diagnostic.png\nopaque-catalogue-alpha.png\ngetter-source-dark.png\n";
printf("source-type=%d alpha-min=%.1f; opaque-type=%d alpha-min=%.1f\n", $sourceType, min($a), $opaqueType, min($b));
Оба объекта дают 7, но только наклейка имеет alpha меньше 1. У каталога канал активен и полностью непрозрачен. Тип не заменяет проверку значений alpha и пригодности файла. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-alpha-diagnostic.png
opaque-catalogue-alpha.png
getter-source-dark.png
source-type=7 alpha-min=0.0; opaque-type=7 alpha-min=1.0
Преобразовать данные и увидеть необратимую потерю цветов
Самая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$gray = clone $image;
$ok = $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);clone создаёт рабочую копию. GRAYSCALEMATTE делает её серой и оставляет alpha данного RGBA. MATTE в исторических именах этих констант означает alpha, а не отдельную краску или обязательно прозрачные пиксели. Для сравнения GRAYSCALE отключает использование alpha: это не наложение на белый фон. Setter возвращает true при успехе, а картинка остаётся в $gray.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.
Преобразовать известный RGBA в серую самостоятельную наклейку
GRAYSCALEMATTE преобразует цветные компоненты и сохраняет исходную alpha данного RGBA. Поле converted-type=7 снято уже после подготовки и записи, а read-type=3 — с повторно открытого файла. Серый файл с alpha и RGB/RGBA-просмотр — разные представления одного результата; белая подложка относится только к просмотру.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$gray = clone $source;
if (!$gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE)) { throw new RuntimeException('Gray alpha conversion failed'); }
$gray->setImageFormat('png'); $gray->setImageDepth(8); $gray->setOption('png:bit-depth', '8');
if (!$gray->writeImage(__DIR__ . '/gray-minimal.png')) { throw new RuntimeException('Gray PNG write failed'); }
$read = new Imagick(__DIR__ . '/gray-minimal.png'); $white = typePreview($read, 'white');
saveTypePreview($read, 'gray-minimal-decoded.png', true); saveTypePreview($white, 'gray-minimal-white.png');
saveTypeComparison([$sourceWhite, $white], 'types-gray.png');
echo "types-gray.png\ngray-minimal.png\ngray-minimal-decoded.png\ngray-minimal-white.png\n";
printf("converted-type=%d read-type=%d alpha=%d\n", $gray->getImageType(), $read->getImageType(), (int)$read->getImageAlphaChannel());
GRAYSCALEMATTE преобразует цветные компоненты и сохраняет исходную alpha данного RGBA. Поле converted-type=7 снято уже после подготовки и записи, а read-type=3 — с повторно открытого файла. Серый файл с alpha и RGB/RGBA-просмотр — разные представления одного результата; белая подложка относится только к просмотру. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-gray.png
gray-minimal.png
gray-minimal-decoded.png
gray-minimal-white.png
converted-type=7 read-type=3 alpha=1
Вторая практика — ограниченный набор цветов дополнительного собственного каталога. Перед палитровым преобразованием dither=false отключает распределение ошибки квантизации в этой проверке: ступеньки не скрываются добавленным узором. Квантизация — замена многих цветов меньшим набором. Это меняет данные; вернув прямую организацию хранения, нельзя восстановить исходные оттенки. Число использованных цветов проверяется отдельно от числа записей таблицы PLTE в PNG.

Уменьшить набор цветов каталога и увидеть невосстановимую потерю
На этом входе палитра использует 169 цветов; это не обещанные 256 и не число записей PLTE. TRUECOLOR меняет организацию хранения, но не возвращает утраченные оттенки: обе последние панели точны друг другу. PNG-кодировщик снова выбрал палитру и для распакованной копии.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$palette = clone $catalogue; $palette->setImageArtifact('dither', 'false');
if (!$palette->setImageType(Imagick::IMGTYPE_PALETTE)) { throw new RuntimeException('Palette conversion failed'); }
$unpacked = clone $palette;
if (!$unpacked->setImageType(Imagick::IMGTYPE_TRUECOLOR)) { throw new RuntimeException('Truecolor conversion failed'); }
$same = typeRawHash($palette) === typeRawHash($unpacked);
$palette->setImageFormat('png'); $palette->setImageDepth(8); $palette->setOption('png:bit-depth', '8');
$unpacked->setImageFormat('png'); $unpacked->setImageDepth(8); $unpacked->setOption('png:bit-depth', '8');
if (!$palette->writeImage(__DIR__ . '/palette-catalogue.png') || !$unpacked->writeImage(__DIR__ . '/unpacked-catalogue.png')) { throw new RuntimeException('Palette files failed'); }
$a = new Imagick(__DIR__ . '/palette-catalogue.png'); $b = new Imagick(__DIR__ . '/unpacked-catalogue.png');
saveTypePreview($a, 'palette-decoded.png'); saveTypePreview($b, 'unpacked-decoded.png');
saveTypeComparison([$sourceWhite, $catalogue, $a, $b], 'types-palette.png');
echo "types-palette.png\npalette-catalogue.png\nunpacked-catalogue.png\npalette-decoded.png\nunpacked-decoded.png\n";
printf("palette-live=%d unpacked-live=%d colors=%d/%d same-values=%d read=%d/%d\n", $palette->getImageType(), $unpacked->getImageType(), $palette->getImageColors(), $unpacked->getImageColors(), (int)$same, $a->getImageType(), $b->getImageType());
На этом входе палитра использует 169 цветов; это не обещанные 256 и не число записей PLTE. TRUECOLOR меняет организацию хранения, но не возвращает утраченные оттенки: обе последние панели точны друг другу. PNG-кодировщик снова выбрал палитру и для распакованной копии. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-palette.png
palette-catalogue.png
unpacked-catalogue.png
palette-decoded.png
unpacked-decoded.png
palette-live=4 unpacked-live=6 colors=169/169 same-values=1 read=4/4
Задать потребляемое требование к записи и отдельно выбрать фон
Самая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$ok = $image->setType(Imagick::IMGTYPE_TRUECOLORMATTE);
$image->setImageFormat('png');
$image->writeImage(__DIR__ . '/delivery.png');setType сохраняет настройку этого объекта для записи; setImageFormat выбирает PNG, writeImage записывает байты. __DIR__ — папка программы, . соединяет строки пути, кавычки выделяют текст. У выбранного PNG-кодировщика запрос TRUECOLORMATTE выбирает RGBA-хранение, если его не перекрывает png:color-type. Сам setter не пересчитывает пиксели и не записывает файл. Настройка относится к этому объекту, не ко всем PHP-изображениям.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.

Получить RGBA-хранение PNG при тех же серых значениях
setType не изменил числовые значения и текущий тип 3. При записи PNG запрос TRUECOLORMATTE дал RGBA-хранение, тогда как обычная запись дала grayscale+alpha. После чтения getter отражает новое представление файла; внешний вид одинаков.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$gray = clone $source; $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
$natural = clone $gray; $natural->setImageFormat('png'); $natural->setImageDepth(8); $natural->setOption('png:bit-depth', '8');
if (!$natural->writeImage(__DIR__ . '/gray-natural.png')) { throw new RuntimeException('Natural write failed'); }
$requested = clone $gray; $before = typeRawHash($requested);
if (!$requested->setType(Imagick::IMGTYPE_TRUECOLORMATTE)) { throw new RuntimeException('Writer setting failed'); }
$same = $before === typeRawHash($requested); $liveType = $requested->getImageType();
$requested->setImageFormat('png'); $requested->setImageDepth(8); $requested->setOption('png:bit-depth', '8');
if (!$requested->writeImage(__DIR__ . '/gray-requested-rgba.png')) { throw new RuntimeException('Requested write failed'); }
$a = new Imagick(__DIR__ . '/gray-natural.png'); $b = new Imagick(__DIR__ . '/gray-requested-rgba.png');
saveTypePreview($a, 'natural-gray-decoded.png', true); saveTypePreview($b, 'requested-rgba-decoded.png', true);
saveTypeComparison([$sourceWhite, typePreview($a, 'white'), typePreview($b, 'white')], 'types-writer-request.png');
echo "types-writer-request.png\ngray-natural.png\ngray-requested-rgba.png\nnatural-gray-decoded.png\nrequested-rgba-decoded.png\n";
printf("live-type=%d setting-numeric-noop=%d natural-read=%d requested-read=%d\n", $liveType, (int)$same, $a->getImageType(), $b->getImageType());
setType не изменил числовые значения и текущий тип 3. При записи PNG запрос TRUECOLORMATTE дал RGBA-хранение, тогда как обычная запись дала grayscale+alpha. После чтения getter отражает новое представление файла; внешний вид одинаков. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-writer-request.png
gray-natural.png
gray-requested-rgba.png
natural-gray-decoded.png
requested-rgba-decoded.png
live-type=3 setting-numeric-noop=1 natural-read=3 requested-read=7
Когда получателю нужен полностью непрозрачный RGB-файл, сначала определяем фон. OVER здесь смешивает серую наклейку с непрозрачным #e6edf1, и только затем setType(TRUECOLOR) просит RGB-запись. Отдельный контрпример намеренно задаёт png:color-type=2 поверх запроса RGBA. В нём есть tRNS с чёрным цветовым ключом: некоторые прозрачные места остались, а промежуточная alpha потерялась. Такой файл нельзя выдавать за точную RGBA-наклейку или автоматически за непрозрачный PNG.
Подготовить непрозрачную доставку и показать приоритет явной настройки PNG
Непрозрачная доставка сначала получает выбранный светлый фон через OVER, затем RGB-хранение. Отдельный контрпример задаёт PNG color-type 2 поверх запроса RGBA: настройка PNG имеет приоритет. RGB-файл сохранил чёрный прозрачный ключ tRNS, но потерял исходные промежуточные alpha; один IHDR не доказывает непрозрачность.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$gray = clone $source; $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
$flat = typePreview($gray, '#e6edf1');
$flat->setType(Imagick::IMGTYPE_TRUECOLOR); $flat->setImageFormat('png'); $flat->setImageDepth(8); $flat->setOption('png:bit-depth', '8');
if (!$flat->writeImage(__DIR__ . '/opaque-delivery.png')) { throw new RuntimeException('Opaque delivery failed'); }
$overridden = clone $gray; $overridden->setType(Imagick::IMGTYPE_TRUECOLORMATTE);
$overridden->setImageFormat('png'); $overridden->setImageDepth(8); $overridden->setOption('png:bit-depth', '8');
$overridden->setOption('png:color-type', '2');
if (!$overridden->writeImage(__DIR__ . '/override-rgb.png')) { throw new RuntimeException('Override write failed'); }
$a = new Imagick(__DIR__ . '/opaque-delivery.png'); $b = new Imagick(__DIR__ . '/override-rgb.png');
$white = typePreview($b, 'white'); $dark = typePreview($b, '#243c4d');
saveTypePreview($a, 'opaque-delivery-decoded.png'); saveTypePreview($b, 'override-decoded.png', true);
saveTypePreview($white, 'override-white.png'); saveTypePreview($dark, 'override-dark.png');
saveTypeComparison([$sourceWhite, $a, $white, $dark], 'types-writer-policy.png');
echo "types-writer-policy.png\nopaque-delivery.png\noverride-rgb.png\nopaque-delivery-decoded.png\noverride-decoded.png\noverride-white.png\noverride-dark.png\n";
printf("flattened-alpha=%d overridden-reload-alpha=%d\n", (int)$a->getImageAlphaChannel(), (int)$b->getImageAlphaChannel());
Непрозрачная доставка сначала получает выбранный светлый фон через OVER, затем RGB-хранение. Отдельный контрпример задаёт PNG color-type 2 поверх запроса RGBA: настройка PNG имеет приоритет. RGB-файл сохранил чёрный прозрачный ключ tRNS, но потерял исходные промежуточные alpha; один IHDR не доказывает непрозрачность. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-writer-policy.png
opaque-delivery.png
override-rgb.png
opaque-delivery-decoded.png
override-decoded.png
override-white.png
override-dark.png
flattened-alpha=0 overridden-reload-alpha=1
Проверять данные, хранение PNG, alpha и ошибки раздельно
| Наблюдение | Что проверить |
|---|---|
| Getter дал 6 или 7 | Это IMGTYPE-код текущего изображения, не PNG/JPEG/MIME. Сравнивайте именованные константы, формат читайте отдельно. |
| Серые пиксели сохранились как RGB | Это допустимо. Серые значения и число компонент PNG — разные требования. Проверяйте реальный IHDR. |
| TRUECOLOR снова сохранился в палитре | Кодировщик может выбрать компактное представление автоматически. Запрос setType и более приоритетные настройки PNG имеют отдельный смысл. |
| MATTE, но прозрачных пикселей нет | Активная alpha может быть вся 1. Getter не вычисляет минимум alpha. |
| После GRAYSCALE появился тёмный фон | Использование alpha отключено, скрытые значения стали видимыми. Для выбранного непрозрачного фона нужен явный OVER. |
| PNG type 2, но виден фон viewer | Проверьте tRNS и alpha после повторного чтения. RGB-заголовок не исключает цветовой ключ прозрачности. |
| Палитра использует 169 цветов | На этом входе это фактический результат, не ёмкость палитры и не число записей PLTE. Потеря цветов может быть заметна на градиентах и мелких деталях. |
| Вернули TRUECOLOR, а качество не вернулось | Распаковка меняет организацию хранения, не восстанавливает недостающие оттенки. Нужен исходный файл. |
| true, но файл не тот | Setter не выбирает формат, не пишет файл и не оценивает пригодность. Проверяйте writeImage, действительные байты и перечитывание. |
| Неизвестный код типа | Не полагайтесь на автоматическое исключение. Для внешнего ввода задайте свой разрешённый список; UNDEFINED/OPTIMIZE не являются требованием преобразовать все пиксели. |
| PDF, S3, ICC или печать | Эти задачи из обсуждений дают контекст проблем; их внешние сервисы, декодеры и точность профилей здесь не проверялись. |
Глубина компоненты и число компонент — отдельные величины: RGB8 обычно даёт три восьмибитные цветовые компоненты, RGBA8 добавляет четвёртую. Это не IMGTYPE-код и не обещание определённого размера файла. Восемь программ сохраняют фактические самостоятельные PNG и показывают их после чтения Imagick; картинки просмотра не изображают другую структуру файла доставки.
Полный переносимый helper
<?php
declare(strict_types=1);
function restoreTypeInputs(): void {
$hashes=['source.png'=>'f51e5780445e0f5130a7f23112b2a00618035afd5545b8e3042c7ccff09b617c','catalogue.png'=>'453b22e19273f2fdd54ec6a7f0cd9e96a7b08c70cc4cc854838d1428fea207c6'];
foreach($hashes as $name=>$hash){
$text=file_get_contents(__DIR__.'/'.$name.'.b64'); if($text===false){throw new RuntimeException('Input missing');}
$bytes=base64_decode($text,true);if($bytes===false||hash('sha256',$bytes)!==$hash){throw new RuntimeException('Input mismatch');}
if(file_put_contents(__DIR__.'/'.$name,$bytes)===false){throw new RuntimeException('Restore failed');}
}
}
function typePreview(Imagick $image,string $background): Imagick {
$view=new Imagick();$view->newImage($image->getImageWidth(),$image->getImageHeight(),$background);
$view->compositeImage($image,Imagick::COMPOSITE_OVER,0,0);return $view;
}
function saveTypePreview(Imagick $image,string $filename,bool $alpha=false): void {
$copy=clone $image;$copy->setImageFormat('png');$copy->setImageDepth(8);$copy->setOption('png:color-type',$alpha?'6':'2');
if(!$copy->writeImage(__DIR__.'/'.$filename)){throw new RuntimeException('Preview write failed');}
}
function saveTypeComparison(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();}
saveTypePreview($canvas,$filename);
}
function typeRawHash(Imagick $image): string {
return hash('sha256',json_encode($image->exportImagePixels(0,0,$image->getImageWidth(),$image->getImageHeight(),'RGBA',Imagick::PIXEL_DOUBLE),JSON_THROW_ON_ERROR));
}
| Реальная прочитанная проблема | Применение и предел |
|---|---|
| SO 12461373 | Автору требуется PNG с одним серым каналом в файловом заголовке, а фильтр серого и палитровое представление дают другое хранение при похожем виде. Разделяем видимые оттенки, внутренний тип и фактический PNG color type. |
| SO 11047797 | В загрузке фотографий в объектное хранилище пользователь получает другое число компонент для серых снимков; установка TRUECOLOR не даёт ожидаемого ответа getter. Это повод объяснить, что означает текущий тип и какую настройку действительно использует кодировщик. Внешнее хранилище этим пакетом не вызывается. |
| SO 77988095 | В цепочке подготовки изображений часть PNG открывается редактором в Indexed Color. Пользователь сравнивает getImageType и getImageColorspace и видит одинаковые числа при разных файлах. Нужна диагностика сохранённой структуры и явные ограничения автоматического выбора кодировщика; PDF здесь только контекст вопроса. |
| SO 5627776 | Пользователь получает число 6 и хочет по нему определить файловый формат. Возвращаемое значение не является массивом или номером MIME-формата: для IMGTYPE нужны именованные константы, а формат проверяется отдельно. |
| SO 70619982 | После обработки исходника с одинаковыми компонентами приложение сохраняет PNG в сером представлении, хотя следующему инструменту нужен RGB. Настройка current image и требование записи должны быть разнесены; один внешний вид не доказывает требуемое число каналов. |
| SO 55875129 | В пакетной обработке RGBA-иконок цветная картинка становится индексированной, а серая остаётся grayscale; дополнительно возникает предупреждение о профиле. Важны палитра, прозрачность и итоговая структура. Само предупреждение ICC не превращается в обещание универсального управления профилями. |
Выбрать преобразование и доставку под реального получателя

Упражнение: нужна серая наклейка для двух фонов и отдельная непрозрачная копия. Решение: сохраняйте GRAYSCALEMATTE-версию с alpha, а непрозрачную производную создавайте из неё отдельным OVER на выбранный фон; после записи проверьте alpha и заголовок. Не пытайтесь получить белый фон одним выбором TRUECOLOR. Это продолжение, а не новый проверенный запуск среди исходных восьми.
Дальше: режимы alpha и выбранный фон, пространство, метка и преобразование, глубина компоненты и потеря точности, формат, кодирование и реальные файлы. Другие методы и исторические варианты остаются отдельными узлами полного справочника.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::getImageTypeПустые скобки (). Возвращает int, код IMGTYPE_*, а не массив, MIME или название PNG/JPEG.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::getImageType(): intСамая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$type = $image->getImageType();
echo $type;Getter читает текущее представление без анализа всех пикселей на минимально возможный тип. Для нашей наклейки это IMGTYPE_TRUECOLORMATTE, в проверенной сборке код 7. Другое значение узнаём сравнением с именованной константой. Для формата нужен отдельный getImageFormat(); для структуры записанного PNG — его заголовок и повторное чтение.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.
Полный контракт и границы реализации
Imagick::getImageType(): int| Параметр | Значение |
|---|---|
| Нет аргументов | Пустые скобки (). Возвращает int, код IMGTYPE_*, а не массив, MIME или название PNG/JPEG. |
Returns the type of the image, derived from its colorspace, its storage class and whether it carries an alpha channel. The pixels themselves are not examined, so the value reflects how the image is currently held rather than the smallest type it could be reduced to. Доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns one of the following imagick::IMGTYPE_ * constants. imagick::IMGTYPE_UNDEFINED and imagick::IMGTYPE_OPTIMIZE are never returned. imagick::IMGTYPE_BILEVEL imagick::IMGTYPE_GRAYSCALE imagick::IMGTYPE_GRAYSCALEMATTE imagick::IMGTYPE_PALETTE imagick::IMGTYPE_PALETTEMATTE imagick::IMGTYPE_TRUECOLOR imagick::IMGTYPE_TRUECOLORMATTE imagick::IMGTYPE_COLORSEPARATION imagick::IMGTYPE_COLORSEPARATIONMATTE
| Константа типа | Смысл и граница |
|---|---|
| IMGTYPE_BILEVEL | Два тона; преобразование может нормировать и пороговать значения, отключает alpha. |
| IMGTYPE_GRAYSCALE | Серые значения, использование alpha отключено. |
| IMGTYPE_GRAYSCALEMATTE | Серые значения с alpha; активный канал не означает наличие прозрачных пикселей. |
| IMGTYPE_PALETTE | Палитровая организация; преобразование может уменьшить набор цветов, alpha отключается. |
| IMGTYPE_PALETTEMATTE | Палитра с alpha; квантизация может менять значения, не обещаем точную alpha для любого входа. |
| IMGTYPE_TRUECOLOR | Прямое хранение цветных компонент, использование alpha отключено. Не возвращает потерянные цвета. |
| IMGTYPE_TRUECOLORMATTE | Прямое хранение с alpha; на RGB-входе может создать полностью непрозрачную alpha. |
| IMGTYPE_COLORSEPARATION | Цветоделение CMYK без alpha; это отдельная цветовая модель, не обычный RGB PNG. |
| IMGTYPE_COLORSEPARATIONMATTE | Цветоделение с alpha. CMYK/ICC-печать этим уроком не проверяется. |
Официальный getter перечисляет все девять типов таблицы. IMGTYPE_UNDEFINED и IMGTYPE_OPTIMIZE не возвращаются. Реализация определяет тип по пространству, признаку серого/двухтонового изображения, организации хранения и alpha; она не перебирает пиксели для поиска самой маленькой записи. Это не прямое чтение поля depth и не проверка IHDR. Число 6 не означает JPEG, PNG или качество. На пустом объекте в проверке получен ImagickException, как указано официальным разделом ошибок.
Официальные XML этих трёх методов не содержат исходных примеров и таблиц изменений. Все пояснения, список возвращаемых типов и особые значения сохранены; весь XML открыт ниже. Проверено в PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Именованные IMGTYPE_* переносимее случайных чисел старых версий. Ошибочный PHP-тип может дать TypeError; разрешённый список типов для внешнего ввода — политика приложения, а не гарантированная проверка библиотеки.
Тип хранения PNG: 0 — серый, 2 — RGB, 3 — палитра, 4 — серый+alpha, 6 — RGBA. Эти числа не совпадают с кодами IMGTYPE. RGB PNG type 2 может дополнительно иметь tRNS — прозрачный цветовой ключ; отсутствие отдельного alpha-канала в IHDR не доказывает непрозрачность. Для выбранного непрозрачного фона сначала явно накладываем слой через OVER. Частичную alpha нельзя считать сохранённой только потому, что повторный getter сообщил активную alpha. PNG-кодировщик может автоматически выбрать палитру или серое хранение по данным; сам getImageType не является форматом или прогнозом заголовка.
Весь официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagetype">
<refnamediv>
<refname>Imagick::getImageType</refname>
<refpurpose>Gets the image type</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>int</type><methodname>Imagick::getImageType</methodname>
<void/>
</methodsynopsis>
<simpara>
Returns the type of the image, derived from its colorspace, its storage
class and whether it carries an alpha channel. The pixels themselves are
not examined, so the value reflects how the image is currently held rather
than the smallest type it could be reduced to.
</simpara>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<simpara>
Returns one of the following
<link linkend="imagick.constants.imagetype"><constant>imagick::IMGTYPE_<replaceable>*</replaceable></constant></link>
constants. <constant>imagick::IMGTYPE_UNDEFINED</constant> and
<constant>imagick::IMGTYPE_OPTIMIZE</constant> are never returned.
</simpara>
<itemizedlist>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-bilevel"><constant>imagick::IMGTYPE_BILEVEL</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-grayscale"><constant>imagick::IMGTYPE_GRAYSCALE</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-grayscalematte"><constant>imagick::IMGTYPE_GRAYSCALEMATTE</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-palette"><constant>imagick::IMGTYPE_PALETTE</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-palettematte"><constant>imagick::IMGTYPE_PALETTEMATTE</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-truecolor"><constant>imagick::IMGTYPE_TRUECOLOR</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-truecolormatte"><constant>imagick::IMGTYPE_TRUECOLORMATTE</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-colorseparation"><constant>imagick::IMGTYPE_COLORSEPARATION</constant></link>
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="imagick.constants.imgtype-colorseparationmatte"><constant>imagick::IMGTYPE_COLORSEPARATIONMATTE</constant></link>
</simpara>
</listitem>
</itemizedlist>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
&imagick.imagick.throws;
</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
-->
Сравнить текущий TRUECOLOR и автоматически серый PNG
Серые числа могут находиться в текущем TRUECOLOR-изображении. Getter перед записью сообщает 6; кодировщик сохраняет серый PNG, повторное чтение даёт 2. Две последние панели выглядят одинаково. Формат PNG узнаём отдельным getImageFormat, не из IMGTYPE.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$neutral = clone $catalogue;
$neutral->setImageType(Imagick::IMGTYPE_GRAYSCALE);
$neutral->setImageType(Imagick::IMGTYPE_TRUECOLOR);
$liveType = $neutral->getImageType();
$neutral->setImageFormat('png'); $neutral->setImageDepth(8); $neutral->setOption('png:bit-depth', '8');
if (!$neutral->writeImage(__DIR__ . '/neutral-auto.png')) { throw new RuntimeException('Neutral write failed'); }
$read = new Imagick(__DIR__ . '/neutral-auto.png');
saveTypePreview($neutral, 'neutral-live.png'); saveTypePreview($read, 'neutral-decoded.png');
saveTypeComparison([$sourceWhite, $neutral, $read], 'types-get.png');
echo "types-get.png\nneutral-auto.png\nneutral-live.png\nneutral-decoded.png\n";
printf("live-type=%d read-type=%d format=%s\n", $liveType, $read->getImageType(), $read->getImageFormat());
Серые числа могут находиться в текущем TRUECOLOR-изображении. Getter перед записью сообщает 6; кодировщик сохраняет серый PNG, повторное чтение даёт 2. Две последние панели выглядят одинаково. Формат PNG узнаём отдельным getImageFormat, не из IMGTYPE. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-get.png
neutral-auto.png
neutral-live.png
neutral-decoded.png
live-type=6 read-type=2 format=PNG
Проверить одинаковый MATTE-тип у прозрачного и полностью непрозрачного входов
Оба объекта дают 7, но только наклейка имеет alpha меньше 1. У каталога канал активен и полностью непрозрачен. Тип не заменяет проверку значений alpha и пригодности файла.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$opaque = clone $catalogue; $opaque->setImageType(Imagick::IMGTYPE_TRUECOLORMATTE);
$sourceType = $source->getImageType(); $opaqueType = $opaque->getImageType();
$a = $source->exportImagePixels(0, 0, 400, 320, 'A', Imagick::PIXEL_DOUBLE);
$b = $opaque->exportImagePixels(0, 0, 400, 320, 'A', Imagick::PIXEL_DOUBLE);
$opaqueWhite = typePreview($opaque, 'white'); $dark = typePreview($source, '#243c4d');
saveTypePreview($opaque, 'opaque-catalogue-alpha.png', true); saveTypePreview($dark, 'getter-source-dark.png');
saveTypeComparison([$sourceWhite, $opaqueWhite, $dark], 'types-alpha-diagnostic.png');
echo "types-alpha-diagnostic.png\nopaque-catalogue-alpha.png\ngetter-source-dark.png\n";
printf("source-type=%d alpha-min=%.1f; opaque-type=%d alpha-min=%.1f\n", $sourceType, min($a), $opaqueType, min($b));
Оба объекта дают 7, но только наклейка имеет alpha меньше 1. У каталога канал активен и полностью непрозрачен. Тип не заменяет проверку значений alpha и пригодности файла. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-alpha-diagnostic.png
opaque-catalogue-alpha.png
getter-source-dark.png
source-type=7 alpha-min=0.0; opaque-type=7 alpha-min=1.0
Imagick::setImageTypeОбязательный int, именованная константа IMGTYPE_*. Метод меняет текущее изображение и возвращает bool-статус.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::setImageType(int $image_type): boolСамая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$gray = clone $image;
$ok = $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);clone создаёт рабочую копию. GRAYSCALEMATTE делает её серой и оставляет alpha данного RGBA. MATTE в исторических именах этих констант означает alpha, а не отдельную краску или обязательно прозрачные пиксели. Для сравнения GRAYSCALE отключает использование alpha: это не наложение на белый фон. Setter возвращает true при успехе, а картинка остаётся в $gray.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.
Полный контракт и границы реализации
Imagick::setImageType(int $image_type): bool| Параметр | Значение |
|---|---|
| $image_type | Обязательный int, именованная константа IMGTYPE_*. Метод меняет текущее изображение и возвращает bool-статус. |
Converts the image to the given type, which combines a color model with the presence or absence of an alpha channel. Depending on the type, this may change the colorspace, quantize the colors, or change whether the image has an alpha channel. Imagick::setImageType modifies the image itself. To set the type that subsequent images are written with instead, use Imagick::setType . Доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns true on success.
| Константа типа | Смысл и граница |
|---|---|
| IMGTYPE_BILEVEL | Два тона; преобразование может нормировать и пороговать значения, отключает alpha. |
| IMGTYPE_GRAYSCALE | Серые значения, использование alpha отключено. |
| IMGTYPE_GRAYSCALEMATTE | Серые значения с alpha; активный канал не означает наличие прозрачных пикселей. |
| IMGTYPE_PALETTE | Палитровая организация; преобразование может уменьшить набор цветов, alpha отключается. |
| IMGTYPE_PALETTEMATTE | Палитра с alpha; квантизация может менять значения, не обещаем точную alpha для любого входа. |
| IMGTYPE_TRUECOLOR | Прямое хранение цветных компонент, использование alpha отключено. Не возвращает потерянные цвета. |
| IMGTYPE_TRUECOLORMATTE | Прямое хранение с alpha; на RGB-входе может создать полностью непрозрачную alpha. |
| IMGTYPE_COLORSEPARATION | Цветоделение CMYK без alpha; это отдельная цветовая модель, не обычный RGB PNG. |
| IMGTYPE_COLORSEPARATIONMATTE | Цветоделение с alpha. CMYK/ICC-печать этим уроком не проверяется. |
Официально IMGTYPE_UNDEFINED и IMGTYPE_OPTIMIZE ничего не преобразуют, но записываются на изображении; getter при этом всё равно не становится прямым чтением этой записи. GRAYSCALE/TRUECOLOR/PALETTE отключают использование alpha. Старые значения alpha могут оставаться в текущем объекте: это не доказательство сохранённой прозрачности при смешивании или записи. Варианты MATTE включают alpha при необходимости; на непрозрачном входе она может быть вся равна 1. Палитровая ветвь выбранной реализации ограничивает набор цветов; для нашего RGB используется не более 256, а фактически 169. TRUECOLOR разворачивает организацию, но не синтезирует потерянные оттенки. На пустом объекте PHP-обёртка бросает ImagickException, внутренний отказ преобразования также превращается в исключение; в исходном XML отдельного раздела ошибок нет, его не выдумываем.
Официальные XML этих трёх методов не содержат исходных примеров и таблиц изменений. Все пояснения, список возвращаемых типов и особые значения сохранены; весь XML открыт ниже. Проверено в PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Именованные IMGTYPE_* переносимее случайных чисел старых версий. Ошибочный PHP-тип может дать TypeError; разрешённый список типов для внешнего ввода — политика приложения, а не гарантированная проверка библиотеки.
Тип хранения PNG: 0 — серый, 2 — RGB, 3 — палитра, 4 — серый+alpha, 6 — RGBA. Эти числа не совпадают с кодами IMGTYPE. RGB PNG type 2 может дополнительно иметь tRNS — прозрачный цветовой ключ; отсутствие отдельного alpha-канала в IHDR не доказывает непрозрачность. Для выбранного непрозрачного фона сначала явно накладываем слой через OVER. Частичную alpha нельзя считать сохранённой только потому, что повторный getter сообщил активную alpha. PNG-кодировщик может автоматически выбрать палитру или серое хранение по данным; сам getImageType не является форматом или прогнозом заголовка.
Весь официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagetype">
<refnamediv>
<refname>Imagick::setImageType</refname>
<refpurpose>Sets the image type</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageType</methodname>
<methodparam><type>int</type><parameter>image_type</parameter></methodparam>
</methodsynopsis>
<simpara>
Converts the image to the given type, which combines a color model with the
presence or absence of an alpha channel.
Depending on the type, this may change the colorspace, quantize the colors,
or change whether the image has an alpha channel.
</simpara>
<simpara>
<methodname>Imagick::setImageType</methodname> modifies the image itself.
To set the type that subsequent images are written with instead, use
<methodname>Imagick::setType</methodname>.
</simpara>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>image_type</parameter></term>
<listitem>
<simpara>
One of the
<link linkend="imagick.constants.imagetype"><constant>imagick::IMGTYPE_<replaceable>*</replaceable></constant></link>
constants. <constant>imagick::IMGTYPE_UNDEFINED</constant> and
<constant>imagick::IMGTYPE_OPTIMIZE</constant> convert nothing, but are
still recorded on the image.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</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 в серую самостоятельную наклейку
GRAYSCALEMATTE преобразует цветные компоненты и сохраняет исходную alpha данного RGBA. Поле converted-type=7 снято уже после подготовки и записи, а read-type=3 — с повторно открытого файла. Серый файл с alpha и RGB/RGBA-просмотр — разные представления одного результата; белая подложка относится только к просмотру.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$gray = clone $source;
if (!$gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE)) { throw new RuntimeException('Gray alpha conversion failed'); }
$gray->setImageFormat('png'); $gray->setImageDepth(8); $gray->setOption('png:bit-depth', '8');
if (!$gray->writeImage(__DIR__ . '/gray-minimal.png')) { throw new RuntimeException('Gray PNG write failed'); }
$read = new Imagick(__DIR__ . '/gray-minimal.png'); $white = typePreview($read, 'white');
saveTypePreview($read, 'gray-minimal-decoded.png', true); saveTypePreview($white, 'gray-minimal-white.png');
saveTypeComparison([$sourceWhite, $white], 'types-gray.png');
echo "types-gray.png\ngray-minimal.png\ngray-minimal-decoded.png\ngray-minimal-white.png\n";
printf("converted-type=%d read-type=%d alpha=%d\n", $gray->getImageType(), $read->getImageType(), (int)$read->getImageAlphaChannel());
GRAYSCALEMATTE преобразует цветные компоненты и сохраняет исходную alpha данного RGBA. Поле converted-type=7 снято уже после подготовки и записи, а read-type=3 — с повторно открытого файла. Серый файл с alpha и RGB/RGBA-просмотр — разные представления одного результата; белая подложка относится только к просмотру. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-gray.png
gray-minimal.png
gray-minimal-decoded.png
gray-minimal-white.png
converted-type=7 read-type=3 alpha=1
Уменьшить набор цветов каталога и увидеть невосстановимую потерю
На этом входе палитра использует 169 цветов; это не обещанные 256 и не число записей PLTE. TRUECOLOR меняет организацию хранения, но не возвращает утраченные оттенки: обе последние панели точны друг другу. PNG-кодировщик снова выбрал палитру и для распакованной копии.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$palette = clone $catalogue; $palette->setImageArtifact('dither', 'false');
if (!$palette->setImageType(Imagick::IMGTYPE_PALETTE)) { throw new RuntimeException('Palette conversion failed'); }
$unpacked = clone $palette;
if (!$unpacked->setImageType(Imagick::IMGTYPE_TRUECOLOR)) { throw new RuntimeException('Truecolor conversion failed'); }
$same = typeRawHash($palette) === typeRawHash($unpacked);
$palette->setImageFormat('png'); $palette->setImageDepth(8); $palette->setOption('png:bit-depth', '8');
$unpacked->setImageFormat('png'); $unpacked->setImageDepth(8); $unpacked->setOption('png:bit-depth', '8');
if (!$palette->writeImage(__DIR__ . '/palette-catalogue.png') || !$unpacked->writeImage(__DIR__ . '/unpacked-catalogue.png')) { throw new RuntimeException('Palette files failed'); }
$a = new Imagick(__DIR__ . '/palette-catalogue.png'); $b = new Imagick(__DIR__ . '/unpacked-catalogue.png');
saveTypePreview($a, 'palette-decoded.png'); saveTypePreview($b, 'unpacked-decoded.png');
saveTypeComparison([$sourceWhite, $catalogue, $a, $b], 'types-palette.png');
echo "types-palette.png\npalette-catalogue.png\nunpacked-catalogue.png\npalette-decoded.png\nunpacked-decoded.png\n";
printf("palette-live=%d unpacked-live=%d colors=%d/%d same-values=%d read=%d/%d\n", $palette->getImageType(), $unpacked->getImageType(), $palette->getImageColors(), $unpacked->getImageColors(), (int)$same, $a->getImageType(), $b->getImageType());
На этом входе палитра использует 169 цветов; это не обещанные 256 и не число записей PLTE. TRUECOLOR меняет организацию хранения, но не возвращает утраченные оттенки: обе последние панели точны друг другу. PNG-кодировщик снова выбрал палитру и для распакованной копии. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-palette.png
palette-catalogue.png
unpacked-catalogue.png
palette-decoded.png
unpacked-decoded.png
palette-live=4 unpacked-live=6 colors=169/169 same-values=1 read=4/4
Imagick::setTypeОбязательный int, именованная константа IMGTYPE_*. Это запрос к последующей записи. В проверенной Reflection имя imgtype, в официальном XML image_type; примеры позиционные.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::setType(int $image_type): boolСамая маленькая запись
RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 — прозрачный, 1 — непрозрачный. Тип изображения объединяет цветовую модель, организацию хранения и режим alpha. Это не тип PHP-переменной и не формат файла. $image — переменная с загруженным изображением; $ начинает имя, = присваивает, -> вызывает метод, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. IMGTYPE_* — целые коды выбора, не проценты и не число бит PNG. IHDR — основной заголовок PNG, PLTE — его таблица цветов; это части файла, а не значения PHP-перечисления.
$ok = $image->setType(Imagick::IMGTYPE_TRUECOLORMATTE);
$image->setImageFormat('png');
$image->writeImage(__DIR__ . '/delivery.png');setType сохраняет настройку этого объекта для записи; setImageFormat выбирает PNG, writeImage записывает байты. __DIR__ — папка программы, . соединяет строки пути, кавычки выделяют текст. У выбранного PNG-кодировщика запрос TRUECOLORMATTE выбирает RGBA-хранение, если его не перекрывает png:color-type. Сам setter не пересчитывает пиксели и не записывает файл. Настройка относится к этому объекту, не ко всем PHP-изображениям.
if проверяет условие, ! означает отрицание, throw new RuntimeException останавливает программу при отказе. echo выводит текст; "\n" — новая строка. printf подставляет %d как целое, %.1f как число с одним знаком после точки. Приведение (int) превращает bool true/false в 1/0. Строгое сравнение === проверяет и значение, и тип. Объекты и файлы: объекты и методы, чтение и запись, исключения.
Полный контракт и границы реализации
Imagick::setType(int $image_type): bool| Параметр | Значение |
|---|---|
| $image_type | Обязательный int, именованная константа IMGTYPE_*. Это запрос к последующей записи. В проверенной Reflection имя imgtype, в официальном XML image_type; примеры позиционные. |
Sets the image type applied to images written subsequently. To convert the current image instead, use Imagick::setImageType . Доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns true on success.
| Константа типа | Смысл и граница |
|---|---|
| IMGTYPE_BILEVEL | Два тона; преобразование может нормировать и пороговать значения, отключает alpha. |
| IMGTYPE_GRAYSCALE | Серые значения, использование alpha отключено. |
| IMGTYPE_GRAYSCALEMATTE | Серые значения с alpha; активный канал не означает наличие прозрачных пикселей. |
| IMGTYPE_PALETTE | Палитровая организация; преобразование может уменьшить набор цветов, alpha отключается. |
| IMGTYPE_PALETTEMATTE | Палитра с alpha; квантизация может менять значения, не обещаем точную alpha для любого входа. |
| IMGTYPE_TRUECOLOR | Прямое хранение цветных компонент, использование alpha отключено. Не возвращает потерянные цвета. |
| IMGTYPE_TRUECOLORMATTE | Прямое хранение с alpha; на RGB-входе может создать полностью непрозрачную alpha. |
| IMGTYPE_COLORSEPARATION | Цветоделение CMYK без alpha; это отдельная цветовая модель, не обычный RGB PNG. |
| IMGTYPE_COLORSEPARATIONMATTE | Цветоделение с alpha. CMYK/ICC-печать этим уроком не проверяется. |
setType меняет запрос последующей записи, сохраняя текущие пиксели. В проверенной сборке работает и без загруженного изображения. PHP-обёртка проверяет статус внутреннего вызова; сам внутренний вызов здесь сохраняет код и возвращает true. Поэтому не обещаем, что любой неизвестный int автоматически отвергается. PNG-потребитель выбирает TRUECOLOR/TRUECOLORMATTE/PALETTE только без более приоритетного png:color-type. Эту настройку нельзя незаметно установить в helper контрольного файла. После реального сохранения и чтения getImageType может измениться: 3 для автоматически выбранного серого хранения с alpha и 7 для записанного RGBA с теми же серыми значениями.
Официальные XML этих трёх методов не содержат исходных примеров и таблиц изменений. Все пояснения, список возвращаемых типов и особые значения сохранены; весь XML открыт ниже. Проверено в PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Именованные IMGTYPE_* переносимее случайных чисел старых версий. Ошибочный PHP-тип может дать TypeError; разрешённый список типов для внешнего ввода — политика приложения, а не гарантированная проверка библиотеки.
Тип хранения PNG: 0 — серый, 2 — RGB, 3 — палитра, 4 — серый+alpha, 6 — RGBA. Эти числа не совпадают с кодами IMGTYPE. RGB PNG type 2 может дополнительно иметь tRNS — прозрачный цветовой ключ; отсутствие отдельного alpha-канала в IHDR не доказывает непрозрачность. Для выбранного непрозрачного фона сначала явно накладываем слой через OVER. Частичную alpha нельзя считать сохранённой только потому, что повторный getter сообщил активную alpha. PNG-кодировщик может автоматически выбрать палитру или серое хранение по данным; сам getImageType не является форматом или прогнозом заголовка.
Весь официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.settype">
<refnamediv>
<refname>Imagick::setType</refname>
<refpurpose>Sets the image type attribute</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::setType</methodname>
<methodparam><type>int</type><parameter>image_type</parameter></methodparam>
</methodsynopsis>
<simpara>
Sets the image type applied to images written subsequently.
To convert the current image instead, use
<methodname>Imagick::setImageType</methodname>.
</simpara>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>image_type</parameter></term>
<listitem>
<simpara>
One of the
<link linkend="imagick.constants.imagetype"><constant>imagick::IMGTYPE_<replaceable>*</replaceable></constant></link>
constants.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&imagick.return.success;
</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-хранение PNG при тех же серых значениях
setType не изменил числовые значения и текущий тип 3. При записи PNG запрос TRUECOLORMATTE дал RGBA-хранение, тогда как обычная запись дала grayscale+alpha. После чтения getter отражает новое представление файла; внешний вид одинаков.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$gray = clone $source; $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
$natural = clone $gray; $natural->setImageFormat('png'); $natural->setImageDepth(8); $natural->setOption('png:bit-depth', '8');
if (!$natural->writeImage(__DIR__ . '/gray-natural.png')) { throw new RuntimeException('Natural write failed'); }
$requested = clone $gray; $before = typeRawHash($requested);
if (!$requested->setType(Imagick::IMGTYPE_TRUECOLORMATTE)) { throw new RuntimeException('Writer setting failed'); }
$same = $before === typeRawHash($requested); $liveType = $requested->getImageType();
$requested->setImageFormat('png'); $requested->setImageDepth(8); $requested->setOption('png:bit-depth', '8');
if (!$requested->writeImage(__DIR__ . '/gray-requested-rgba.png')) { throw new RuntimeException('Requested write failed'); }
$a = new Imagick(__DIR__ . '/gray-natural.png'); $b = new Imagick(__DIR__ . '/gray-requested-rgba.png');
saveTypePreview($a, 'natural-gray-decoded.png', true); saveTypePreview($b, 'requested-rgba-decoded.png', true);
saveTypeComparison([$sourceWhite, typePreview($a, 'white'), typePreview($b, 'white')], 'types-writer-request.png');
echo "types-writer-request.png\ngray-natural.png\ngray-requested-rgba.png\nnatural-gray-decoded.png\nrequested-rgba-decoded.png\n";
printf("live-type=%d setting-numeric-noop=%d natural-read=%d requested-read=%d\n", $liveType, (int)$same, $a->getImageType(), $b->getImageType());
setType не изменил числовые значения и текущий тип 3. При записи PNG запрос TRUECOLORMATTE дал RGBA-хранение, тогда как обычная запись дала grayscale+alpha. После чтения getter отражает новое представление файла; внешний вид одинаков. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-writer-request.png
gray-natural.png
gray-requested-rgba.png
natural-gray-decoded.png
requested-rgba-decoded.png
live-type=3 setting-numeric-noop=1 natural-read=3 requested-read=7
Подготовить непрозрачную доставку и показать приоритет явной настройки PNG
Непрозрачная доставка сначала получает выбранный светлый фон через OVER, затем RGB-хранение. Отдельный контрпример задаёт PNG color-type 2 поверх запроса RGBA: настройка PNG имеет приоритет. RGB-файл сохранил чёрный прозрачный ключ tRNS, но потерял исходные промежуточные alpha; один IHDR не доказывает непрозрачность.
<?php
declare(strict_types=1);
require __DIR__ . '/type-fixture.php';
restoreTypeInputs();
$source = new Imagick(__DIR__ . '/source.png');
$catalogue = new Imagick(__DIR__ . '/catalogue.png');
$sourceWhite = typePreview($source, 'white');
$gray = clone $source; $gray->setImageType(Imagick::IMGTYPE_GRAYSCALEMATTE);
$flat = typePreview($gray, '#e6edf1');
$flat->setType(Imagick::IMGTYPE_TRUECOLOR); $flat->setImageFormat('png'); $flat->setImageDepth(8); $flat->setOption('png:bit-depth', '8');
if (!$flat->writeImage(__DIR__ . '/opaque-delivery.png')) { throw new RuntimeException('Opaque delivery failed'); }
$overridden = clone $gray; $overridden->setType(Imagick::IMGTYPE_TRUECOLORMATTE);
$overridden->setImageFormat('png'); $overridden->setImageDepth(8); $overridden->setOption('png:bit-depth', '8');
$overridden->setOption('png:color-type', '2');
if (!$overridden->writeImage(__DIR__ . '/override-rgb.png')) { throw new RuntimeException('Override write failed'); }
$a = new Imagick(__DIR__ . '/opaque-delivery.png'); $b = new Imagick(__DIR__ . '/override-rgb.png');
$white = typePreview($b, 'white'); $dark = typePreview($b, '#243c4d');
saveTypePreview($a, 'opaque-delivery-decoded.png'); saveTypePreview($b, 'override-decoded.png', true);
saveTypePreview($white, 'override-white.png'); saveTypePreview($dark, 'override-dark.png');
saveTypeComparison([$sourceWhite, $a, $white, $dark], 'types-writer-policy.png');
echo "types-writer-policy.png\nopaque-delivery.png\noverride-rgb.png\nopaque-delivery-decoded.png\noverride-decoded.png\noverride-white.png\noverride-dark.png\n";
printf("flattened-alpha=%d overridden-reload-alpha=%d\n", (int)$a->getImageAlphaChannel(), (int)$b->getImageAlphaChannel());
Непрозрачная доставка сначала получает выбранный светлый фон через OVER, затем RGB-хранение. Отдельный контрпример задаёт PNG color-type 2 поверх запроса RGBA: настройка PNG имеет приоритет. RGB-файл сохранил чёрный прозрачный ключ tRNS, но потерял исходные промежуточные alpha; один IHDR не доказывает непрозрачность. Для запуска нужны example.php, type-fixture.php, source.png.b64 и catalogue.png.b64 в одной папке; сохраните остальные файлы ZIP. Команда php example.php с Imagick/PNG, без сети и шрифтов. Оба входа восстанавливаются из Base64 с проверкой SHA. Выходные PNG создаются программой, не выдаются за входы архива. Helper и все три целевые операции открыты ниже.
Ожидаемый вывод
types-writer-policy.png
opaque-delivery.png
override-rgb.png
opaque-delivery-decoded.png
override-decoded.png
override-white.png
override-dark.png
flattened-alpha=0 overridden-reload-alpha=1
Источники и обсуждения
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


