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

Дерево руководства
Глава 371 · После объектов, файлов, циклов, пикселей и alpha
Imagick: PNG Adam7, interlace и реальный кодек
Создать настоящие обычный и Adam7 PNG, увидеть семь наборов выборок и отличить свойство кадра от записи и фактического кодека.
Получить два PNG с одинаковой картинкой и разной схемой
Нужно подготовить PNG-карточку для сайта и понять, что получится при выборе interlace. Сначала получите настоящие normal.png и adam7.png. Картинка и прозрачность в них одинаковы; различается порядок расположения выборок в файле. Ниже показаны полные результаты именно этих сохранённых и повторно прочитанных файлов, а не обещание будущей генерации.


Понятия до схемы
Пиксель — элемент сетки, x растёт вправо, y вниз от верхнего левого угла. RGB задаёт красную, зелёную и синюю компоненты; RGBA добавляет alpha, где 0 — прозрачность, а максимальное значение — непрозрачность. PNG хранит также заголовок и сжатые данные. Interlace отвечает за порядок передачи пространственных выборок, кодек — за сжатое представление, а качество не является ни одним из этих кодов. OVER накладывает прозрачную картинку на выбранный фон только для просмотра.

Самая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$scheme = $image->getImageInterlaceScheme();
echo $scheme;Пустые скобки: аргументов нет. Getter возвращает целый код, у нашего исходника INTERLACE_NO (1). Строгое сравнение $scheme === Imagick::INTERLACE_PNG проверяет нужное значение. Код 7 у PNG в этой сборке не является числом проходов по определению API: это значение перечисления. Метод ничего не записывает и не оценивает скорость загрузки.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.
Важное различие имён до первой полной программы: setImageInterlaceScheme меняет свойство текущего изображения, setInterlaceScheme — контекст записи объекта. В нашем PNG coder именно контекст определяет Adam7. Поэтому в коде видны явные setInterlaceScheme(NO/PNG), а не скрытая настройка в helper. writeImage сохраняет файл, new Imagick затем читает его заново. getImageCompression сообщает ZIP для прочитанного PNG. У трёх новых методов этой главы нет параметра качества.
$output->setInterlaceScheme(Imagick::INTERLACE_PNG);
$output->writeImage(__DIR__ . '/adam7.png');
$read = new Imagick(__DIR__ . '/adam7.png');
echo $read->getImageInterlaceScheme();<?php открывает PHP; declare(strict_types=1) включает строгие типы; require подключает опубликованный helper. prepareInterlacePNG явно задаёт PNG, 8 бит и RGBA, но не interlace. Список [$a, $b] объединяет панели, [] после вызова функции читает элемент массива с именем interlace. interlacePNGHeader читает первые 29 байтов нашего локального PNG для учебной проверки IHDR; это не полноценный валидатор произвольной загрузки. saveInterlaceComparison создаёт белый холст и размещает полные панели в натуральном размере.
Подготовить два настоящих PNG и проверить, что картинка не изменилась
Получены два самостоятельных файла normal.png и adam7.png. На трёх полных панелях рисунок одинаков: interlace меняет порядок кодирования выборок, а не готовые пиксели. Заголовки файлов действительно различаются: 0 и 1. Прозрачное окно сохранено в обоих PNG; белый фон существует только у панели просмотра.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$normal = clone $source; prepareInterlacePNG($normal);
$normal->setInterlaceScheme(Imagick::INTERLACE_NO);
$normal->writeImage(__DIR__ . '/normal.png');
$adam7 = clone $source; prepareInterlacePNG($adam7);
$adam7->setInterlaceScheme(Imagick::INTERLACE_PNG);
$adam7->writeImage(__DIR__ . '/adam7.png');
$readNormal = new Imagick(__DIR__ . '/normal.png');
$readAdam7 = new Imagick(__DIR__ . '/adam7.png');
saveInterlacePNG($sourceWhite, 'source-preview8.png');
saveInterlaceComparison([$sourceWhite, interlacePreview($readNormal), interlacePreview($readAdam7)], 'interlace-first.png');
echo "interlace-first.png\nnormal.png\nadam7.png\nsource-preview8.png\n";
printf("schemes=%d/%d headers=%d/%d codec=%d same-RGBA=%d alpha=%d\n", $readNormal->getImageInterlaceScheme(), $readAdam7->getImageInterlaceScheme(), interlacePNGHeader('normal.png')['interlace'], interlacePNGHeader('adam7.png')['interlace'], $readAdam7->getImageCompression(), (int)(interlacePixelHash($readNormal) === interlacePixelHash($readAdam7)), (int)$readAdam7->getImageAlphaChannel());
Получены два самостоятельных файла normal.png и adam7.png. На трёх полных панелях рисунок одинаков: interlace меняет порядок кодирования выборок, а не готовые пиксели. Заголовки файлов действительно различаются: 0 и 1. Прозрачное окно сохранено в обоих PNG; белый фон существует только у панели просмотра. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-first.png
normal.png
adam7.png
source-preview8.png
schemes=1/7 headers=0/1 codec=20 same-RGBA=1 alpha=1
Понять семь наборов выборок и границы визуальной модели
Adam7 использует семь наборов координат. Модель ниже получает уже полностью декодированный RGBA-массив, затем открывает известные позиции семью проходами. Это способ понять устройство пространственных выборок. Реальное PNG-кодирование включает фильтры, поток zlib и служебные данные, а просмотрщик сам решает, когда и как показать промежуточный результат; эти процессы модель не исполняет.

