# Intervention Image: девять практических задач

Intervention Image **4.4.1**, intervention/gif **5.0.1**, PHP **>=8.3**, GD с JPEG/PNG/WebP, mbstring, exif, fileinfo. Bootstrap **5.3.9** локальный. Самостоятельный PHP-проект без Laravel.

Мастерская показывает **сохранённые результаты настоящего PHP/GD**: 9 задач, 24 варианта, Windows/Linux. Изображения реально декодированы, изменены и закодированы. На странице нет загрузки пользовательского файла, PHP runtime или Canvas-обработки. Подложка и масштаб относятся только к просмотру. Скачивайте результат вместе с JSON и PHP-кодом.

## Windows / PowerShell

```powershell
php -v
php --ini
php -m
php -r 'var_export(gd_info());'
composer install --no-interaction --no-plugins --no-scripts
composer check-platform-reqs
php tests/run.php
php bin/build-public.php
New-Item -ItemType Directory -Force output
php bin/convert.php fixtures/card.png output/card.webp card
$LASTEXITCODE # 0
php bin/convert.php fixtures/broken.jpg output/broken.webp card
$LASTEXITCODE # 2: ожидаемый отказ
```

В нужном CLI php.ini включите расширения установленной сборки PHP: gd, mbstring, exif, fileinfo. DLL должны соответствовать версии/архитектуре PHP; не копируйте случайные DLL. php --ini показывает используемый конфиг. Для public нужен HTTP, а не file://. Например локально: php -S 127.0.0.1: 8536 -t public; остановка Ctrl+C. Этот сервер предназначен для разработки.

## Linux / Bash

Пример для Ubuntu24.04 с PHP8.3 из репозиториев:

```bash
sudo apt update
sudo apt install php8.3-cli php8.3-gd php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip unzip
php -v
php -m
composer install --no-interaction --no-plugins --no-scripts
composer check-platform-reqs
php tests/run.php
php bin/build-public.php
mkdir -p output
php bin/convert.php fixtures/card.png output/card.webp card
echo "$?"
```

Пакеты зависят от дистрибутива. Composer устанавливайте по официальной инструкции с проверкой установщика. EXIF/fileinfo могут поставляться вместе с общим пакетом PHP. CLI и PHP-FPM могут читать разные ini. Подробнее docs/LINUX-VPS.md.

Чистый контейнер:

```bash
docker build -t aen-image-lab: 1 .
docker run --rm aen-image-lab: 1
```

Docker base tag может обновляться; фактическая версия записана в JSON. Composer-пакеты фиксирует lock. Проверяются GD/EXIF, не Imagick/libvips.

## CLI для своих изображений

php bin/convert.php INPUT OUTPUT.webp card|thumb|fit

- card: 640×400 cover; часть кадра обрезается.
- thumb: 160×160 cover.
- fit: scaleDown в 1200×1200 с сохранением пропорций.
- Локальный JPEG/PNG/WebP, до 8 MiB и 20 миллионов пикселей по заголовку.
- OUTPUT не перезаписывается. Его родительская папка должна существовать и быть доступна на запись.
- Exit 0: файл создан; exit 2: отказ. Временный файл создаётся в той же директории. Для конкурирующих задач нужны уникальные назначения или внешняя сериализация: это не распределённая блокировка.

Проверка заголовка не заменяет изоляцию декодера, лимиты памяти и timeout. Нет готового HTTP-upload endpoint, авторизации, антивируса или проверки всех форматов. SVG/анимации/CMYK/ICC workflow здесь не демонстрируются.

## Структура и достоверность

scenarios/: девять коротких функций. src/Pipeline.php: manager, ограничение входа, сохранение/измерение файлов. src/Lab.php: фиксированные варианты, обработка ошибок. bin/capture.php windows|linux создаёт запись без тестовой сводки. tests/run.php формирует запись с 167 проверками: геометрия, MIME, alpha, EXIF, выходные файлы, ошибки и 4CLIпроцесса. public/recording-*.json хранит runtime, sourceHashes, размеры/байты/SHA; public/results/windows и linux — отдельные реальные изображения.

SHA проверяет целостность, не является цифровой подписью. Байты разных GD/libjpeg/libwebp могут различаться при той же геометрии. Не обещаем одинаковый SHA между ОС или универсальную экономию WebP.

## Авторские фикстуры

card.png, transparent.png, watermark.png созданы GD, внешних фотографий и личных данных нет. Повторное создание: php bin/create-fixtures.php. Необязательный python bin/create-exif.py требует Pillow и создаёт JPEG Orientation6 из нашей карточки. Готовый файл включён: для PHP-тестов Python не требуется. EXIF не содержит GPS; авторское поле обозначает учебную карточку.

GD при кодировании удаляет EXIF. В опыте ориентации «до» намеренно PNG сырых пикселей: иначе браузер мог бы применить EXIF раньше PHP и скрыть разницу. Исходный JPEG: fixtures/orientation-6.jpg.

Официальные источники: https://image.intervention.io/v4 ; https://image.intervention.io/v4/modifying-images/resizing ; https://image.intervention.io/v4/basics/image-output . Авторские код/фикстуры MIT. Intervention Image, GIF, Bootstrap MIT; полные лицензии в public/THIRD-PARTY-LICENSES.txt.
