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

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

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

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

Глава 371 · После объектов, файлов, циклов, пикселей и alpha

Imagick: PNG Adam7, interlace и реальный кодек

Создать настоящие обычный и Adam7 PNG, увидеть семь наборов выборок и отличить свойство кадра от записи и фактического кодека.

Получить два PNG с одинаковой картинкой и разной схемой

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

Исходник → фактический обычный PNG и фактический Adam7 PNG: одинаковые декодированные пиксели, IHDR interlace 0/1
Исходник → фактический обычный PNG и фактический Adam7 PNG: одинаковые декодированные пиксели, IHDR interlace 0/1
Собственный исходник 400 × 320: нейтральный просмотр RGBA на белом фоне
Собственный исходник 400 × 320: нейтральный просмотр RGBA на белом фоне

Понятия до схемы

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

Три разные вещи: свойство текущего изображения, контекст будущей записи и реально прочитанный файл; enum Imagick отдельно от байтов PNG
Три разные вещи: свойство текущего изображения, контекст будущей записи и реально прочитанный файл; enum Imagick отдельно от байтов PNG

Самая маленькая запись

Растр — сетка пикселей; каждый пиксель имеет 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; белый фон существует только у панели просмотра.

Подготовить два настоящих 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 и служебные данные, а просмотрщик сам решает, когда и как показать промежуточный результат; эти процессы модель не исполняет.

Семь накопительных моделей выборок; 2000 → 4000 → 8000 → 16000 → 32000 → 64000 → 128000 известных позиций
Семь накопительных моделей выборок; 2000 → 4000 → 8000 → 16000 → 32000 → 64000 → 128000 известных позиций
ПроходНачало x,yШаг x,yНовых позиций для 400 × 320
10, 08, 82000
24, 08, 82000
30, 44, 84000
42, 04, 48000
50, 22, 416000
61, 02, 232000
70, 11, 264000

Массив $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 прочитанного источника и проверка реальной доставки по правилу получателя
Getter прочитанного источника и проверка реальной доставки по правилу получателя

Прочитать схему готового изображения одной строкой

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 не изменились.

Проверить вход Adam7 и выдать обычный PNG по договорённости с получателемПример для указанного окружения
<?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 прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.

Current-only не меняет структуру PNG; два явных конфликта current/writer показывают, что читает PNG coder
Current-only не меняет структуру PNG; два явных конфликта current/writer показывают, что читает PNG coder

Увидеть отдельное свойство текущего изображения и границу PNG-записи

Setter успешно присвоил текущему изображению INTERLACE_PNG: getter в памяти вернул 7. Но в этой проверенной цепочке PNG writer использует отдельный контекст записи, поэтому файл имеет IHDR 0, а повторно прочитанный getter — NO. Это конкретное различие стадий, а не утверждение, что метод вообще не работает.

Увидеть отдельное свойство текущего изображения и границу PNG-записиПример для указанного окружения
<?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 их не скрывает.

Разделить свойства кадра и настройку выходного PNG без скрытых подменПример для указанного окружения
<?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 прекращает нашу обработку, если результат нарушает договорённость. Подробнее: объекты и методы, массивы, файлы, ошибки.

COMPRESSION_ZIP прочитанного PNG; JPEG-свойство в памяти не превращает готовый PNG в JPEG
COMPRESSION_ZIP прочитанного PNG; JPEG-свойство в памяти не превращает готовый PNG в JPEG

Узнать кодек прочитанного PNG и не спутать его с форматом или качеством

Формат — PNG, перечисление Imagick сообщает COMPRESSION_ZIP, в этой сборке 20. Это не процент качества. Байтовое поле compression method в PNG IHDR равно 0: оно принадлежит спецификации PNG и не должно совпадать с номером константы Imagick.

Узнать кодек прочитанного PNG и не спутать его с форматом или качествомПример для указанного окружения
<?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-проверка имеет точное ограничение по формату и среде.

Выбрать способ доставки под реальную задачу получателя

Договорённость получателя → явный PNG writer context → запись → новый объект → проверка схемы, кодека, размеров и RGBA
Договорённость получателя → явный PNG writer context → запись → новый объект → проверка схемы, кодека, размеров и RGBA

Упражнение: поставщик присылает 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 не изменились.

Проверить вход Adam7 и выдать обычный PNG по договорённости с получателемПример для указанного окружения
<?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. Это конкретное различие стадий, а не утверждение, что метод вообще не работает.

Увидеть отдельное свойство текущего изображения и границу PNG-записиПример для указанного окружения
<?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 их не скрывает.

Разделить свойства кадра и настройку выходного PNG без скрытых подменПример для указанного окружения
<?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.

Узнать кодек прочитанного PNG и не спутать его с форматом или качествомПример для указанного окружения
<?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
Источники и обсуждения

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

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

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

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