| Проход | Начало x,y | Шаг x,y | Новых позиций для 400 × 320 |
|---|---|---|---|
| 1 | 0, 0 | 8, 8 | 2000 |
| 2 | 4, 0 | 8, 8 | 2000 |
| 3 | 0, 4 | 4, 8 | 4000 |
| 4 | 2, 0 | 4, 4 | 8000 |
| 5 | 0, 2 | 2, 4 | 16000 |
| 6 | 1, 0 | 2, 2 | 32000 |
| 7 | 0, 1 | 1, 2 | 64000 |
Массив $patterns хранит начало и шаг каждого набора. foreach перебирает семь строк; вложенные for двигаются по координатам; $channel проходит четыре компоненты RGBA. $offset = ($y * $width + $x) * 4 вычисляет начало пикселя в плоском массиве. array_fill создаёт неизвестные прозрачные позиции; exportImagePixels читает компоненты, importImagePixels переносит накопленный массив в новый растр. implode соединяет счётчики для вывода. После седьмого прохода пиксели точно совпадают с источником; это не измерение скорости сети.
Понять семь проходов по координатам, не выдавая модель за загрузку браузера
Это вычисленная модель расположения уже декодированных выборок: неизвестные позиции прозрачны и показаны на белом. Первый проход покрывает 2000 из 128000 пикселей, седьмой — все. Мы не обрывали передачу PNG и не измеряли сетевую отрисовку браузера; белые промежутки не являются обязательным способом показа Adam7 просмотрщиком.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$width = $source->getImageWidth(); $height = $source->getImageHeight();
$pixels = $source->exportImagePixels(0, 0, $width, $height, 'RGBA', Imagick::PIXEL_CHAR);
$known = array_fill(0, $width * $height * 4, 0);
$patterns = [[0,0,8,8], [4,0,8,8], [0,4,4,8], [2,0,4,4], [0,2,2,4], [1,0,2,2], [0,1,1,2]];
$views = []; $covered = 0; $counts = [];
foreach ($patterns as $pass => [$startX, $startY, $stepX, $stepY]) {
for ($y = $startY; $y < $height; $y += $stepY) {
for ($x = $startX; $x < $width; $x += $stepX) {
$offset = ($y * $width + $x) * 4;
for ($channel = 0; $channel < 4; $channel++) { $known[$offset + $channel] = $pixels[$offset + $channel]; }
$covered++;
}
}
$samples = new Imagick(); $samples->newImage($width, $height, 'transparent');
$samples->importImagePixels(0, 0, $width, $height, 'RGBA', Imagick::PIXEL_CHAR, $known);
$view = interlacePreview($samples); $views[] = $view; $counts[] = $covered;
saveInterlacePNG($view, 'pass-' . ($pass + 1) . '.png');
}
saveInterlacePNG($samples, 'pass7-rgba.png', true);
saveInterlaceComparison([$sourceWhite, $views[0], $views[3], $views[6]], 'interlace-model.png');
echo "interlace-model.png\npass-1.png\npass-2.png\npass-3.png\npass-4.png\npass-5.png\npass-6.png\npass-7.png\npass7-rgba.png\n";
printf("covered=%s final-RGBA=%d model-only=1\n", implode(',', $counts), (int)(interlacePixelHash($samples) === interlacePixelHash($source)));
Это вычисленная модель расположения уже декодированных выборок: неизвестные позиции прозрачны и показаны на белом. Первый проход покрывает 2000 из 128000 пикселей, седьмой — все. Мы не обрывали передачу PNG и не измеряли сетевую отрисовку браузера; белые промежутки не являются обязательным способом показа Adam7 просмотрщиком. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-model.png
pass-1.png
pass-2.png
pass-3.png
pass-4.png
pass-5.png
pass-6.png
pass-7.png
pass7-rgba.png
covered=2000,4000,8000,16000,32000,64000,128000 final-RGBA=1 model-only=1
Читать схему файла и проверять политику готового результата
Самая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$scheme = $image->getImageInterlaceScheme();
echo $scheme;Пустые скобки: аргументов нет. Getter возвращает целый код, у нашего исходника INTERLACE_NO (1). Строгое сравнение $scheme === Imagick::INTERLACE_PNG проверяет нужное значение. Код 7 у PNG в этой сборке не является числом проходов по определению API: это значение перечисления. Метод ничего не записывает и не оценивает скорость загрузки.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.

Прочитать схему готового изображения одной строкой
Getter прочитал у входного PNG INTERLACE_NO, в этой сборке целый код 1. Он не изменил растр и не создал файл сам: отдельная запись ниже нужна только для воспроизводимого видимого результата.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$scheme = $source->getImageInterlaceScheme();
saveInterlacePNG($source, 'read-minimal.png', true);
saveInterlaceComparison([$sourceWhite, interlacePreview(new Imagick(__DIR__ . '/read-minimal.png'))], 'interlace-read-minimal.png');
echo "interlace-read-minimal.png\nread-minimal.png\n";
printf("scheme=%d is-NO=%d unchanged-RGBA=%d\n", $scheme, (int)($scheme === Imagick::INTERLACE_NO), (int)(interlacePixelHash($source) === interlacePixelHash(new Imagick(__DIR__ . '/read-minimal.png'))));
Getter прочитал у входного PNG INTERLACE_NO, в этой сборке целый код 1. Он не изменил растр и не создал файл сам: отдельная запись ниже нужна только для воспроизводимого видимого результата. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-read-minimal.png
read-minimal.png
scheme=1 is-NO=1 unchanged-RGBA=1
В следующем сценарии старый приёмник принимает обычный PNG. Мы не объявляем Adam7 плохим: это конкретная договорённость проекта. Вход создаётся самим примером, читается и проверяется; затем копия записывается с явным контекстом NO. Проверка нового объекта защищает от путаницы свойства и файла.
Проверить вход Adam7 и выдать обычный PNG по договорённости с получателем
Для примера вход Adam7 создан здесь же и прочитан с диска. Получатель требует обычный PNG, поэтому отдельно настроен контекст записи INTERLACE_NO. После записи проверен новый объект: getter читает именно результат, а не прежнее намерение. Изображение и alpha не изменились.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$incoming = clone $source; prepareInterlacePNG($incoming);
$incoming->setInterlaceScheme(Imagick::INTERLACE_PNG);
$incoming->writeImage(__DIR__ . '/incoming-adam7.png');
$input = new Imagick(__DIR__ . '/incoming-adam7.png');
$detected = $input->getImageInterlaceScheme();
$delivery = clone $input; prepareInterlacePNG($delivery);
$delivery->setInterlaceScheme(Imagick::INTERLACE_NO);
$delivery->writeImage(__DIR__ . '/delivery-normal.png');
$read = new Imagick(__DIR__ . '/delivery-normal.png');
if ($read->getImageInterlaceScheme() !== Imagick::INTERLACE_NO) { throw new RuntimeException('Delivery policy failed'); }
saveInterlaceComparison([$sourceWhite, interlacePreview($input), interlacePreview($read)], 'interlace-read-policy.png');
echo "interlace-read-policy.png\nincoming-adam7.png\ndelivery-normal.png\n";
printf("input=%d delivery=%d same-RGBA=%d\n", $detected, $read->getImageInterlaceScheme(), (int)(interlacePixelHash($input) === interlacePixelHash($read)));
Для примера вход Adam7 создан здесь же и прочитан с диска. Получатель требует обычный PNG, поэтому отдельно настроен контекст записи INTERLACE_NO. После записи проверен новый объект: getter читает именно результат, а не прежнее намерение. Изображение и alpha не изменились. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-read-policy.png
incoming-adam7.png
delivery-normal.png
input=7 delivery=1 same-RGBA=1
Отличать свойство текущего изображения от контекста PNG writer
Самая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$ok = $image->setImageInterlaceScheme(Imagick::INTERLACE_PNG);
$current = $image->getImageInterlaceScheme();Аргумент задаёт свойство текущего изображения. Возвращается bool-статус, а не новая картинка. В проверенной PNG-цепочке одного setter недостаточно для Adam7-файла: writer читает другой контекст, который явно настраивается $image->setInterlaceScheme(Imagick::INTERLACE_PNG). Эти методы имеют разные имена и обязанности. Сначала прочитайте ниже реальный результат current-only, затем сравнение двух стадий.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.

Увидеть отдельное свойство текущего изображения и границу PNG-записи
Setter успешно присвоил текущему изображению INTERLACE_PNG: getter в памяти вернул 7. Но в этой проверенной цепочке PNG writer использует отдельный контекст записи, поэтому файл имеет IHDR 0, а повторно прочитанный getter — NO. Это конкретное различие стадий, а не утверждение, что метод вообще не работает.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$current = clone $source; prepareInterlacePNG($current);
$ok = $current->setImageInterlaceScheme(Imagick::INTERLACE_PNG);
$live = $current->getImageInterlaceScheme();
$current->writeImage(__DIR__ . '/current-only.png');
$read = new Imagick(__DIR__ . '/current-only.png');
saveInterlaceComparison([$sourceWhite, interlacePreview($read)], 'interlace-current-only.png');
echo "interlace-current-only.png\ncurrent-only.png\n";
printf("ok=%d current=%d header=%d reload=%d same-RGBA=%d\n", (int)$ok, $live, interlacePNGHeader('current-only.png')['interlace'], $read->getImageInterlaceScheme(), (int)(interlacePixelHash($source) === interlacePixelHash($read)));
Setter успешно присвоил текущему изображению INTERLACE_PNG: getter в памяти вернул 7. Но в этой проверенной цепочке PNG writer использует отдельный контекст записи, поэтому файл имеет IHDR 0, а повторно прочитанный getter — NO. Это конкретное различие стадий, а не утверждение, что метод вообще не работает. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-current-only.png
current-only.png
ok=1 current=7 header=0 reload=1 same-RGBA=1
Если обёртка сохранила не тот PNG, не повторяйте setter наугад. Сравните текущее свойство с контекстом будущей записи и прочитанным результатом. Вторая программа специально задаёт несовпадающие значения и показывает оба результата. Это диагностический контролируемый конфликт, а не рекомендуемая запутанная конфигурация приложения.
Разделить свойства кадра и настройку выходного PNG без скрытых подмен
Две явно написанные пары настроек дают противоположные результаты файла. Свойства текущих изображений остаются 1/7, заголовки записаны 1/0, getter после чтения сообщает 7/1. Так можно диагностировать библиотечную обёртку, которая настроила кадр, но не тот параметр writer. Все целевые вызовы видны в программе; helper их не скрывает.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$currentNo = clone $source; prepareInterlacePNG($currentNo);
$currentNo->setImageInterlaceScheme(Imagick::INTERLACE_NO);
$currentNo->setInterlaceScheme(Imagick::INTERLACE_PNG);
$currentNo->writeImage(__DIR__ . '/writer-adam7.png');
$currentPng = clone $source; prepareInterlacePNG($currentPng);
$currentPng->setImageInterlaceScheme(Imagick::INTERLACE_PNG);
$currentPng->setInterlaceScheme(Imagick::INTERLACE_NO);
$currentPng->writeImage(__DIR__ . '/writer-normal.png');
$a = new Imagick(__DIR__ . '/writer-adam7.png'); $b = new Imagick(__DIR__ . '/writer-normal.png');
saveInterlaceComparison([$sourceWhite, interlacePreview($a), interlacePreview($b)], 'interlace-current-writer.png');
echo "interlace-current-writer.png\nwriter-adam7.png\nwriter-normal.png\n";
printf("current=%d/%d headers=%d/%d reload=%d/%d same-RGBA=%d\n", $currentNo->getImageInterlaceScheme(), $currentPng->getImageInterlaceScheme(), interlacePNGHeader('writer-adam7.png')['interlace'], interlacePNGHeader('writer-normal.png')['interlace'], $a->getImageInterlaceScheme(), $b->getImageInterlaceScheme(), (int)(interlacePixelHash($a) === interlacePixelHash($b)));
Две явно написанные пары настроек дают противоположные результаты файла. Свойства текущих изображений остаются 1/7, заголовки записаны 1/0, getter после чтения сообщает 7/1. Так можно диагностировать библиотечную обёртку, которая настроила кадр, но не тот параметр writer. Все целевые вызовы видны в программе; helper их не скрывает. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-current-writer.png
writer-adam7.png
writer-normal.png
current=1/7 headers=1/0 reload=7/1 same-RGBA=1
Проверять реальный тип сжатия отдельно от формата и качества
Самая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$compression = $image->getImageCompression();
echo $compression;Getter не принимает путь и возвращает тип сжатия текущего кадра. Для прочитанного PNG — COMPRESSION_ZIP, здесь 20; для JPEG может быть COMPRESSION_JPEG, но одной этой константой не выбирают расширение файла и не измеряют потери. getImageFormat читает формат отдельно, getImageCompressionQuality — отдельное поле качества. Проверяйте результат после записи новым объектом.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.

Узнать кодек прочитанного PNG и не спутать его с форматом или качеством
Формат — PNG, перечисление Imagick сообщает COMPRESSION_ZIP, в этой сборке 20. Это не процент качества. Байтовое поле compression method в PNG IHDR равно 0: оно принадлежит спецификации PNG и не должно совпадать с номером константы Imagick.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$compression = $source->getImageCompression();
$isZip = $compression === Imagick::COMPRESSION_ZIP;
saveInterlacePNG($source, 'codec-read.png', true);
saveInterlaceComparison([$sourceWhite, interlacePreview(new Imagick(__DIR__ . '/codec-read.png'))], 'interlace-codec-read.png');
echo "interlace-codec-read.png\ncodec-read.png\n";
printf("format=%s compression=%d is-ZIP=%d IHDR-compression=%d\n", $source->getImageFormat(), $compression, (int)$isZip, interlacePNGHeader('codec-read.png')['compression']);
Формат — PNG, перечисление Imagick сообщает COMPRESSION_ZIP, в этой сборке 20. Это не процент качества. Байтовое поле compression method в PNG IHDR равно 0: оно принадлежит спецификации PNG и не должно совпадать с номером константы Imagick. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-codec-read.png
codec-read.png
format=PNG compression=20 is-ZIP=1 IHDR-compression=0
Во второй задаче проверяем конечную доставку. setImageCompression(JPEG) здесь назначен намеренно для обнаружения ошибочного предположения: если формат записи остаётся PNG, поддержка произвольного JPEG-кодека внутри него не появляется. После чтения формат и тип проверены заново. Для настоящего JPEG нужно отдельно выбрать JPEG-формат, обработать отсутствие alpha и оценить потери; это разбирается в связанной главе, а не подразумевается данным PNG-примером.
Проверить кодек самостоятельной доставки вместо доверия настройке в памяти
Для диагностики на PNG-объекте намеренно назначено свойство JPEG. В памяти getter сообщает JPEG (12), но записанный формат остаётся PNG; новый объект читает ZIP (20). Второй файл явно подготовлен как PNG/ZIP с Adam7, затем проверен. Выбор кодека не заменяет проверку готового файла; в этой lossless-цепочке RGBA и прозрачность сохранены.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$configured = clone $source; prepareInterlacePNG($configured);
$configured->setImageCompression(Imagick::COMPRESSION_JPEG);
$requested = $configured->getImageCompression();
$configured->writeImage(__DIR__ . '/configured-as-jpeg.png');
$read = new Imagick(__DIR__ . '/configured-as-jpeg.png');
$checked = clone $read; prepareInterlacePNG($checked);
$checked->setImageCompression(Imagick::COMPRESSION_ZIP);
$checked->setInterlaceScheme(Imagick::INTERLACE_PNG);
$checked->writeImage(__DIR__ . '/delivery-checked.png');
$delivery = new Imagick(__DIR__ . '/delivery-checked.png');
if ($delivery->getImageFormat() !== 'PNG' || $delivery->getImageCompression() !== Imagick::COMPRESSION_ZIP) { throw new RuntimeException('Unexpected delivery codec'); }
saveInterlaceComparison([$sourceWhite, interlacePreview($read), interlacePreview($delivery)], 'interlace-codec-delivery.png');
echo "interlace-codec-delivery.png\nconfigured-as-jpeg.png\ndelivery-checked.png\n";
printf("requested=%d read=%d delivery=%d scheme=%d same-RGBA=%d\n", $requested, $read->getImageCompression(), $delivery->getImageCompression(), $delivery->getImageInterlaceScheme(), (int)(interlacePixelHash($source) === interlacePixelHash($delivery)));
Для диагностики на PNG-объекте намеренно назначено свойство JPEG. В памяти getter сообщает JPEG (12), но записанный формат остаётся PNG; новый объект читает ZIP (20). Второй файл явно подготовлен как PNG/ZIP с Adam7, затем проверен. Выбор кодека не заменяет проверку готового файла; в этой lossless-цепочке RGBA и прозрачность сохранены. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-codec-delivery.png
configured-as-jpeg.png
delivery-checked.png
requested=12 read=20 delivery=20 scheme=7 same-RGBA=1
Разбирать ошибки, неточность XML и границы проверенного результата
| Наблюдение | Что сделать |
|---|---|
| Current getter сообщает PNG, файл IHDR 0 | Проверить отдельный контекст записи. В этой PNG-цепочке setInterlaceScheme(PNG) задаётся явно; current-image setter не подменяет его. |
| Получилось число 7 | Это INTERLACE_PNG в текущей сборке, не универсальная единица измерения. Сравнивайте именованные константы. |
| Обычный и Adam7 выглядят одинаково | После полного декодирования так и должно быть при lossless-записи одного RGBA. Польза/стоимость касается организации файла и поведения получателя. |
| PNG оказался больше | Размер зависит от данных, фильтров, настроек и кодера. Здесь нет гарантии меньшего файла или более быстрого показа. |
| Compression равен 20, IHDR равен 0 | Разные пространства кодов: Imagick COMPRESSION_ZIP и стандартный PNG compression method. Ноль в IHDR не означает «нет сжатия». |
| После назначения JPEG прочитан ZIP | Свойство объекта и фактический PNG coder различаются; проверяйте формат и готовый файл новым объектом. |
| Getter compression пустого объекта вернул 0 | Это UNDEFINED в данной сборке, не успешное чтение и не проверка корректности файла. |
| Массив вместо схемы | Setter ожидает int-константу; TypeError возникает до работы Wand. |
| Анимация или список кадров | Эти методы относятся к текущему изображению. Политика для всех кадров требует отдельного обхода и проверки формата. |
| Браузер не показывает семь состояний | Промежуточная отрисовка зависит от декодера, буферизации и получения данных. Наши семь кадров — явно обозначенная модель, а не обещание браузеру. |
В проверенной PNG-цепочке current-only свойство сменилось 1→7, но PNG сохранился с IHDR 0; явный контекст PNG дал IHDR 1. Два противоположных конфликта показывают ту же границу. Поэтому успех setter и значение getter в памяти проверяют отдельно от структуры записанного файла. На другой версии библиотеки или с другим форматом заново проверьте требуемый путь записи, а не переносите это наблюдение на все coder.
| Вызов на пустом объекте в Imagick 3.8.1 | Фактический результат |
|---|---|
| getImageInterlaceScheme() | ImagickException |
| setImageInterlaceScheme(INTERLACE_PNG) | ImagickException |
| getImageCompression() | int 0, COMPRESSION_UNDEFINED; автоматического PHP-исключения нет |
Проверка сохранённого файла не заменяет безопасную загрузку: лимиты размера/пикселей, доверенный каталог, проверка формата и обработка исключений чтения нужны отдельно. Примеры используют только собственный объявленный локальный источник. PNG lossless сохраняет выбранные декодированные компоненты; это не означает сохранение всех чужих метаданных, ICC-профилей или эквивалентность любых сборок. Цветовая модель и глубина могут меняться в иных цепочках обработки.
Полный helper из каждого архива примера
<?php
declare(strict_types=1);
function restoreInterlaceInput(): void {
$text = file_get_contents(__DIR__ . '/source.png.b64');
if ($text === false) { throw new RuntimeException('Input missing'); }
$bytes = base64_decode($text, true);
if ($bytes === false || hash('sha256', $bytes) !== 'f51e5780445e0f5130a7f23112b2a00618035afd5545b8e3042c7ccff09b617c') { throw new RuntimeException('Input mismatch'); }
if (file_put_contents(__DIR__ . '/source.png', $bytes) === false) { throw new RuntimeException('Restore failed'); }
}
function interlacePreview(Imagick $image, string $background = 'white'): Imagick {
$view = new Imagick(); $view->newImage($image->getImageWidth(), $image->getImageHeight(), $background);
$view->compositeImage($image, Imagick::COMPOSITE_OVER, 0, 0); return $view;
}
function prepareInterlacePNG(Imagick $image, bool $alpha = true): void {
$image->setImageFormat('png'); $image->setImageDepth(8);
$image->setOption('png:bit-depth', '8'); $image->setOption('png:color-type', $alpha ? '6' : '2');
}
function saveInterlacePNG(Imagick $image, string $filename, bool $alpha = false): void {
$copy = clone $image; prepareInterlacePNG($copy, $alpha);
if (!$copy->writeImage(__DIR__ . '/' . $filename)) { throw new RuntimeException('PNG write failed'); }
}
function saveInterlaceComparison(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(); }
saveInterlacePNG($canvas, $filename);
}
function interlacePixelHash(Imagick $image): string {
return hash('sha256', json_encode($image->exportImagePixels(0, 0, $image->getImageWidth(), $image->getImageHeight(), 'RGBA', Imagick::PIXEL_CHAR), JSON_THROW_ON_ERROR));
}
function interlacePNGHeader(string $filename): array {
$bytes = file_get_contents(__DIR__ . '/' . $filename);
if ($bytes === false || substr($bytes, 0, 8) !== "\x89PNG\r\n\x1a\n" || substr($bytes, 12, 4) !== 'IHDR') { throw new RuntimeException('PNG header missing'); }
return unpack('Nwidth/Nheight/Cdepth/Ccolor/Ccompression/Cfilter/Cinterlace', substr($bytes, 16, 13));
}
| Прочитанная реальная проблема | Практический вывод |
|---|---|
| SO 19204666 | Автор загрузчика назначает setImageInterlaceScheme, сохраняет миниатюру, но получатель не видит progressive JPEG. Это реальная причина различать свойство текущего изображения и контекст кодировщика. Наше решение проверяет собственный PNG pipeline, а не объявляет результат JPEG доказанным. |
| SO 39425201 | Одинаковая команда с interlace и quality уменьшает JPEG, но увеличивает PNG. Порядок передачи, формат и способ сжатия имеют разные значения; число quality нельзя переносить между форматами как одинаковый процент. |
| SO 19742548 | Библиотека получателя предупреждает о чересстрочном PNG. Нужен воспроизводимый локальный переход к обычной записи без потери прозрачности и изменения рисунка. |
| SO 42858632 | В Go-binding пользователь хочет progressive и меньший файл, но получает увеличение размера. Общая библиотека не делает порядок проходов, размер и качество одним параметром; синтаксис другого языка не переносим. |
| SO 11755613 | В старом Imagick отсутствует getImageCompression, хотя пользователь ожидает его наличие. Проверяем фактическую версию расширения и текущий официальный контракт >=3.3.0; номер ImageMagick и версия PHP не заменяют номер Imagick. |
| SO 58872439 | При чтении и повторной записи JPEG размер и вид изменяются, несмотря на одинаковое показание качества. Getter описывает определённое состояние, а запись повторно кодирует данные. Наша PNG lossless-проверка имеет точное ограничение по формату и среде. |
Выбрать способ доставки под реальную задачу получателя

Упражнение: поставщик присылает Adam7, старый импортёр требует обычный PNG. Решение — прочитать вход, записать копию с контекстом INTERLACE_NO, затем проверить новый объект и сохранение RGBA. Одно setImageInterlaceScheme(NO) не выдавайте за доказательство структуры выходного PNG. Если цель — сэкономить трафик, дополнительно измерьте реальные байты нескольких вариантов на своих данных; interlace сам по себе такой результат не гарантирует.
Для HTTP-выдачи сначала завершите подготовку файла; затем отдельный обработчик может отправить Content-Type: image/png и readfile с доверенным локальным путём без предшествующего echo. Текст диагностики CLI нельзя отправлять перед бинарным PNG. Подробности: HTTP-запрос и ответ, формат, кодек и качество, alpha и фон, типы пикселей и PNG заголовок, ориентация и подпись пикселей. Методы core setInterlaceScheme/getInterlaceScheme и уже разобранный setImageCompression остаются у своих прежних владельцев справочника.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Imagick::getImageInterlaceSchemeВозвращает int: схему текущего изображения. После чтения PNG это NO либо PNG по реальному IHDR.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::getImageInterlaceScheme(): intСамая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$scheme = $image->getImageInterlaceScheme();
echo $scheme;Пустые скобки: аргументов нет. Getter возвращает целый код, у нашего исходника INTERLACE_NO (1). Строгое сравнение $scheme === Imagick::INTERLACE_PNG проверяет нужное значение. Код 7 у PNG в этой сборке не является числом проходов по определению API: это значение перечисления. Метод ничего не записывает и не оценивает скорость загрузки.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.
Полный официальный контракт
Imagick::getImageInterlaceScheme(): int| Параметр | Смысл |
|---|---|
| Нет аргументов | Возвращает int: схему текущего изображения. После чтения PNG это NO либо PNG по реальному IHDR. |
Доступность по официальному справочнику: PECL imagick 2, PECL imagick 3. Обрабатывается текущее изображение, не автоматически все кадры списка.
Возврат — целый код INTERLACE_*. NO означает отсутствие interlace; UNDEFINED означает неопределённое значение и не равно false. После чтения PNG библиотека получает NO/PNG из заголовка. После ручного setter getter может отражать только текущее свойство: это ещё не доказательство структуры будущего файла.
Ошибки различаются. getImageInterlaceScheme и setImageInterlaceScheme в проверенной Imagick 3.8.1 выбрасывают ImagickException для пустого объекта. Для неверного типа аргумента setter, например массива вместо int, PHP выбрасывает TypeError. getImageCompression у пустого объекта в этой сборке возвращает COMPRESSION_UNDEFINED (0), без автоматического PHP-исключения: это не успешное чтение файла. Ошибка чтения пути должна обрабатываться отдельно. Полная таблица результата пробника приведена в разделе проверок.
Полный исходный XML для сверки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimageinterlacescheme">
<refnamediv>
<refname>Imagick::getImageInterlaceScheme</refname>
<refpurpose>Gets the image interlace scheme</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>int</type><methodname>Imagick::getImageInterlaceScheme</methodname>
<void/>
</methodsynopsis>
<para>
Gets the image interlace scheme.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Returns the interlace scheme as an integer on success.
&imagick.imagickexception.throw;
</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
-->
Прочитать схему готового изображения одной строкой
Getter прочитал у входного PNG INTERLACE_NO, в этой сборке целый код 1. Он не изменил растр и не создал файл сам: отдельная запись ниже нужна только для воспроизводимого видимого результата.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$scheme = $source->getImageInterlaceScheme();
saveInterlacePNG($source, 'read-minimal.png', true);
saveInterlaceComparison([$sourceWhite, interlacePreview(new Imagick(__DIR__ . '/read-minimal.png'))], 'interlace-read-minimal.png');
echo "interlace-read-minimal.png\nread-minimal.png\n";
printf("scheme=%d is-NO=%d unchanged-RGBA=%d\n", $scheme, (int)($scheme === Imagick::INTERLACE_NO), (int)(interlacePixelHash($source) === interlacePixelHash(new Imagick(__DIR__ . '/read-minimal.png'))));
Getter прочитал у входного PNG INTERLACE_NO, в этой сборке целый код 1. Он не изменил растр и не создал файл сам: отдельная запись ниже нужна только для воспроизводимого видимого результата. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-read-minimal.png
read-minimal.png
scheme=1 is-NO=1 unchanged-RGBA=1
Проверить вход Adam7 и выдать обычный PNG по договорённости с получателем
Для примера вход Adam7 создан здесь же и прочитан с диска. Получатель требует обычный PNG, поэтому отдельно настроен контекст записи INTERLACE_NO. После записи проверен новый объект: getter читает именно результат, а не прежнее намерение. Изображение и alpha не изменились.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$incoming = clone $source; prepareInterlacePNG($incoming);
$incoming->setInterlaceScheme(Imagick::INTERLACE_PNG);
$incoming->writeImage(__DIR__ . '/incoming-adam7.png');
$input = new Imagick(__DIR__ . '/incoming-adam7.png');
$detected = $input->getImageInterlaceScheme();
$delivery = clone $input; prepareInterlacePNG($delivery);
$delivery->setInterlaceScheme(Imagick::INTERLACE_NO);
$delivery->writeImage(__DIR__ . '/delivery-normal.png');
$read = new Imagick(__DIR__ . '/delivery-normal.png');
if ($read->getImageInterlaceScheme() !== Imagick::INTERLACE_NO) { throw new RuntimeException('Delivery policy failed'); }
saveInterlaceComparison([$sourceWhite, interlacePreview($input), interlacePreview($read)], 'interlace-read-policy.png');
echo "interlace-read-policy.png\nincoming-adam7.png\ndelivery-normal.png\n";
printf("input=%d delivery=%d same-RGBA=%d\n", $detected, $read->getImageInterlaceScheme(), (int)(interlacePixelHash($input) === interlacePixelHash($read)));
Для примера вход Adam7 создан здесь же и прочитан с диска. Получатель требует обычный PNG, поэтому отдельно настроен контекст записи INTERLACE_NO. После записи проверен новый объект: getter читает именно результат, а не прежнее намерение. Изображение и alpha не изменились. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-read-policy.png
incoming-adam7.png
delivery-normal.png
input=7 delivery=1 same-RGBA=1
Imagick::setImageInterlaceSchemeОбязательная именованная константа INTERLACE_*. Возвращает true при успехе; меняет свойство текущего изображения, не растр. Для проверяемого PNG writer отдельно задаётся контекст setInterlaceScheme.
PECL imagick 2, PECL imagick 3 · imagick
Imagick::setImageInterlaceScheme(int $interlace_scheme): boolСамая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$ok = $image->setImageInterlaceScheme(Imagick::INTERLACE_PNG);
$current = $image->getImageInterlaceScheme();Аргумент задаёт свойство текущего изображения. Возвращается bool-статус, а не новая картинка. В проверенной PNG-цепочке одного setter недостаточно для Adam7-файла: writer читает другой контекст, который явно настраивается $image->setInterlaceScheme(Imagick::INTERLACE_PNG). Эти методы имеют разные имена и обязанности. Сначала прочитайте ниже реальный результат current-only, затем сравнение двух стадий.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.
Полный официальный контракт
Imagick::setImageInterlaceScheme(int $interlace_scheme): bool| Параметр | Смысл |
|---|---|
| $interlace_scheme: int | Обязательная именованная константа INTERLACE_*. Возвращает true при успехе; меняет свойство текущего изображения, не растр. Для проверяемого PNG writer отдельно задаётся контекст setInterlaceScheme. |
Доступность по официальному справочнику: PECL imagick 2, PECL imagick 3. Обрабатывается текущее изображение, не автоматически все кадры списка.
Неточность официального XML: заголовок и описание говорят «Sets the image compression». Исходник Imagick 3.8.1 вызывает MagickSetImageInterlaceScheme, который присваивает interlace текущему изображению. Это схема расположения выборок, а не тип сжатия; полная исходная формулировка сохранена ниже для сверки. В XML параметр называется $interlace_scheme, в stub/Reflection этой сборки — $interlace: примеры передают его по позиции, чтобы не зависеть от этого расхождения.
Разумный выбор здесь — INTERLACE_NO или INTERLACE_PNG. Другие константы семейства, включая LINE, PLANE, PARTITION, GIF и JPEG, относятся к форматам и организациям данных; одинаковое целое значение не означает одинаковый результат у всех coder. Метод не проверяет нашу прикладную политику по списку разрешённых значений. Передавайте именованную подходящую константу, а не произвольное число. Для PNG результат подтверждайте заголовком и повторным чтением.
Ошибки различаются. getImageInterlaceScheme и setImageInterlaceScheme в проверенной Imagick 3.8.1 выбрасывают ImagickException для пустого объекта. Для неверного типа аргумента setter, например массива вместо int, PHP выбрасывает TypeError. getImageCompression у пустого объекта в этой сборке возвращает COMPRESSION_UNDEFINED (0), без автоматического PHP-исключения: это не успешное чтение файла. Ошибка чтения пути должна обрабатываться отдельно. Полная таблица результата пробника приведена в разделе проверок.
Полный исходный XML для сверки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageinterlacescheme">
<refnamediv>
<refname>Imagick::setImageInterlaceScheme</refname>
<refpurpose>Sets the image compression</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageInterlaceScheme</methodname>
<methodparam><type>int</type><parameter>interlace_scheme</parameter></methodparam>
</methodsynopsis>
<para>
Sets the image compression.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>interlace_scheme</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>
</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
-->
Увидеть отдельное свойство текущего изображения и границу PNG-записи
Setter успешно присвоил текущему изображению INTERLACE_PNG: getter в памяти вернул 7. Но в этой проверенной цепочке PNG writer использует отдельный контекст записи, поэтому файл имеет IHDR 0, а повторно прочитанный getter — NO. Это конкретное различие стадий, а не утверждение, что метод вообще не работает.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$current = clone $source; prepareInterlacePNG($current);
$ok = $current->setImageInterlaceScheme(Imagick::INTERLACE_PNG);
$live = $current->getImageInterlaceScheme();
$current->writeImage(__DIR__ . '/current-only.png');
$read = new Imagick(__DIR__ . '/current-only.png');
saveInterlaceComparison([$sourceWhite, interlacePreview($read)], 'interlace-current-only.png');
echo "interlace-current-only.png\ncurrent-only.png\n";
printf("ok=%d current=%d header=%d reload=%d same-RGBA=%d\n", (int)$ok, $live, interlacePNGHeader('current-only.png')['interlace'], $read->getImageInterlaceScheme(), (int)(interlacePixelHash($source) === interlacePixelHash($read)));
Setter успешно присвоил текущему изображению INTERLACE_PNG: getter в памяти вернул 7. Но в этой проверенной цепочке PNG writer использует отдельный контекст записи, поэтому файл имеет IHDR 0, а повторно прочитанный getter — NO. Это конкретное различие стадий, а не утверждение, что метод вообще не работает. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-current-only.png
current-only.png
ok=1 current=7 header=0 reload=1 same-RGBA=1
Разделить свойства кадра и настройку выходного PNG без скрытых подмен
Две явно написанные пары настроек дают противоположные результаты файла. Свойства текущих изображений остаются 1/7, заголовки записаны 1/0, getter после чтения сообщает 7/1. Так можно диагностировать библиотечную обёртку, которая настроила кадр, но не тот параметр writer. Все целевые вызовы видны в программе; helper их не скрывает.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$currentNo = clone $source; prepareInterlacePNG($currentNo);
$currentNo->setImageInterlaceScheme(Imagick::INTERLACE_NO);
$currentNo->setInterlaceScheme(Imagick::INTERLACE_PNG);
$currentNo->writeImage(__DIR__ . '/writer-adam7.png');
$currentPng = clone $source; prepareInterlacePNG($currentPng);
$currentPng->setImageInterlaceScheme(Imagick::INTERLACE_PNG);
$currentPng->setInterlaceScheme(Imagick::INTERLACE_NO);
$currentPng->writeImage(__DIR__ . '/writer-normal.png');
$a = new Imagick(__DIR__ . '/writer-adam7.png'); $b = new Imagick(__DIR__ . '/writer-normal.png');
saveInterlaceComparison([$sourceWhite, interlacePreview($a), interlacePreview($b)], 'interlace-current-writer.png');
echo "interlace-current-writer.png\nwriter-adam7.png\nwriter-normal.png\n";
printf("current=%d/%d headers=%d/%d reload=%d/%d same-RGBA=%d\n", $currentNo->getImageInterlaceScheme(), $currentPng->getImageInterlaceScheme(), interlacePNGHeader('writer-adam7.png')['interlace'], interlacePNGHeader('writer-normal.png')['interlace'], $a->getImageInterlaceScheme(), $b->getImageInterlaceScheme(), (int)(interlacePixelHash($a) === interlacePixelHash($b)));
Две явно написанные пары настроек дают противоположные результаты файла. Свойства текущих изображений остаются 1/7, заголовки записаны 1/0, getter после чтения сообщает 7/1. Так можно диагностировать библиотечную обёртку, которая настроила кадр, но не тот параметр writer. Все целевые вызовы видны в программе; helper их не скрывает. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-current-writer.png
writer-adam7.png
writer-normal.png
current=1/7 headers=1/0 reload=7/1 same-RGBA=1
Imagick::getImageCompressionВозвращает int — константу типа сжатия текущего изображения; не формат, не размер, не качество. После чтения нашего PNG — COMPRESSION_ZIP.
PECL imagick 3 >= 3.3.0 · imagick
Imagick::getImageCompression(): intСамая маленькая запись
Растр — сетка пикселей; каждый пиксель имеет RGB-компоненты и, у нашего входа, alpha. Alpha показывает прозрачность. $image — переменная с объектом изображения; $ начинает имя, = присваивает значение, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: обращается к именованной константе класса. Номер константы — код выбора, а не процент или число проходов.
$compression = $image->getImageCompression();
echo $compression;Getter не принимает путь и возвращает тип сжатия текущего кадра. Для прочитанного PNG — COMPRESSION_ZIP, здесь 20; для JPEG может быть COMPRESSION_JPEG, но одной этой константой не выбирают расширение файла и не измеряют потери. getImageFormat читает формат отдельно, getImageCompressionQuality — отдельное поле качества. Проверяйте результат после записи новым объектом.
В программах clone создаёт независимую рабочую копию, new Imagick($path) читает файл, __DIR__ — папка программы, . соединяет строки пути. echo выводит текст; printf подставляет %d как целое число, %s как строку, "\n" завершает строку. === сравнивает значение и тип, !== означает строгое неравенство, || — хотя бы одно условие; (int) показывает bool как 1/0. if с throw new RuntimeException прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.
Полный официальный контракт
Imagick::getImageCompression(): int| Параметр | Смысл |
|---|---|
| Нет аргументов | Возвращает int — константу типа сжатия текущего изображения; не формат, не размер, не качество. После чтения нашего PNG — COMPRESSION_ZIP. |
Доступность по официальному справочнику: PECL imagick 3 >= 3.3.0. Обрабатывается текущее изображение, не автоматически все кадры списка.
Возврат — константа COMPRESSION_*. Код зависит от перечисления библиотеки; сравнивайте с Imagick::COMPRESSION_ZIP, а не с числом 20 в рабочем условии. В PNG встроенное поле IHDR compression method 0 означает определённый спецификацией способ zlib/deflate и не является COMPRESSION_UNDEFINED. Качество, размер, степень сжатия и тип контейнера — разные характеристики. Getter не доказывает отсутствие потерь и не валидирует формат входа.
Ошибки различаются. getImageInterlaceScheme и setImageInterlaceScheme в проверенной Imagick 3.8.1 выбрасывают ImagickException для пустого объекта. Для неверного типа аргумента setter, например массива вместо int, PHP выбрасывает TypeError. getImageCompression у пустого объекта в этой сборке возвращает COMPRESSION_UNDEFINED (0), без автоматического PHP-исключения: это не успешное чтение файла. Ошибка чтения пути должна обрабатываться отдельно. Полная таблица результата пробника приведена в разделе проверок.
Полный исходный XML для сверки
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagecompression">
<refnamediv>
<refname>Imagick::getImageCompression</refname>
<refpurpose>Gets the current image's compression type</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<modifier>public</modifier> <type>int</type><methodname>Imagick::getImageCompression</methodname>
<void/>
</methodsynopsis>
<para>
Gets the current image's compression type.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
&no.function.parameters;
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Returns the compression constant
</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
-->
Узнать кодек прочитанного PNG и не спутать его с форматом или качеством
Формат — PNG, перечисление Imagick сообщает COMPRESSION_ZIP, в этой сборке 20. Это не процент качества. Байтовое поле compression method в PNG IHDR равно 0: оно принадлежит спецификации PNG и не должно совпадать с номером константы Imagick.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$compression = $source->getImageCompression();
$isZip = $compression === Imagick::COMPRESSION_ZIP;
saveInterlacePNG($source, 'codec-read.png', true);
saveInterlaceComparison([$sourceWhite, interlacePreview(new Imagick(__DIR__ . '/codec-read.png'))], 'interlace-codec-read.png');
echo "interlace-codec-read.png\ncodec-read.png\n";
printf("format=%s compression=%d is-ZIP=%d IHDR-compression=%d\n", $source->getImageFormat(), $compression, (int)$isZip, interlacePNGHeader('codec-read.png')['compression']);
Формат — PNG, перечисление Imagick сообщает COMPRESSION_ZIP, в этой сборке 20. Это не процент качества. Байтовое поле compression method в PNG IHDR равно 0: оно принадлежит спецификации PNG и не должно совпадать с номером константы Imagick. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-codec-read.png
codec-read.png
format=PNG compression=20 is-ZIP=1 IHDR-compression=0
Проверить кодек самостоятельной доставки вместо доверия настройке в памяти
Для диагностики на PNG-объекте намеренно назначено свойство JPEG. В памяти getter сообщает JPEG (12), но записанный формат остаётся PNG; новый объект читает ZIP (20). Второй файл явно подготовлен как PNG/ZIP с Adam7, затем проверен. Выбор кодека не заменяет проверку готового файла; в этой lossless-цепочке RGBA и прозрачность сохранены.
<?php
declare(strict_types=1);
require __DIR__ . '/interlace-fixture.php';
restoreInterlaceInput();
$source = new Imagick(__DIR__ . '/source.png');
$sourceWhite = interlacePreview($source);
$configured = clone $source; prepareInterlacePNG($configured);
$configured->setImageCompression(Imagick::COMPRESSION_JPEG);
$requested = $configured->getImageCompression();
$configured->writeImage(__DIR__ . '/configured-as-jpeg.png');
$read = new Imagick(__DIR__ . '/configured-as-jpeg.png');
$checked = clone $read; prepareInterlacePNG($checked);
$checked->setImageCompression(Imagick::COMPRESSION_ZIP);
$checked->setInterlaceScheme(Imagick::INTERLACE_PNG);
$checked->writeImage(__DIR__ . '/delivery-checked.png');
$delivery = new Imagick(__DIR__ . '/delivery-checked.png');
if ($delivery->getImageFormat() !== 'PNG' || $delivery->getImageCompression() !== Imagick::COMPRESSION_ZIP) { throw new RuntimeException('Unexpected delivery codec'); }
saveInterlaceComparison([$sourceWhite, interlacePreview($read), interlacePreview($delivery)], 'interlace-codec-delivery.png');
echo "interlace-codec-delivery.png\nconfigured-as-jpeg.png\ndelivery-checked.png\n";
printf("requested=%d read=%d delivery=%d scheme=%d same-RGBA=%d\n", $requested, $read->getImageCompression(), $delivery->getImageCompression(), $delivery->getImageInterlaceScheme(), (int)(interlacePixelHash($source) === interlacePixelHash($delivery)));
Для диагностики на PNG-объекте намеренно назначено свойство JPEG. В памяти getter сообщает JPEG (12), но записанный формат остаётся PNG; новый объект читает ZIP (20). Второй файл явно подготовлен как PNG/ZIP с Adam7, затем проверен. Выбор кодека не заменяет проверку готового файла; в этой lossless-цепочке RGBA и прозрачность сохранены. Сохраните example.php, source.png.b64 и interlace-fixture.php из архива в одной папке. Запустите php example.php с расширением Imagick и PNG coder. Собственный исходник восстанавливается из Base64 с SHA-проверкой. Helper целиком опубликован ниже; он не вызывает ни setImageInterlaceScheme, ни setInterlaceScheme и не подменяет настройку записи.
Ожидаемый вывод
interlace-codec-delivery.png
configured-as-jpeg.png
delivery-checked.png
requested=12 read=20 delivery=20 scheme=7 same-RGBA=1
Источники и обсуждения
- Imagick::getImageCompression
- Imagick::getImageInterlaceScheme
- Imagick::setImageInterlaceScheme
- Imagick 3.8.1 imagick_class.c
- Imagick 3.8.1 imagick_helpers.c
- ImageMagick 7.1.1-46 MagickWand/magick-image.c
- ImageMagick 7.1.1-46 MagickWand/magick-property.c
- ImageMagick 7.1.1-46 MagickCore/constitute.c
- ImageMagick 7.1.1-46 coders/png.c
- PNG Specification: interlaced data order
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


