Александр Некрасов · Автономное руководство

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

Разделы этой страницы
  1. GD: создаём картинки, превью и водяные знаки — практика и полный справочник
  2. Сделаем картинку, которую можно сохранить и показать на сайте
  3. Шаг 1. Четыре действия — и у нас есть синий PNG
  4. Шаг 2. Добавим читаемую подпись
  5. Шаг 3. Сделаем рисунок управляемым
  6. Попробуйте: цвет, надпись и размер → свой PNG
  7. Работающий генератор: форма отправляет параметры, PHP возвращает PNG
  8. Теперь нужен исходник: нарисуем карточку чашки
  9. Обрезка: оставим чашку и уберём нижнюю подпись
  10. Масштаб: маленькое превью без растяжения
  11. Фильтр: серая версия для товара вне наличия
  12. Водяной знак: сначала отдельная подпись, потом наложение
  13. В браузере пусто: найдём неисправный шаг
  14. Установка, кодеки и разница CLI/FPM
  15. Настройки ошибок JPEG и памяти
  16. GdImage и GdFont: непрозрачные объекты и старые ресурсы
  17. Выбрать путь под реальную задачу
  18. Все константы: форматы, цвета, ядра и режимы
  19. Почему порядок масштаба и переноса меняет результат
  20. Приём изображений: что проверяет каждый шаг
  21. Готовый PNG-ответ и место ob_start
  22. Практика: PNG-логотип с мягкой прозрачностью поверх фото
  23. Практика: общая прозрачность непрозрачной плашки
  24. Стоимость операций: как не превратить превью в долгий запрос
  25. Обсуждения: от повреждённого HTTP-ответа до прозрачности
  26. Справочник GD: 117 функций по категориям
  27. Учебный маршрут: от значка к обработчику превью
  28. Функции и методы этой темы
  29. Код и руководство с собой
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 134 · От первого пикселя к полному API

GD: создаём картинки, превью и водяные знаки — практика и полный справочник

Все функции, два класса и константы GD: создание, цвета и прозрачность, фигуры, шрифты, преобразования, кодеки, IPTC и границы безопасной обработки.

Сделаем картинку, которую можно сохранить и показать на сайте

Пусть для каталога нужна плашка «новая коллекция»: цветной фон, подпись и круглый акцент. В графическом редакторе её можно нарисовать вручную. GD позволяет описать тот же рисунок в PHP и получать новые файлы при изменении надписи, цвета и размеров. Ниже сначала готовый результат, затем четыре небольших шага, которые его собирают.

Что мы соберём: плашка для каталога240 × 100 пикселей
Что мы соберём: плашка для каталогаСкачать PNG

Дальше обработаем узнаваемую карточку товара: обрежем поля, уменьшим, получим серую версию и поставим полупрозрачную подпись. Исходник и результат каждого действия видны рядом; PNG и код можно скачать. Для мелких учебных холстов показано увеличение: сами файлы сохраняют настоящие размеры.

От PHP к видимой картинке
  1. $image: сетка 240 × 100 цветных точек в памяти PHP
  2. imagefill и imagestring: меняют точки этой сетки
  3. imagepng($image, "badge.png"): сохраняет сетку в PNG-файл
  4. Браузер открывает badge.png или показывает его через <img>

Пиксель — одна маленькая цветная точка изображения. Холст похож на лист в клетку, но размер задаётся числом пикселей, а не сантиметрами. Объект GdImage — рабочее изображение в памяти; файл PNG — сохранённый результат. PHP не отправляет картинку браузеру только от того, что вы создали $image.

Для запуска нужен установленный PHP с расширением GD. Как проверить и включить GD. Создайте отдельную папку gd-lesson, сохраните код как example.php и запустите в этой папке php example.php. Файл badge.png появится рядом; откройте его двойным щелчком. На сервере у PHP должны быть права записи в выбранный каталог. Для первых шагов веб-сервер не требуется.

Блок кода включает <?php — начало PHP — и declare(strict_types=1);, который включает строгую проверку передаваемых типов. Сохраните обе строки. Для первого рисунка важнее следующие четыре действия; строгие типы подробно разбираются в главе о значениях и типах.

Шаг 1. Четыре действия — и у нас есть синий PNG

Начнём с прямоугольной основы будущей плашки. Здесь 240 пикселей по горизонтали и 100 по вертикали. На белой странице сразу видно, появился ли файл правильного цвета и размера.

Сохранить синюю основуСамостоятельный пример
Результат240 × 100 пикселей
Сохранить синюю основу: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 100);
$blue = imagecolorallocate($image, 25, 105, 175);
imagefill($image, 0, 0, $blue);
imagepng($image, "badge.png");
Текстовая проверка результата

Текст в консоли не появляется: полезный результат — файл badge.png. Картинка выше получена из этого кода. Откройте файл: должен быть синий прямоугольник без надписи.

СтрокаЧто именно происходит
$image = imagecreatetruecolor(240, 100);Знак $ начинает имя переменной; = сохраняет результат справа под именем слева. imagecreatetruecolor — имя готового инструмента, функции. В круглых скобках её аргументы: сначала ширина 240, затем высота 100. Запятая разделяет аргументы. Точка с запятой завершает команду. Полученный холст пока чёрный.
$blue = imagecolorallocate($image, 25, 105, 175);Создаём обозначение цвета для этого холста и сохраняем его в $blue. После холста переданы три компонента: красная 25, зелёная 105, синяя 175. Каждая от 0 до 255. Выбор цвета ещё ничего не закрашивает.
imagefill($image, 0, 0, $blue);Закрашиваем одноцветную область, начиная с точки x=0, y=0. Это верхний левый угол. У нового пустого холста область занимает весь прямоугольник. Последний аргумент указывает подготовленный синий цвет.
imagepng($image, "badge.png");Кодируем пиксели в PNG и записываем файл с указанным именем. Кавычки обозначают строку, то есть текст имени. Имя файла и переменная $image — разные вещи.

Проверьте себя: замените 240, 100 на 120, 100. Плашка станет вдвое уже, но не вдвое меньше по обеим осям. Затем верните ширину и замените компоненты цвета на 160, 65, 40: изменится цвет, размеры останутся прежними. Если файла нет, смотрите ошибку запуска и права каталога; пустая консоль сама по себе ошибкой не является.

Ссылки для справки: imagecreatetruecolor, imagecolorallocate, imagefill, imagepng.

Шаг 2. Добавим читаемую подпись

Чтобы картинка сообщала что-то человеку, добавим слова NEW COLLECTION. Теперь нужен второй цвет и одна новая операция — рисование строки. Фон мы уже умеем получать. Подпись рисуем до сохранения, иначе в файле останется только фон.

Добавить надпись к той же основеСамостоятельный пример
Результат240 × 100 пикселей
Добавить надпись к той же основе: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 100);
$blue = imagecolorallocate($image, 25, 105, 175);
imagefill($image, 0, 0, $blue);
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 5, 20, 42, "NEW COLLECTION", $white);
imagepng($image, "badge.png");
Текстовая проверка результата

Встроенный шрифт позволяет начать без загрузки отдельного файла. Это латинская подпись; как рисовать русские слова масштабируемым шрифтом, объясняется в карточке imagettftext. Для текста интерфейса сайта обычно удобнее HTML, а растровая надпись нужна именно в скачиваемой картинке.

Аргумент imagestringЗначение в нашем рисунке
$imageИзображение, которое меняем.
5Номер самого крупного из пяти встроенных шрифтов; это не пять пикселей и не размер CSS.
20, 42Положение верхнего левого угла текста: 20 пикселей от левого края, 42 от верхнего. x растёт вправо, y вниз. У холста 240 × 100 последняя точка имеет координаты 239, 99.
"NEW COLLECTION"Содержимое строки. Переносы и подгонка длинных строк здесь не выполняются автоматически.
$whiteЦвет букв, подготовленный из трёх компонентов 255, 255, 255.

Измените x с 20 на 60: текст сдвинется вправо. Если он перестал помещаться, верните отступ, сократите текст или увеличьте холст. GD рисует пиксели и не знает о CSS-блоках, переносах и доступности. imagestring и imagettftext показывают оба способа работы со шрифтом.

Шаг 3. Сделаем рисунок управляемым

Предположим, дизайнер просит один и тот же макет для NEW и SALE, а круг иногда должен быть крупнее. Вынесем изменяемые значения в начало программы: $label хранит слово, $radius — радиус круга. Радиус — расстояние от центра до края; функция рисования принимает полный диаметр, поэтому передаём $radius * 2. Звёздочка означает умножение.

Подпись и размер круга задаются в началеСамостоятельный пример
Результат240 × 100 пикселей
Подпись и размер круга задаются в начале: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$label = "NEW";
$radius = 18;
$image = imagecreatetruecolor(240, 100);
$background = imagecolorallocate($image, 25, 105, 175);
$white = imagecolorallocate($image, 255, 255, 255);
$accent = imagecolorallocate($image, 255, 210, 75);
imagefill($image, 0, 0, $background);
imagefilledellipse($image, 195, 50, $radius * 2, $radius * 2, $accent);
imagestring($image, 5, 20, 42, $label, $white);
imagepng($image, "badge.png");
echo "badge.png\n";
Текстовая проверка результата
badge.png

imagefilledellipse($image, 195, 50, $radius * 2, $radius * 2, $accent): холст, центр x/y, полная ширина/высота эллипса и цвет. Равные ширина и высота дают круг. С радиусом 18 получаем диаметр 36; радиус 28 даст 56. echo только сообщает имя уже записанного файла.

Новая операция imagefilledellipse добавляет жёлтый круг поверх синего фона. Меняется тот же холст; функция не создаёт второй PNG. Порядок имеет значение: если закрасить фон после круга и текста, вы закроете уже нарисованное.

Следующий блок позволяет менять три настройки и сразу сравнивать изображения. Это заранее выполненные варианты того же PHP, а не имитация рисунка средствами CSS. У каждого варианта доступны его точный код и PNG; работающий серверный генератор с формой будет следующим шагом.

Попробуйте: цвет, надпись и размер → свой PNG

Цвет фона
Надпись
Радиус круга

Синий фон · NEW · радиус 18 пикселей

NEW: синий фон, радиус 18Самостоятельный пример
Результат240 × 100 пикселей
NEW: синий фон, радиус 18: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$label = "NEW";
$radius = 18;
$image = imagecreatetruecolor(240, 100);
$background = imagecolorallocate($image, 25, 105, 175);
$white = imagecolorallocate($image, 255, 255, 255);
$accent = imagecolorallocate($image, 255, 210, 75);
imagefill($image, 0, 0, $background);
imagefilledellipse($image, 195, 50, $radius * 2, $radius * 2, $accent);
imagestring($image, 5, 20, 42, $label, $white);
imagepng($image, "badge.png");
echo "badge.png\n";
Текстовая проверка результата
badge.png

Сравните круг и текст с предыдущим выбором. В коде изменяются только $label, $radius и три компонента фонового цвета; остальные действия сохраняют смысл.

Упражнение: сделайте плашку SALE с терракотовым фоном и кругом диаметром 56 пикселей. Решение: $label = "SALE";, $radius = 28;, цвет фона 160, 65, 40. Затем добавьте ещё один собственный цвет. Сохраните результат под другим именем, если нужен и старый вариант.

Работающий генератор: форма отправляет параметры, PHP возвращает PNG

Теперь те же значения выберет посетитель. Скачайте архив этого примера, распакуйте в отдельную папку и выполните там php -S 127.0.0.1:8080. Откройте http://127.0.0.1:8080/index.html, поменяйте настройки и нажмите «Создать PNG». Файл index.html содержит форму, example.php — обработчик изображения. Встроенный сервер нужен для локального обучения; остановка — Ctrl+C.

Какие данные проходят через генератор
  1. Форма: theme=clay, label=SALE, radius=28
  2. GET-запрос: example.php?theme=clay&label=SALE&radius=28
  3. PHP проверяет три значения, затем рисует привычный холст
  4. Content-Type: image/png + один поток PNG → браузер показывает результат

Новый источник данных — $_GET, набор параметров адреса. Запись $_GET["theme"] берёт поле theme; ?? "blue" выбирает синий по умолчанию, если поле отсутствует. Пока разрешаем только готовые варианты. Это делает интерфейс понятнее и не позволяет запросить огромный холст. Если адрес исправить вручную, проверка вернёт 400 с текстом причины. Подробности форм — в главе о формах.

example.php: выбрать параметры и отдать одну картинкуПример для указанного окружения
PNG, полученный по HTTP240 × 100 пикселей
example.php: выбрать параметры и отдать одну картинку: PNG, полученный по HTTPСкачать PNG

Получено через локальный HTTP-запрос. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$theme = $_GET["theme"] ?? "blue";
$label = $_GET["label"] ?? "NEW";
$radius = $_GET["radius"] ?? "18";
if (!is_string($theme) || !in_array($theme, ["blue", "clay"], true)
    || !is_string($label) || !in_array($label, ["NEW", "SALE"], true)
    || !is_string($radius) || !in_array($radius, ["18", "28"], true)) {
    http_response_code(400);
    header("Content-Type: text/plain; charset=utf-8");
    echo "Choose a listed theme, label and radius.\n";
    exit;
}
$rgb = $theme === "blue" ? [25, 105, 175] : [160, 65, 40];
$radius = (int) $radius;
$image = imagecreatetruecolor(240, 100);
$background = imagecolorallocate($image, $rgb[0], $rgb[1], $rgb[2]);
$white = imagecolorallocate($image, 255, 255, 255);
$accent = imagecolorallocate($image, 255, 210, 75);
imagefill($image, 0, 0, $background);
imagefilledellipse($image, 195, 50, $radius * 2, $radius * 2, $accent);
imagestring($image, 5, 20, 42, $label, $white);
header("Content-Type: image/png");
imagepng($image);

В архиве уже есть index.html. Для прямой проверки откройте example.php?theme=clay&label=SALE&radius=28: получатся терракотовая плашка, SALE и круг радиуса 28. Картинка над кодом получена настоящим локальным HTTP-запросом к этому обработчику. Отправьте radius=9000 — вместо большого изображения получите 400 и сообщение о допустимых вариантах.

Новая записьЗачем она появилась
is_string и in_array(..., true)Проверяем, что пришла одна строка из разрешённого списка. HTML select помогает посетителю, но запрос можно отправить вручную. Параметр theme[]=blue будет массивом: его тоже следует отвергнуть.
! ... || ...! означает «не», || — «или». Если хотя бы одно поле неверно, выполняется блок между фигурными скобками if. Он отправляет ошибку и завершает обработку командой exit.
$theme === "blue" ? [...] : [...]Короткий выбор одного из двух наборов RGB. === сравнивает значение и тип; ? отделяет вариант при совпадении, : — другой. Массив хранит три компонента под номерами 0, 1, 2.
(int) $radiusПараметры адреса приходят текстом. После проверки разрешённых значений переводим "18" или "28" в целое число для рисования.
header("Content-Type: image/png");Сообщаем браузеру тип ответа до отправки его тела. Следующий imagepng без имени файла пишет PNG в ответ. В этот ответ не добавляют HTML, echo с именем файла или отладочный текст.

HTML-форма использует method="get": значения выбранных полей входят в адрес запроса. action="example.php" указывает обработчик, target="badge-result" направляет ответ в подписанную область iframe, поэтому форма остаётся на экране. Для обычной страницы с уже известными параметрами достаточно <img src="example.php?theme=blue&label=NEW&radius=18" alt="Новая коллекция">.

Следующее улучшение: добавьте третий разрешённый цвет и соответствующий пункт формы. Свободную пользовательскую подпись вводите отдельным этапом: ограничьте длину, выберите шрифт с нужными буквами и проверьте, помещается ли текст. Не принимайте из URL произвольный путь шрифта, файла или неограниченные размеры изображения.

Теперь нужен исходник: нарисуем карточку чашки

Плашку мы рисовали с нуля. Для обработки обычно нужен готовый исходник — фотография или схема. Здесь используем собственный рисунок чашки 160 × 120: синий корпус, ручка справа и подпись снизу помогают увидеть обрезку, отражение и потерю мелких деталей. Это учебный рисунок, а не фотография.

Создать исходную карточку товараСамостоятельный пример
Исходная карточка160 × 120 пикселей
Создать исходную карточку товара: Исходная карточкаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
echo "product-source.png\n";
Текстовая проверка результата
product-source.png

imagefilledrectangle получает координаты двух противоположных углов корпуса: (40, 20) и (112, 84). imageellipse рисует только контур ручки с центром (112, 50), шириной 36 и высотой 42. Подпись находится у нижнего края. Оба цвета и сохранение PNG работают так же, как в плашке.

Следующие небольшие примеры включают файл source.php из скачиваемого архива. Он содержит показанный выше рисунок и оставляет холст в $image. Команда require "source.php"; выполняет этот PHP-файл здесь; это не скрытая библиотека. Чтобы обработать готовый PNG вместо рисунка, замените require на $image = imagecreatefrompng("product-source.png"); и положите сам PNG рядом. В рабочем приложении проверяют возможность чтения и результат декодирования.

Обрезка: оставим чашку и уберём нижнюю подпись

Обрезка выбирает прямоугольник из исходника. Она не делает предмет мельче: у чашки остаётся тот же размер в пикселях, просто холст теперь заканчивается ближе к ней. В нашем рисунке область начинается в (32, 12), её ширина 104, высота 80.

Исходная карточка → выбранная областьСамостоятельный пример
До: исходная карточка160 × 120 пикселей
Исходная карточка → выбранная область: До: исходная карточкаСкачать PNG
После: чашка без ценника104 × 80 пикселей
Исходная карточка → выбранная область: После: чашка без ценникаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

require "source.php";
$crop = imagecrop($image, ["x" => 32, "y" => 12, "width" => 104, "height" => 80]);
imagepng($crop, "crop.png");
echo "crop.png\n";
Текстовая проверка результата
crop.png

Слева исходник 160 × 120, справа отдельный холст 104 × 80. $image не изменился; результат возвращается в $crop. Массив в квадратных скобках — набор подписанных значений: x и y — начало, width и height — размеры. Стрелка => связывает имя поля и его значение.

Почему не width = 135? Потому что ширина — число захваченных пикселей, а не правая координата. В этом случае последняя колонка области: 32 + 104 - 1 = 135. На загруженных изображениях координаты проверяют относительно imagesx и imagesy; imagecrop может вернуть false, и такой результат нельзя передать в imagepng. Для учебного исходника прямоугольник заранее известен.

Упражнение: поставьте y=30, сохранив высоту 80. Верх чашки будет отрезан, а нижняя подпись попадёт в результат. Это показывает, почему автоматический центральный квадрат не всегда подходит товару или лицу.

Масштаб: маленькое превью без растяжения

В списке товаров полная карточка занимает лишнее место. Уменьшим ширину с 160 до 80; высота станет 60, потому что соотношение сторон сохраняется. В отличие от обрезки, здесь весь рисунок и подпись остаются, но каждый элемент меньше.

Исходник → превью 80 × 60Самостоятельный пример
До: 160 × 120160 × 120 пикселей
Исходник → превью 80 × 60: До: 160 × 120Скачать PNG
После: 80 × 6080 × 60 пикселей
Исходник → превью 80 × 60: После: 80 × 60Скачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

require "source.php";
$small = imagescale($image, 80);
imagepng($small, "preview.png");
echo "preview.png\n";
Текстовая проверка результата
preview.png

80 — требуемая ширина, высоту мы пропустили. GD вычисляет её пропорционально. Сохраняем $small, иначе случайно запишем исходный размер. Подпись уменьшилась вместе с чашкой и стала хуже читаться; цену каталога лучше выводить HTML-текстом рядом.

Если принудительно задать imagescale($image, 80, 80), карточка вытянется по вертикали. Когда нужен квадрат без искажения, сначала выберите квадратную область, затем уменьшите её. Для фотографии сравните imagescale с imagecopyresampled; для пиксельной схемы может подойти ближайший сосед.

Фильтр: серая версия для товара вне наличия

Серый рисунок помогает визуально отличить недоступный товар. На сайте рядом всё равно нужна надпись «нет в наличии»: один цвет не передаёт статус всем читателям. Сделаем производную и применим к ней фильтр, сохранив цветной исходник.

Цветное превью → оттенки серогоСамостоятельный пример
До фильтра120 × 90 пикселей
Цветное превью → оттенки серого: До фильтраСкачать PNG
После фильтра120 × 90 пикселей
Цветное превью → оттенки серого: После фильтраСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

require "source.php";
$small = imagescale($image, 120);
imagefilter($small, IMG_FILTER_GRAYSCALE);
imagepng($small, "unavailable.png");
echo "unavailable.png\n";
Текстовая проверка результата
unavailable.png

IMG_FILTER_GRAYSCALE — именованная настройка, константа. Она выбирает перевод в серый. Фильтр меняет сам $small; возвращаемое значение — статус, поэтому записывать $small = imagefilter(...) ошибочно. Оригинал $image остаётся цветным.

Теперь замените GRAYSCALE на IMG_FILTER_BRIGHTNESS, 20: появится ещё один аргумент — прибавка яркости. Разные фильтры принимают разные параметры, и слишком сильная коррекция уничтожает детали. Все режимы разобраны в imagefilter.

Водяной знак: сначала отдельная подпись, потом наложение

Нужно подписать карточку названием магазина. Подготовим отдельный PNG: тёмные буквы на полупрозрачной белой подложке. Затем перенесём его на карточку; через подложку будет виден синий корпус чашки. Это два понятных действия с двумя входными изображениями.

Прозрачность GD называется alpha: 0 означает полностью непрозрачный пиксель, 127 — полностью прозрачный. Режим imagealphablending($stamp, false) позволяет записывать именно выбранный alpha. imagesavealpha($stamp, true) просит сохранить его в PNG. Это разные настройки, обе нужны в этом примере.

Сохранить полупрозрачную подписьСамостоятельный пример
Водяной знак68 × 24 пикселей · увеличение до 2× (на узком экране может уменьшаться)
Сохранить полупрозрачную подпись: Водяной знакСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$stamp = imagecreatetruecolor(68, 24);
imagealphablending($stamp, false);
$clear = imagecolorallocatealpha($stamp, 0, 0, 0, 127);
imagefill($stamp, 0, 0, $clear);
$veil = imagecolorallocatealpha($stamp, 255, 255, 255, 45);
imagefilledrectangle($stamp, 0, 0, 67, 23, $veil);
$ink = imagecolorallocatealpha($stamp, 20, 40, 50, 0);
imagestring($stamp, 3, 8, 5, "MY SHOP", $ink);
imagesavealpha($stamp, true);
imagepng($stamp, "stamp.png");
echo "stamp.png\n";
Текстовая проверка результата
stamp.png

Число 45 делает белую подложку частично прозрачной; буквы с alpha 0 остаются непрозрачными. Шахматная подложка страницы просвечивает через PNG и не записана в сам файл. Если поставить alpha 127 для белого, под буквами совсем не останется белой плашки.

Два PNG → подписанная карточкаСамостоятельный пример
До: карточка160 × 120 пикселей
Два PNG → подписанная карточка: До: карточкаСкачать PNG
Водяной знак68 × 24 пикселей
Два PNG → подписанная карточка: Водяной знакСкачать PNG
После: подписанная карточка160 × 120 пикселей
Два PNG → подписанная карточка: После: подписанная карточкаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

require "source.php";
require "stamp.php";
$stamp = imagecreatefrompng("stamp.png");
imagealphablending($image, true);
imagecopy($image, $stamp, 78, 66, 0, 0, 68, 24);
imagepng($image, "signed.png");
echo "signed.png\n";
Текстовая проверка результата
signed.png

$image — получатель, $stamp — источник. 78,66 — место вставки на карточке; 0,0 — начало внутри подписи; 68,24 — размеры переносимой области. Blending включён именно у получателя: его пиксели смешиваются с полупрозрачной подложкой. imagecopymerge с процентом не является заменой прозрачности PNG.

Почему координаты не взяты наугад? От правого края отступ 14: 160 - 68 - 14 = 78. От нижнего края 30: 120 - 24 - 30 = 66. Когда размеры меняются, считайте их через imagesx/imagesy и проверяйте, что знак помещается. Сохраняйте подписанную производную отдельно: убрать уже смешанные пиксели без исходника нельзя.

В браузере пусто: найдём неисправный шаг

Значок повреждённой картинки не сообщает, что именно сломалось. Это может быть ошибка PHP вместо PNG, неверный адрес, отсутствие GD в веб-процессе или примесь текста к байтам изображения. Сначала отделим получение файла от доставки в браузер.

Проверка по порядку
  1. Запуск PHP: есть ли GD и ошибки в журнале?
  2. Файл: появился ли badge.png и открывается ли отдельно?
  3. HTTP: прямой адрес обработчика даёт 200 и Content-Type image/png?
  4. Байты: ответ начинается PNG, без HTML/echo/BOM перед ним?
  5. HTML: img.src ведёт именно на этот адрес?
Что видит человекЧто проверить и исправить
Скачанный PNG исправен, браузер показывает ошибкуПроверьте само тело HTTP-ответа, а не только файл на диске. Уберите отладочный echo, HTML, случайный пробел до <?php и BOM. PHP-файл с одними командами удобно закончить без закрывающего ?>. Content-Type лишь сообщает тип; он не превращает предупреждение PHP в изображение.
Работает локально, белый экран на сервереСравните расширения и php.ini именно CLI и веб-процесса. Проверьте путь и права чтения файла. Для своего локального изображения используйте известный путь на диске, а не HTTP-запрос к тому же сайту: URL добавляет зависимость от сети и настроек wrapper.
Вместо рисунка символы PNG/IHDR или JFIFБайты изображения попали в HTML-страницу либо MIME не соответствует кодировщику. Дайте картинке отдельный адрес и подключите его через img; PNG требует image/png, JPEG — image/jpeg.
Первое изображение есть, второе исчезлоДва imagepng без имени файла подряд не означают две картинки в одном обычном PNG-ответе. Создайте два HTTP-адреса либо два файла и два img; для одного результата сначала соедините холсты.
Исчезла прозрачность, виден чёрный фонПроверьте alpha в памяти после каждого преобразования и в заново открытом PNG. Во время подготовки прозрачного слоя выключите blending; перед записью включите savealpha. При наложении на непрозрачную карточку blending получателя, наоборот, нужен. JPEG не хранит прозрачность.
Изменился цвет при копированииПроверьте imageistruecolor у получателя. Палитра ограничивает набор доступных цветов. Для фотографии и прозрачного наложения используйте truecolor; конвертация не восстанавливает уже потерянные оттенки.

Эти ситуации встречаются в реальных обсуждениях: исправный файл и неработающий HTTP-вывод, разница окружений и два вывода в одном ответе, пустой значок вместо сообщения об ошибке, бинарный вывод внутри CMS, посторонний пробел перед PNG. Это источники постановок задач; приведённый здесь код написан заново. Контракты сверены с imagepng, imagesavealpha и imagealphablending.

Не скрывайте причину символом @. В рабочем PNG-обработчике предупреждения записывайте в журнал, а при неуспехе возвращайте понятный HTTP-статус и текстовую ошибку до отправки картинки. Не добавляйте отладочный var_dump внутрь готового PNG-ответа. Для прозрачности нельзя механически копировать любую пару true/false: сначала определите, создаёте ли прозрачный слой или накладываете его на фон.

Установка, кодеки и разница CLI/FPM

GD — расширение PHP поверх libgd, а FreeType, libpng, libjpeg, libwebp и libavif добавляют конкретные возможности. Наличие PHP не означает наличие GD. Официальная минимальная внешняя libgd —2.1.0, либо bundled-поставка PHP; для GD требуется zlib≥1.2.0.4. Готовые пакеты дистрибутива обычно собирают зависимости за вас.

СитуацияДействие и причина
Windows PHP8Подключить совместимый php_gd.dll через extension=gd в правильном php.ini; совпадение версии PHP, архитектуры, TS/NTS обязательно. До PHP8 библиотека называлась php_gd2.dll. Перезапустить обслуживающий PHP процесс.
Linux/контейнерУстановить пакет GD для используемой версии PHP или включить расширение при сборке образа. Не копировать случайную.so/.dll между несовместимыми версиями.
Сборка PHP7.4+--enable-gd включает расширение; --with-external-gd выбирает внешнюю libgd. Старое --with-gd заменено. --with-jpeg, --with-webp, --with-xpm, --with-freetype (через pkg-config), --with-avif (PHP8.1+) включают дополнительные возможности.
Старые configure ключи--with-jpeg-dir, --with-webp-dir, --with-xpm-dir, --with-freetype-dir заменены в 7.4. --with-png-dir/--with-zlib-dir удалены: libpng/zlib обязательны. --enable-gd-native-ttf не имел эффекта и удалён в 7.2.
Зависимости сборкиlibpng должна соответствовать версии, связанной с GD; сборка libjpeg для PHP может требовать --enable-shared. XPM зависит от X библиотек; TrueType от FreeType2. Список кодеков проверяют после сборки, а не по одному номеру GD.
В консоли работает, на сайте нетCLI и PHP-FPM/Apache могут читать разные ini и иметь разные расширения. Проверяйте PHP_SAPI, php_ini_loaded_file и extension_loaded именно в том процессе, который генерирует изображение. Диагностику с путями не оставляйте публичной.
Проверить возможность рисованияСамостоятельный пример
<?php
declare(strict_types=1);

if (!extension_loaded("gd")) {
    echo "GD missing: enable the extension first.\n";
    exit;
}
echo "GD loaded\n";
echo (gd_info()["FreeType Support"] ?? false) ? "FreeType available\n" : "bitmap only\n";
Ожидаемый результат
GD loaded
FreeType available

При включённом GD появятся GD loaded и наличие FreeType. Без расширения будет только GD missing: enable the extension first., затем программа завершится до вызова gd_info. В учебной проверке DLL загружена только для процесса; глобальный php.ini не изменяется. На вашем сервере требуется собственная настройка.

Для картинки не нужно называть любую зависимость «GD2»: это историческое имя DLL/формата, а не универсальное название текущего расширения. gd_info перечисляет фактические возможности, imagetypes даёт битовую маску поддерживаемых типов.

Настройки ошибок JPEG и памяти

НастройкаДействие
gd.jpeg_ignore_warningbool, default 1, INI_ALL. Игнорирует предупреждения libjpeg(-turbo), но не ошибки. До 7.1 default был 0. Это не делает повреждённое изображение корректным.
memory_limitGD требует память распакованных пикселей и промежуточных изображений. Повышайте лимит только вместе с ограничениями загрузки, числа пикселей и параллельных задач; один сжатый JPEG может занимать очень много памяти.
Смежные настройкиEXIF имеет собственные настройки. Upload лимиты, open_basedir, разрешённые streamwrappers и права каталогов — отдельные границы; GD не заменяет их.
Временно поменять JPEG-политику и вернуть еёСамостоятельный пример
<?php
declare(strict_types=1);

$previous = ini_set("gd.jpeg_ignore_warning", "0");
try { echo ini_get("gd.jpeg_ignore_warning"), "\n"; }
finally { if ($previous !== false) { ini_set("gd.jpeg_ignore_warning", $previous); } }
Ожидаемый результат
0

В обычном приложении предупреждение нужно обработать и записать в журнал. Подавление через@не является проверкой результата.

GdImage и GdFont: непрозрачные объекты и старые ресурсы

«Непрозрачный» класс здесь означает, что внутренние пиксели/таблицы скрыты от PHP-свойств. GdImage final появился в PHP8.0 вместо gd resource, GdFont final в 8.1 вместо старого идентификатора/ресурса шрифта. У них нет пользовательского набора публичных методов и свойств: работа идёт через функции GD. Нельзя создать корректный холст простым new GdImage(); нужны фабрики imagecreatetruecolor и imageloadfont.

ОбъектКак использовать
GdImageХраните в переменной, передавайте image функциям; присваивание второй переменной сохраняет ссылку на тот же объект. Для самостоятельной копии создайте новый холст и скопируйте пиксели.
GdFontПолучается из imageloadfont, передаётся imagefontwidth/imagefontheight/imagestring и похожим функциям. FreeType принимает.ttf путь и не требует GdFont.
Сериализация и копированиеНе сохраняйте GD объект через serialize в сессию/очередь. Кодируйте изображение в PNG/WebP и сохраняйте путь или байты с лимитами. Для нового изображения не используйте clone.
ОсвобождениеВ PHP 8 imagedestroy ничего не освобождает, с 8.5 deprecated. Удаляйте ненужные ссылки и не держите все исходники пакета одновременно; пока другие переменные ссылаются на объект, он нужен.
Увидеть общий объект через две переменныеСамостоятельный пример
До изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Увидеть общий объект через две переменные: До измененияСкачать PNG
Тот же объект после записи через $same2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Увидеть общий объект через две переменные: Тот же объект после записи через $sameСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
$same = $image;
$red = imagecolorallocate($same, 255, 0, 0);
imagesetpixel($same, 0, 0, $red);
echo imagecolorsforindex($image, imagecolorat($image, 0, 0))["red"], "\n";
Текстовая проверка результата
255

Изменение через same видно через image. Это объясняет, почему вариант фото нужно копировать отдельно.

Создавать через фабрику, а не newСамостоятельный пример
<?php
declare(strict_types=1);

try { $image = new GdImage(); } catch (Error $error) { echo "use image factory\n"; }
$image = imagecreatetruecolor(2, 2);
echo get_class($image), "\n";
Ожидаемый результат
use image factory
GdImage

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

Выбрать путь под реальную задачу

Нужен результатПоследовательность
Превью фотографииgetimagesize → лимиты → декодер по MIME → imagescale или imagecopyresampled → JPEG/WebP/AVIF.
Прозрачный значокimagecreatetruecolor → imagealphablendingfalse → цвет с alpha127 → imagesavealpha → PNG.
Аватар-квадратimagecropцентра/выбранной области → imagescale → сохранение производной.
Логотип на фотоimagecreatefrompngлоготипа → координаты из размеров → imagecopyс alpha → кодирование.
Подпись на русскомimagettfbboxс UTF-8 совместимым.ttf → расчёт baseline → imagettftext. Bitmap шрифты 1..5 не подходят для UTF-8 кириллицы.
Метаданные архиваgetimagesizeс image_info → APP13 → iptcparse; для сохранения iptcembed.
Анимация, CMYK/ICC или гигантский tiled растрGD не является универсальным редактором таких файлов. Выбирайте библиотеку под требуемый формат, управление цветом и потоковую обработку; не обещайте сохранение исходного контейнера.

Все константы: форматы, цвета, ядра и режимы

Константа — именованное значение, которое помогает читать вызов. Здесь несколько независимых групп: IMG_*биты возможностей, IMAGETYPE_*одиночные форматы, специальные цвета, режимы и маски PNG/ARC. Совпадение чисел не делает их взаимозаменяемыми. Константы расширения появляются только после загрузки GD.

Константа в PHP8.5.11Назначение и точный потребитель
IMG_AVIF = 256Бит поддержки AVIF; не числовой IMAGETYPE_тип. imagetypes
IMG_GIF = 1Бит поддержки GIF; не числовой IMAGETYPE_тип. imagetypes
IMG_JPG = 2Бит поддержки JPG; не числовой IMAGETYPE_тип. imagetypes
IMG_JPEG = 2Бит поддержки JPEG (алиас IMG_JPG). imagetypes
IMG_PNG = 4Бит поддержки PNG; не числовой IMAGETYPE_тип. imagetypes
IMG_WBMP = 8Бит поддержки WBMP; не числовой IMAGETYPE_тип. imagetypes
IMG_XPM = 16Бит поддержки XPM; не числовой IMAGETYPE_тип. imagetypes
IMG_WEBP = 32Бит поддержки WEBP; не числовой IMAGETYPE_тип. imagetypes
IMG_BMP = 64Бит поддержки BMP; не числовой IMAGETYPE_тип. imagetypes
IMG_TGA = 128Бит поддержки TGA; не числовой IMAGETYPE_тип. imagetypes
IMG_WEBP_LOSSLESS = 101Режим без потерь вместо quality0..100; PHP8.1+. imagewebp
IMG_COLOR_TILED = -5Заполнять область повторяющейся плиткой. imagesettile
IMG_COLOR_STYLED = -2Чередовать цвета/пропуски по текущему стилю линии. imagesetstyle
IMG_COLOR_BRUSHED = -3Рисовать линию отпечатками текущей кисти. imagesetbrush
IMG_COLOR_STYLEDBRUSHED = -4Включать/пропускать кисть по стилю. imagesetbrush
IMG_COLOR_TRANSPARENT = -6Пропустить пиксель стиля; это не альфа-канал произвольного цвета. imagesetstyle
IMG_ARC_ROUNDED = 0Алиас PIE: сектор с дугой. imagefilledarc
IMG_ARC_PIE = 0Сектор с дугой и радиусами; альтернатива CHORD. imagefilledarc
IMG_ARC_CHORD = 1Замкнуть концы дуги хордой. imagefilledarc
IMG_ARC_NOFILL = 2Контур без заливки; допускает OR с EDGED. imagefilledarc
IMG_ARC_EDGED = 4При NOFILL дополнительно провести радиусы к центру. imagefilledarc
IMG_GD2_RAW = 1Несжатые GD2-блоки; исторический внутренний формат. imagegd2
IMG_GD2_COMPRESSED = 2Сжатые GD2-блоки; исторический внутренний формат. imagegd2
IMG_FLIP_HORIZONTAL = 1Зеркально слева направо. imageflip
IMG_FLIP_VERTICAL = 2Зеркально сверху вниз. imageflip
IMG_FLIP_BOTH = 3Отразить обе оси. imageflip
IMG_EFFECT_REPLACE = 0Заменять пиксели с alpha напрямую. imagelayereffect
IMG_EFFECT_ALPHABLEND = 1Смешивать цвет с фоном по alpha. imagelayereffect
IMG_EFFECT_NORMAL = 2Обычный режим наложения; отдельное числовое значение, не алиас ALPHABLEND. imagelayereffect
IMG_EFFECT_OVERLAY = 3Режим overlay для наложения. imagelayereffect
IMG_EFFECT_MULTIPLY = 4Умножать компоненты; PHP 8.0+. imagelayereffect
IMG_CROP_DEFAULT = 0Текущее поведение TRANSPARENT; с 7.4 нет fallback к SIDES. imagecropauto
IMG_CROP_TRANSPARENT = 1Убрать прозрачные поля. imagecropauto
IMG_CROP_BLACK = 2Убрать чёрные поля. imagecropauto
IMG_CROP_WHITE = 3Убрать белые поля. imagecropauto
IMG_CROP_SIDES = 4Оценить фон по четырём углам. imagecropauto
IMG_CROP_THRESHOLD = 5Убрать близкое к color с заданным процентным threshold. imagecropauto
IMG_BELL = 1колоколообразное ядро. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BESSEL = 2ядро Bessel. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BILINEAR_FIXED = 3билинейный пересчёт с фиксированной арифметикой. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BICUBIC = 4бикубическая интерполяция. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BICUBIC_FIXED = 5бикубическая с фиксированной арифметикой. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BLACKMAN = 6окно Blackman. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BOX = 7прямоугольное усреднение. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_BSPLINE = 8B-spline. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_CATMULLROM = 9Catmull–Rom. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_GAUSSIAN = 10гауссово ядро. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_GENERALIZED_CUBIC = 11обобщённое кубическое. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_HERMITE = 12Hermite. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_HAMMING = 13окно Hamming. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_HANNING = 14окно Hanning. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_MITCHELL = 15Mitchell. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_POWER = 17степенное ядро. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_QUADRATIC = 18квадратичное. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_SINC = 19sinc. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_NEAREST_NEIGHBOUR = 16ближайший сосед, без смешивания. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_WEIGHTED4 = 21четыре взвешенных пикселя; imagescale пока не поддерживает. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_TRIANGLE = 20треугольное ядро. Смотрите ограничения конкретной операции; универсального лучшего ядра нет. imagesetinterpolation
IMG_AFFINE_TRANSLATE = 0Перенос; options содержит x, y. imageaffinematrixget
IMG_AFFINE_SCALE = 1Масштаб; options содержит x, y коэффициенты. imageaffinematrixget
IMG_AFFINE_ROTATE = 2Поворот; options — угол в градусах. imageaffinematrixget
IMG_AFFINE_SHEAR_HORIZONTAL = 3Горизонтальный сдвиг формы; options — угол. imageaffinematrixget
IMG_AFFINE_SHEAR_VERTICAL = 4Вертикальный сдвиг формы; options — угол. imageaffinematrixget
GD_BUNDLED = 11 — встроенная поставка libgd PHP,0 — внешняя. gd_info
IMG_FILTER_NEGATE = 0Инверсия RGB, без дополнительных args. imagefilter
IMG_FILTER_GRAYSCALE = 1Серый REC.601, без args; alpha сохраняется. imagefilter
IMG_FILTER_BRIGHTNESS = 2Один аргумент яркости −255..255. imagefilter
IMG_FILTER_CONTRAST = 3Один аргумент контраста; положительный уменьшает контраст. imagefilter
IMG_FILTER_COLORIZE = 4red, green, blue, optionalalpha. imagefilter
IMG_FILTER_EDGEDETECT = 5Границы, без args. imagefilter
IMG_FILTER_GAUSSIAN_BLUR = 7Гауссово размытие, без args. imagefilter
IMG_FILTER_SELECTIVE_BLUR = 8Выборочное размытие, без args. imagefilter
IMG_FILTER_EMBOSS = 6Рельеф, без args. imagefilter
IMG_FILTER_MEAN_REMOVAL = 9Подчёркивание деталей, без args. imagefilter
IMG_FILTER_SMOOTH = 10Один параметр степени сглаживания. imagefilter
IMG_FILTER_PIXELATE = 11Размер блока и optionalbool advanced. imagefilter
IMG_FILTER_SCATTER = 12sub, plus, optional массив цветов; PHP7.4+. imagefilter
GD_VERSION = 2.0.35Строка версии GD, с которой собран PHP. gd_info
GD_MAJOR_VERSION = 2Старшая часть номера GD. gd_info
GD_MINOR_VERSION = 0Младшая часть номера GD. gd_info
GD_RELEASE_VERSION = 35Номер выпуска GD. gd_info
GD_EXTRA_VERSION = Дополнительная beta/rc-часть версии. gd_info
PNG_NO_FILTER = 0Отключить фильтры PNG. imagepng
PNG_FILTER_NONE = 8Разрешить PNG-строки без предсказания. imagepng
PNG_FILTER_SUB = 16Предсказывать байт по левому соседу. imagepng
PNG_FILTER_UP = 32Предсказывать по предыдущей строке. imagepng
PNG_FILTER_AVG = 64Предсказывать по среднему слева/сверху. imagepng
PNG_FILTER_PAETH = 128Предиктор Paeth по соседним байтам. imagepng
PNG_ALL_FILTERS = 248Разрешить все PNG-фильтры; кодер выбирает подходящий. imagepng

Набор ниже относится к стандартным функциям размеров/MIME. Это не обещание, что GD декодирует все перечисленные форматы: например PSD/TIFF и PDF требуют других библиотек.

IMAGETYPE_*Что обозначает
IMAGETYPE_GIF = 1GIF, возможна анимация; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_JPEG = 2JPEG; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_PNG = 3PNG; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_SWF = 4исторический Flash SWF; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_PSD = 5Photoshop PSD; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_BMP = 6Windows bitmap; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_TIFF_II = 7TIFF little-endian Intel; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_TIFF_MM = 8TIFF big-endian Motorola; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_JPC = 9JPEG2000 codestream; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_JP2 = 10JPEG2000 JP2 container; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_JPX = 11JPEG2000 extended container; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_JB2 = 12JBIG2; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_SWC = 13сжатый Flash; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_IFF = 14Interchange File Format; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_WBMP = 15Wireless bitmap; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_JPEG2000 = 9алиас JPC; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_XBM = 16X bitmap; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_ICO = 17набор Windows icon; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_WEBP = 18WebP; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_AVIF = 19AV1 image; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_HEIF = 20контейнер High Efficiency Image Format; отдельного GD-декодера HEIF нет; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_UNKNOWN = 0неизвестный тип; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_COUNT = 22служебная граница перечня, не формат; image_type_to_mime_type / image_type_to_extension
IMAGETYPE_SVG = 21векторная SVG-разметка; GD не выполняет её растеризацию; image_type_to_mime_type / image_type_to_extension

Интерполяция выбирает, какие исходные пиксели влияют на новый. Nearest сохраняет ступеньки pixel-art; bilinear смешивает соседей; кубические/оконные ядра могут лучше сохранять детали или давать ореолы. Сравнивайте один и тот же материал в итоговом размере, не выбирайте ядро только по названию.

Почему порядок масштаба и переноса меняет результат

Пусть точка наклейки находится в (4,2). Мы хотим увеличить рисунок вдвое и сдвинуть его на 5 пикселей вправо, на 3 вниз. Если сначала сдвинуть, а потом увеличить, увеличится и величина сдвига. Поэтому одинаковые операции в разном порядке размещают наклейку по-разному.

ПорядокПуть одной и той же точки
Сначала масштаб, затем перенос(4,2) → (8,4) → (13,7). Сдвиг 5,3 прибавили к уже увеличенным координатам.
Сначала перенос, затем масштаб(4,2) → (9,5) → (18,10). Вдвое увеличили и исходные координаты, и сдвиг.

Матрица хранит правило из шести чисел. Для массива $m новая координата x равна $m[0] * $x + $m[2] * $y + $m[4]; новая y — $m[1] * $x + $m[3] * $y + $m[5]. Скобки с числом выбирают элемент массива; звёздочка умножает. Это не пиксели и не PNG: сначала мы проверим правило, затем его можно передать imageaffine.

Одна точка, два порядка преобразованияСамостоятельный пример
<?php
declare(strict_types=1);

$scale = imageaffinematrixget(IMG_AFFINE_SCALE, ["x" => 2.0, "y" => 2.0]);
$move = imageaffinematrixget(IMG_AFFINE_TRANSLATE, ["x" => 5.0, "y" => 3.0]);
$first = imageaffinematrixconcat($scale, $move);
$second = imageaffinematrixconcat($move, $scale);
$x = 4;
$y = 2;
echo $first[0] * $x + $first[2] * $y + $first[4], ",", $first[1] * $x + $first[3] * $y + $first[5], "\n";
echo $second[0] * $x + $second[2] * $y + $second[4], ",", $second[1] * $x + $second[3] * $y + $second[5], "\n";
Ожидаемый результат
13,7
18,10

В imageaffinematrixconcat($scale, $move) правило первого аргумента применяется раньше правила второго. Именно поэтому простая перестановка даёт две разные точки. Здесь числа — полезный результат вычисления координат; операция сама ничего не рисует.

Два равномерных масштаба или два переноса — специальные случаи, где перестановка может ничего не показать. Для проверки общего порядка берите операции разных видов и прослеживайте конкретную точку. После выбора порядка передайте матрицу imageaffine и сравните полученную картинку с исходником в практическом примере карточки.

Приём изображений: что проверяет каждый шаг

Файл от посетителя — внешние данные. Расширение .jpg и клиент ский Content-Type не являются доказательством. Обработка формы сначала проверяет метод запроса, поля, авторизацию и CSRF, затем UPLOAD_ERR_OK/is_uploaded_file, лимит байтов, Fileinfo и допустимый формат. Дальше getimagesize ограничивает стороны/пиксели, а выбранный декодер должен успешно получить GdImage. Проверки выполняют разные задачи: один вызов не заменяет остальные.

ПроблемаДействие
Маленький файл, огромная картинкаОграничить width, height, width×height до decode; учесть одновременные копии. Truecolor требует как минимум несколько байт на пиксель плюс структуры/кодеки.
Чужое имя/путьСоздать собственное имя из контролируемого идентификатора, писать в выделенный каталог; не соединять непроверенный filename с путём. Временную производную проверить, затем атомарно опубликовать в своём хранилище.
Произвольный URLОтдельный HTTP клиент с allowlist/таймаутами/ограничениями redirect и размера. Прямой URL в imagecreatefrom*может открыть непредусмотренные ресурсы сервера.
Повернутое фотоEXIF orientation может требовать rotate и flip, GD не исправляет её автоматически. Метаданные ориентации после коррекции согласуйте с новыми пикселями.
Утечка метаданныхПроизводную генерируйте с осознанной политикой EXIF/IPTC; координаты камеры и авторские поля могут быть лишними. Нужное сохраняйте явно.
Повреждённый вход/записьОбработать warning, false, ValueError/TypeError; не показывать пользователю сырой путь сервера. Проверить получившийся файл, не одно true.
Ограничить локальный учебный вход перед decodeСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(16, 12);
imagepng($image, "upload.bin");
$file = "upload.bin";
$mime = (new finfo(FILEINFO_MIME_TYPE))->file($file);
$size = getimagesize($file);
if (filesize($file) > 100000 || $mime !== "image/png" || $size === false
    || $size[0] < 1 || $size[1] < 1 || $size[0] > 1000 || $size[1] > 1000
    || $size[0] * $size[1] > 500000) {
    throw new UnexpectedValueException("Image rejected");
}
$decoded = imagecreatefrompng($file);
if ($decoded === false) { throw new UnexpectedValueException("Decode failed"); }
echo imagesx($decoded), "x", imagesy($decoded), " accepted\n";
Ожидаемый результат
16x12 accepted

Этот пример тестирует локальный файл. Настоящая multipart форма имеет дополнительные upload/доступ/CSRF проверки; эта цепочка называется проверкой изображения, ане полным HTTP обработчиком.

Готовый PNG-ответ и место ob_start

На обычной HTML странице размещают <img src="/badge.php" alt="Статус">. Отдельный badge.php отвечает только байтами картинки: Content-Type: image/png перед данными, затем imagepng. Нельзя печатать отладочный echo или предупреждение в этот же поток. Схема вывода другая, чем обычная страница с HTML.

Отдельный HTTP-обработчик изображенияПример для указанного окружения
PNG, полученный по HTTP120 × 40 пикселей
Отдельный HTTP-обработчик изображения: PNG, полученный по HTTPСкачать PNG

Получено через локальный HTTP-запрос. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(120, 40);
$background = imagecolorallocate($image, 20, 80, 100);
imagefill($image, 0, 0, $background);
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 4, 8, 10, "READY", $white);
header("Content-Type: image/png");
imagepng($image);
exit;

Для этого примера выполнена синтаксическая проверка. Реальный HTTP ответ проверяется в веб-окружении; CLI не проверяет заголовки браузера.

Когда кодек пишет вывод, а API нужна строка для объектного хранилища или письма, буферизация вывода позволяет собрать эти байты. Она не делает картинку безопасной и не должна скрывать ошибки; error_log/display_errors настраивайте отдельно.

Разделить результат функции и байты файлаСамостоятельный пример
Холст8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Разделить результат функции и байты файла: ХолстСкачать PNG
Декодированный буфер PNG8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Разделить результат функции и байты файла: Декодированный буфер PNGСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
ob_start();
$success = imagepng($image);
$pngBytes = ob_get_clean();
echo get_debug_type($success), "\n";
echo bin2hex(substr($pngBytes, 0, 8)), "\n";
Текстовая проверка результата
bool
89504e470d0a1a0a

Функция вернула bool, а PNG лежит в строке из буфера. Сигнатура 8 байт показывает, что были получены именно PNG байты.

Практика: PNG-логотип с мягкой прозрачностью поверх фото

Нужен видимый результат: на фото товара появляется небольшой знак с отступом, а края логотипа не имеют чёрного фона. Создаём два объекта: фон назначения и логотип-источник. Alpha логотипа смешивается с фоном назначения. Для самой прозрачной PNG заготовки запись alpha включаем без blending; для наложения на готовый фон blending назначения включаем.

Разместить полупрозрачный знак в правом нижнем углуСамостоятельный пример
Фото без знака40 × 30 пикселей · увеличение до 4× (на узком экране может уменьшаться)
Разместить полупрозрачный знак в правом нижнем углу: Фото без знакаСкачать PNG
Полупрозрачный знак8 × 6 пикселей · увеличение до 4× (на узком экране может уменьшаться)
Разместить полупрозрачный знак в правом нижнем углу: Полупрозрачный знакСкачать PNG
Фото с наложением40 × 30 пикселей · увеличение до 4× (на узком экране может уменьшаться)
Разместить полупрозрачный знак в правом нижнем углу: Фото с наложениемСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$photo = imagecreatetruecolor(40, 30);
imagefill($photo, 0, 0, imagecolorallocate($photo, 255, 255, 255));
$stamp = imagecreatetruecolor(8, 6);
imagealphablending($stamp, false);
imagesavealpha($stamp, true);
$red = imagecolorallocatealpha($stamp, 255, 0, 0, 64);
imagefill($stamp, 0, 0, $red);
$margin = 3;
$x = imagesx($photo) - imagesx($stamp) - $margin;
$y = imagesy($photo) - imagesy($stamp) - $margin;
imagealphablending($photo, true);
imagecopy($photo, $stamp, $x, $y, 0, 0, imagesx($stamp), imagesy($stamp));
$pixel = imagecolorsforindex($photo, imagecolorat($photo, $x, $y));
echo $x, ",", $y, "\n";
echo $pixel["red"] === 255 && $pixel["green"] > 0 && $pixel["green"] < 255 ? "red blended with white\n" : "unexpected\n";
Текстовая проверка результата
29,21
red blended with white

Для настоящей фотографии первые объекты получаются из imagecreatefromjpeg/png. Если знак больше фото, заранее выберите уменьшение или отказ; отрицательный отступ не является нужным размещением.

Водяной знак помогает показать источник, не является неудаляемой защитой. Сохраните оригинал без знака; если выход прозрачный, проверьте alpha после повторного декодирования.

Практика: общая прозрачность непрозрачной плашки

Другая задача: заранее созданная непрозрачная плашка должна быть полупрозрачной целиком. Здесь imagecopymerge с процентом 50 подходит яснее. Процент вклада источника не равен alpha каждого пикселя PNG, поэтому этот способ не подменяет предыдущий пример.

Смешать синюю плашку с белым фоном на 50%Самостоятельный пример
Фото без знака20 × 12 пикселей · увеличение до 9× (на узком экране может уменьшаться)
Смешать синюю плашку с белым фоном на50%: Фото без знакаСкачать PNG
Непрозрачная плашка6 × 4 пикселей · увеличение до 9× (на узком экране может уменьшаться)
Смешать синюю плашку с белым фоном на50%: Непрозрачная плашкаСкачать PNG
Фото с наложением20 × 12 пикселей · увеличение до 9× (на узком экране может уменьшаться)
Смешать синюю плашку с белым фоном на50%: Фото с наложениемСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$photo = imagecreatetruecolor(20, 12);
imagefill($photo, 0, 0, imagecolorallocate($photo, 255, 255, 255));
$stamp = imagecreatetruecolor(6, 4);
imagefill($stamp, 0, 0, imagecolorallocate($stamp, 0, 0, 255));
imagecopymerge($photo, $stamp, 12, 6, 0, 0, 6, 4, 50);
$pixel = imagecolorsforindex($photo, imagecolorat($photo, 13, 7));
echo $pixel["blue"], "\n";
echo $pixel["red"] > 0 && $pixel["red"] < 255 ? "half blend\n" : "unexpected\n";
Текстовая проверка результата
255
half blend

Плашка рисуется внутри выбранной области; остальное не трогается. Для аккуратных краёв текста с alpha предпочтительнее предыдущий вариант с imagecopy.

Стоимость операций: как не превратить превью в долгий запрос

Главная единица объёма — пиксели, не килобайты JPEG. Холст 6000×4000 содержит 24 миллиона пикселей; один набор truecolor данных занимает около 96 МБ ещё до дополнительных структур, исходных байтов, копий и кодера. Реальный предел зависит от сборки; это оценка, не гарантия memory_limit.

Дорогая частьКак организовать
Декодирование/несколько производныхДекодируйте исходник один раз для разумного набора размеров, освобождайте промежуточные ссылки. Не увеличивайте лимиты бесконечно; большие пакеты передавайте очереди.
Двойной PHP цикл по пикселямДля фильтра/копирования/масштаба предпочтите встроенную операцию. imagecolorat циклы полезны на учебной маске, но дороги на фото.
Повторные перекодированияКешируйте производную по ключу исходник+размер+формат+версия обработки. Не сжимайте JPEG повторно много раз: потери накапливаются.
AVIF speed и qualityНастраивайте баланс на типичном материале, измеряйте время и размер. Параллельность ограничивайте с учётом CPU и памяти.
Качество/цветGD не обещает полноценное ICC управление, сохранение анимации и metadata. Требования архива/печати выбирают инструмент, а не наоборот.

Обсуждения: от повреждённого HTTP-ответа до прозрачности

Обсуждения дали постановки задач. Старые ответы иногда неверны для текущего PHP или формата; здесь используются собственные примеры и контракт PHP.net, а не перенос чужого кода.

ОбсуждениеЧто проверяем
Stack Overflow: 1705098Почему прозрачный PNG получает чёрный фон: blending и сохранение alpha — отдельные настройки. imagesavealpha
Stack Overflow: 12181573Alpha может потеряться на предыдущем шаге обработки, а не в функции, на которую сначала падает подозрение. Проверяем сохранённую производную. imagecreatefromstring
Stack Overflow: 9332497GIF не приобретает полный alpha от imagesavealpha; выбор формата является частью решения. imagecolortransparent
Stack Overflow: 18410739Ограниченная палитра может менять цвета при композиции; для фотографии нужен truecolor. imagecreatetruecolor
Stack Overflow: 9836391Файл может быть исправен при повреждённом HTTP-ответе. Современный imagepng поддерживает вывод без имени; старый совет о обязательном php://output не принимается как правило. imagepng
Stack Overflow: 62102018Сравнение localhost/VPS: зависимость от URL локального файла и два последовательных imagepng в одном ответе. imagepng
Stack Overflow: 35516499Значок повреждённого изображения скрывает диагностический текст: проверять журнал и тело HTTP, не лечить без причины base64-обёрткой. imagepng
Stack Overflow: 21851807Бинарные байты в HTML CMS и несовпадающий Content-Type: разделить HTML-страницу и изображение с отдельным URL. imagepng
Stack Overflow: 26059152В обсуждении найден пробел перед открывающим PHP-тегом; проверять отсутствие любых лишних байтов перед PNG. imagepng

Справочник GD: 117 функций по категориям

Здесь все 117 официальных функций книги GD, включая 3 исторические удалённые, чтобы разбираться в старых проектах. У каждой есть синтаксис, контракт, простые примеры, практическое применение и смежные операции. Два класса и все константы описаны в отдельных разделах.

КатегорияФункции
Холстimagecreate, imagecreatetruecolor, imagedestroy, imageistruecolor
Размерыimagesx, imagesy
Возможностиgd_info, imagetypes
Параметры сохраненияimageinterlace, imageresolution
Цветimagecolorallocate, imagecolorallocatealpha
Палитраimagecolorat, imagecolorclosest, imagecolorclosestalpha, imagecolorclosesthwb, imagecolordeallocate, imagecolorexact, imagecolorexactalpha, imagecolormatch, imagecolorresolve, imagecolorresolvealpha, imagecolorset, imagecolorsforindex, imagecolorstotal, imagecolortransparent, imagepalettecopy, imagepalettetotruecolor, imagetruecolortopalette
Прозрачностьimagealphablending, imagelayereffect, imagesavealpha
Фигурыimagearc, imageellipse, imagefilledarc, imagefilledellipse, imagefilledpolygon, imagefilledrectangle, imageline, imageopenpolygon, imagepolygon, imagerectangle, imagesetpixel
Рисование и состояниеimageantialias, imagedashedline, imagefill, imagefilltoborder, imagegetclip, imagesetbrush, imagesetclip, imagesetstyle, imagesetthickness, imagesettile
Копированиеimagecopy, imagecopymerge, imagecopymergegray, imagecopyresampled, imagecopyresized
Геометрия и масштабimageaffine, imageaffinematrixconcat, imageaffinematrixget, imagecrop, imagecropauto, imageflip, imagegetinterpolation, imagerotate, imagescale, imagesetinterpolation
Фильтрыimageconvolution, imagefilter, imagegammacorrect
Кодированиеimageavif, imagebmp, imagegd, imagegd2, imagegif, imagejpeg, imagepng, imagewbmp, imagewebp, imagexbm
Декодированиеimagecreatefromavif, imagecreatefrombmp, imagecreatefromgd, imagecreatefromgd2, imagecreatefromgd2part, imagecreatefromgif, imagecreatefromjpeg, imagecreatefrompng, imagecreatefromstring, imagecreatefromtga, imagecreatefromwbmp, imagecreatefromwebp, imagecreatefromxbm, imagecreatefromxpm
Метаданныеgetimagesize, getimagesizefromstring, image_type_to_extension, image_type_to_mime_type
Исторические функцииimage2wbmp, jpeg2wbmp, png2wbmp
Windowsimagegrabscreen, imagegrabwindow
Шрифтыimagechar, imagecharup, imagefontheight, imagefontwidth, imageloadfont, imagestring, imagestringup
FreeTypeimageftbbox, imagefttext, imagettfbbox, imagettftext
IPTCiptcembed, iptcparse

Учебный маршрут: от значка к обработчику превью

1. Создайте цветной холст и покажите разницу между объектом, пикселем и файлом. 2. Нарисуйте рамку и подпись. 3. Сохраните прозрачный PNG и прочитайте проверочный alpha. 4. Вырежьте аватар и уменьшите, сохранив пропорции. 5. Наложите логотип двумя способами и объясните разницу. 6. Добавьте лимиты входа, политику формата, метаданных и кеша. Наконец подключите загрузку изHTML-формыи отдельную обработкуошибок.

В примерах с FreeType включён настоящий DejaVu Sans с кириллицей и лицензией; на сайте выберите подходящий лицензированный TTF. Примеры Windows capture описывают API без захвата экрана; HTTP-примеры проверены настоящими локальными запросами; ответы PNG и статусы сохранены в evidence/gd-visual-manifest.json. Числовые мини-пробы в карточках дополняют пошаговый практический маршрут и видимые изображения, а не заменяют его.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

imagecreateСоздать небольшую палитровую схему: пиксели хранят номера цветов, до 256 записей.

PHP 8: GdImage · gd

imagecreate(int $width, int $height): GdImage|false

Создать небольшую палитровую схему: пиксели хранят номера цветов, до 256 записей.

Параметры и результатКак понимать и применять
width, heightПоложительные целые размеры в пикселях. Начальная координата (0,0), последний пиксель (width−1, height−1). Не принимайте произвольные размеры от посетителя.
Возврат / памятьGdImage либо false; неверные размеры могут вызвать ValueError. Truecolor изначально чёрный; в палитровом холсте первый выделенный цвет задаёт фон. Удвоение обеих сторон даёт в 4 раза больше пикселей.
Создать холст и прочитать размерыСамостоятельный пример
Палитровая основа8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Создать холст и прочитать размеры: Палитровая основаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(8, 6);
imagecolorallocate($image, 245, 245, 245);
echo imagesx($image), "x", imagesy($image), "\n";
echo imageistruecolor($image) ? "truecolor\n" : "palette\n";
Текстовая проверка результата
8x6
palette

Числа описывают пиксели, не сантиметры. Переменная хранит объект, а не PNG-байты.

Подготовить плашку выбранного цветаСамостоятельный пример
Результат30 × 10 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Подготовить плашку выбранного цвета: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(30, 10);
$color = imagecolorallocate($image, 20, 80, 120);
imagefilledrectangle($image, 0, 0, 29, 9, $color);
imagepng($image, "badge.png");
$info = getimagesize("badge.png");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
30x10 image/png

Здесь создание, цвет, рисование и кодирование — четыре разных шага; файл появляется только после imagepng.

Связанные операции: imagecreatetruecolor, imagecolorallocate, imagepng.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatetruecolorСоздать полноцветный холст для фотографии, превью или наложения логотипа.

PHP 8: GdImage · gd

imagecreatetruecolor(int $width, int $height): GdImage|false

Создать полноцветный холст для фотографии, превью или наложения логотипа.

Параметры и результатКак понимать и применять
width, heightПоложительные целые размеры в пикселях. Начальная координата (0,0), последний пиксель (width−1, height−1). Не принимайте произвольные размеры от посетителя.
Возврат / памятьGdImage либо false; неверные размеры могут вызвать ValueError. Truecolor изначально чёрный; в палитровом холсте первый выделенный цвет задаёт фон. Удвоение обеих сторон даёт в 4 раза больше пикселей.
Создать холст и прочитать размерыСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Создать холст и прочитать размеры: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
echo imagesx($image), "x", imagesy($image), "\n";
echo imageistruecolor($image) ? "truecolor\n" : "palette\n";
Текстовая проверка результата
8x6
truecolor

Числа описывают пиксели, не сантиметры. Переменная хранит объект, а не PNG-байты.

Подготовить плашку выбранного цветаСамостоятельный пример
Результат30 × 10 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Подготовить плашку выбранного цвета: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(30, 10);
$color = imagecolorallocate($image, 20, 80, 120);
imagefilledrectangle($image, 0, 0, 29, 9, $color);
imagepng($image, "badge.png");
$info = getimagesize("badge.png");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
30x10 image/png

Здесь создание, цвет, рисование и кодирование — четыре разных шага; файл появляется только после imagepng.

Связанные операции: imagecreate, imagecolorallocate, imagepng.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesxУзнать ширину уже загруженного изображения: расчёт рамки, пропорций или ограничения превью.

PHP 8: GdImage · gd

imagesx(GdImage $image): int

Узнать ширину уже загруженного изображения: расчёт рамки, пропорций или ограничения превью.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
ВозвратПоложительное целое число пикселей. Операция читает свойства холста; не требует повторного чтения/разбора файла.
Прочитать одну сторонуСамостоятельный пример
Результат12 × 8 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Прочитать одну сторону: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(12, 8);
echo imagesx($image), "\n";
Текстовая проверка результата
12

Последняя координата по этой оси на единицу меньше длины.

Посчитать размер без растяженияСамостоятельный пример
Результат120 × 80 пикселей
Посчитать размер без растяжения: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(120, 80);
$factor = min(60 / imagesx($image), 60 / imagesy($image), 1);
echo (int) round(imagesx($image) * $factor), "x", (int) round(imagesy($image) * $factor), "\n";
Текстовая проверка результата
60x40

min с единицей запрещает увеличение маленьких картинок. Округление нужно перед целочисленными аргументами GD.

Связанные операции: imagesx, imagesy, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesyУзнать высоту уже загруженного изображения: расчёт рамки, пропорций или ограничения превью.

PHP 8: GdImage · gd

imagesy(GdImage $image): int

Узнать высоту уже загруженного изображения: расчёт рамки, пропорций или ограничения превью.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
ВозвратПоложительное целое число пикселей. Операция читает свойства холста; не требует повторного чтения/разбора файла.
Прочитать одну сторонуСамостоятельный пример
Результат12 × 8 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Прочитать одну сторону: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(12, 8);
echo imagesy($image), "\n";
Текстовая проверка результата
8

Последняя координата по этой оси на единицу меньше длины.

Посчитать размер без растяженияСамостоятельный пример
Результат120 × 80 пикселей
Посчитать размер без растяжения: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(120, 80);
$factor = min(60 / imagesx($image), 60 / imagesy($image), 1);
echo (int) round(imagesx($image) * $factor), "x", (int) round(imagesy($image) * $factor), "\n";
Текстовая проверка результата
60x40

min с единицей запрещает увеличение маленьких картинок. Округление нужно перед целочисленными аргументами GD.

Связанные операции: imagesx, imagesy, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageistruecolorВыбрать подходящий путь: сохранить полноцветную фотографию или осознанно работать с палитрой.

PHP 8: GdImage · gd

imageistruecolor(GdImage $image): bool

Выбрать подходящий путь: сохранить полноцветную фотографию или осознанно работать с палитрой.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Возвратtrue — truecolor, false — палитра. Это формат внутреннего холста, а не расширение исходного файла: PNG бывает обоих видов.
Различить два холстаСамостоятельный пример
<?php
declare(strict_types=1);

$palette = imagecreate(2, 2);
$photo = imagecreatetruecolor(2, 2);
var_dump(imageistruecolor($palette), imageistruecolor($photo));
Ожидаемый результат
bool(false)
bool(true)

Проверка не конвертирует изображение.

Перед прозрачным наложением перейти к truecolorСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
imagecolorallocate($image, 10, 20, 30);
if (!imageistruecolor($image)) {
    imagepalettetotruecolor($image);
}
var_dump(imageistruecolor($image));
Ожидаемый результат
bool(true)

Конвертируется тот же объект. Это не добавляет деталей, потерянных при палитровом сжатии.

Связанные операции: imagepalettetotruecolor, imagetruecolortopalette.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagedestroyПонять старые примеры освобождения ресурсов и корректно обновить их для PHP 8.

Deprecated PHP 8.5 · gd

imagedestroy(GdImage $image): true

Понять старые примеры освобождения ресурсов и корректно обновить их для PHP 8.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Возврат / версииДо PHP 8 закрывала gd-resource. С PHP 8 ничего не освобождает и возвращает true. С PHP 8.5 deprecated. В новом коде удаляйте ненужные ссылки; объект освобождается, когда ссылок не остаётся.
Освободить свою ссылку без устаревшей функцииСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$copy = $image;
unset($image);
echo imagesx($copy), "\n";
unset($copy);
echo "references released\n";
Ожидаемый результат
8
references released

Первый unset не уничтожает объект, пока copy указывает на него. Это особенно важно при пакетной обработке.

В старом проекте увидеть отсутствие эффектаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
set_error_handler(static function (int $severity, string $message): bool {
    if ($severity === E_DEPRECATED) { echo "deprecated\n"; return true; }
    return false;
});
try { var_dump(imagedestroy($image)); } finally { restore_error_handler(); }
echo imagesx($image), "\n";
Ожидаемый результат
deprecated
bool(true)
8

Этот пример намеренно демонстрирует миграцию в PHP 8.5, не предлагает подавлять deprecated в приложении.

Связанные операции: imagecreatetruecolor.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

gd_infoПеред генерацией превью узнать, какие кодеки и шрифтовые возможности действительно собраны на сервере.

PHP 8: GdImage · gd

gd_info(): array

Перед генерацией превью узнать, какие кодеки и шрифтовые возможности действительно собраны на сервере.

Параметры и результатКак понимать и применять
ПараметрыНет. GD должно быть загружено. Проверка extension_loaded("gd") предшествует вызову в диагностике развёртывания.
ВозвратАссоциативный массив: GD Version; FreeType Support/FreeType Linkage; чтение и запись GIF; JPEG, PNG, WBMP, XPM, XBM, WebP, BMP, AVIF, TGA; JIS-mapped Japanese Font Support. Набор ключей зависит от версии и сборки.
Проверить PNGСамостоятельный пример
<?php
declare(strict_types=1);

$info = gd_info();
echo ($info["PNG Support"] ?? false) ? "PNG available\n" : "PNG unavailable\n";
Ожидаемый результат
PNG available

Это проверка текущей учебной сборки; на другом сервере ответ может отличаться.

Выбрать разрешённый выходной форматСамостоятельный пример
<?php
declare(strict_types=1);

$info = gd_info();
$formats = [];
foreach (["PNG Support" => "png", "JPEG Support" => "jpg"] as $key => $extension) {
    if ($info[$key] ?? false) { $formats[] = $extension; }
}
echo implode(",", $formats), "\n";
Ожидаемый результат
png,jpg

Поддержка библиотеки — необходимое условие, но не гарантия записи файла в конкретный каталог.

Связанные операции: imagetypes.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagetypesПроверить формат через битовую маску, например разрешить WebP только при наличии его поддержки.

PHP 8: GdImage · gd

imagetypes(): int

Проверить формат через битовую маску, например разрешить WebP только при наличии его поддержки.

Параметры и результатКак понимать и применять
Параметры / результатНет аргументов. int — битовое OR поддерживаемых типов IMG_GIF, IMG_JPG/IMG_JPEG, IMG_PNG, IMG_WBMP, IMG_XPM, IMG_WEBP, IMG_BMP, IMG_AVIF. Это IMG_*, не IMAGETYPE_* из getimagesize.
Проверка($types & IMG_PNG) !== 0 проверяет отдельный бит; сравнение всей маски с IMG_PNG ошибочно, если поддерживаются и другие типы.
Узнать поддержку PNGСамостоятельный пример
<?php
declare(strict_types=1);

var_dump((imagetypes() & IMG_PNG) !== 0);
Ожидаемый результат
bool(true)

Битовая операция отвечает на вопрос о возможности конкретного формата.

Выбрать JPEG для непрозрачной миниатюрыСамостоятельный пример
<?php
declare(strict_types=1);

$format = (imagetypes() & IMG_JPG) !== 0 ? "jpeg" : "png";
echo $format, "\n";
Ожидаемый результат
jpeg

Здесь выбор по поддержке; прозрачному исходнику дополнительно нужна политика фона.

Связанные операции: gd_info.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageinterlaceСохранить прогрессивный JPEG, который во время загрузки сначала показывает грубое изображение, затем детали.

PHP 8: GdImage · gd

imageinterlace(GdImage $image, ?bool $enable = null): bool

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

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
enabletrue включает, false отключает, null/пропуск только читает состояние. Для JPEG это progressive, для поддерживающих interlace форматов — чересстрочность.
ВозвратТекущее состояние bool, а не общий флаг успеха; false может означать нормальное отключённое состояние. С 8.0.5 bool вместо исторического int.
Чтение и переключениеСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
var_dump(imageinterlace($image));
var_dump(imageinterlace($image, true));
var_dump(imageinterlace($image, false));
Ожидаемый результат
bool(false)
bool(true)
bool(false)

Это настройка кодирования; пиксели не переставляются.

Сохранить прогрессивное превьюСамостоятельный пример
Прогрессивный JPEG20 × 10 пикселей · увеличение до 9× (на узком экране может уменьшаться)
Сохранить прогрессивное превью: Прогрессивный JPEGСкачать JPG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(20, 10);
imageinterlace($image, true);
imagejpeg($image, "preview.jpg", 85);
$bytes = file_get_contents("preview.jpg");
var_dump(str_contains($bytes, hex2bin("ffc2")));
Текстовая проверка результата
bool(true)

Маркер SOF2 подтверждает прогрессивный JPEG учебного кодека. Размер файла и качество сравнивают на настоящем фото.

Связанные операции: imagejpeg, imagepng.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageresolutionЗаписать DPI для печатного макета, не путая его с количеством пикселей.

PHP 8: GdImage · gd

imageresolution(GdImage $image, ?int $resolution_x = null, ?int $resolution_y = null): array|true

Записать DPI для печатного макета, не путая его с количеством пикселей.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
resolution_x, resolution_ynull/null читает [x, y]. Только x задаёт обе оси; x и y задают их отдельно. Для нового холста обычно 96 DPI. Метаданные поддерживаются PNG/JPEG; DPI не изменяет размеры и рисование.
ВозвратЧтение array из двух int; установка true. Для реального изменения размеров нужны imagescale/imagecopyresampled.
Поставить DPIСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(20, 10);
imageresolution($image, 300);
echo implode("x", imageresolution($image)), " DPI\n";
echo imagesx($image), "x", imagesy($image), " pixels\n";
Ожидаемый результат
300x300 DPI
20x10 pixels

Тот же холст станет физически меньше при печати с большим DPI; новых пикселей не появилось.

Отдельные значения осейСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imageresolution($image, 150, 300);
echo implode(",", imageresolution($image)), "\n";
Ожидаемый результат
150,300

Не делайте неравные DPI без требования устройства или печатного процесса.

Связанные операции: imagescale, imagesx, imagesy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorallocateПодготовить цвет перед рисованием фона, линии или текста.

PHP 8: GdImage · gd

imagecolorallocate(GdImage $image, int $red, int $green, int $blue): int|false

Подготовить цвет перед рисованием фона, линии или текста.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
Возвратint идентификатор/упакованный цвет либо false, если палитра заполнена. 0 — допустимый первый индекс и чёрный truecolor; проверяйте === false. В палитре выделение добавляет запись, но ещё не красит произвольные пиксели.
Выделить цвет и разобрать компонентыСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Выделить цвет и разобрать компоненты: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$color = imagecolorallocate($image, 20, 80, 120);
var_dump($color === false);
$parts = imagecolorsforindex($image, $color);
echo $parts["red"], ",", $parts["green"], ",", $parts["blue"], ",", $parts["alpha"], "\n";
Текстовая проверка результата
bool(false)
20,80,120,0

Идентификатор не строка CSS вида #145078. Передаём именно его GD-функции рисования.

Окрасить один пиксельСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Окрасить один пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagealphablending($image, false);
$color = imagecolorallocate($image, 20, 80, 120);
imagesetpixel($image, 1, 1, $color);
$pixel = imagecolorsforindex($image, imagecolorat($image, 1, 1));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
20,80,120

В truecolor с выключенным blending сохраняется исходный цвет и alpha; иначе GD смешивает его с фоном.

Связанные операции: imagecolorsforindex, imagecolorresolve, imagesetpixel.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorallocatealphaПодготовить полупрозрачный цвет для значка или водяного знака.

PHP 8: GdImage · gd

imagecolorallocatealpha(GdImage $image, int $red, int $green, int $blue, int $alpha): int|false

Подготовить полупрозрачный цвет для значка или водяного знака.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
alphaЦелое 0–127: 0 полностью непрозрачно, 127 полностью прозрачно. Это шкала GD, не CSS opacity; промежуточный alpha требует подходящего формата и режима blending/savealpha.
Возвратint идентификатор/упакованный цвет либо false, если палитра заполнена. 0 — допустимый первый индекс и чёрный truecolor; проверяйте === false. В палитре выделение добавляет запись, но ещё не красит произвольные пиксели.
Выделить цвет и разобрать компонентыСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Выделить цвет и разобрать компоненты: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$color = imagecolorallocatealpha($image, 20, 80, 120, 64);
var_dump($color === false);
$parts = imagecolorsforindex($image, $color);
echo $parts["red"], ",", $parts["green"], ",", $parts["blue"], ",", $parts["alpha"], "\n";
Текстовая проверка результата
bool(false)
20,80,120,64

Идентификатор не строка CSS вида #145078. Передаём именно его GD-функции рисования.

Окрасить один пиксельСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Окрасить один пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagealphablending($image, false);
$color = imagecolorallocatealpha($image, 20, 80, 120, 64);
imagesetpixel($image, 1, 1, $color);
$pixel = imagecolorsforindex($image, imagecolorat($image, 1, 1));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
20,80,120

В truecolor с выключенным blending сохраняется исходный цвет и alpha; иначе GD смешивает его с фоном.

Связанные операции: imagecolorsforindex, imagecolorresolvealpha, imagesetpixel.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorexactПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorexact(GdImage $image, int $red, int $green, int $blue): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
Алгоритм и результатИщет точное совпадение; возвращает индекс либо −1, если его нет. Не выделяет новый цвет.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorexact($image, 255, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorexact($image, 250, 0, 0);
echo $index === -1 ? "not in palette\n" : "found\n";
Ожидаемый результат
not in palette

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorexactalphaПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorexactalpha(GdImage $image, int $red, int $green, int $blue, int $alpha): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
alphaЦелое 0–127: 0 полностью непрозрачно, 127 полностью прозрачно. Это шкала GD, не CSS opacity; промежуточный alpha требует подходящего формата и режима blending/savealpha.
Алгоритм и результатИщет точное совпадение; возвращает индекс либо −1, если его нет. Не выделяет новый цвет.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorexactalpha($image, 255, 0, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorexactalpha($image, 250, 0, 0, 0);
echo $index === -1 ? "not in palette\n" : "found\n";
Ожидаемый результат
not in palette

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorclosestПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorclosest(GdImage $image, int $red, int $green, int $blue): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
Алгоритм и результатВозвращает индекс ближайшего цвета, а при пустой палитре −1. Ищет по расстоянию RGB.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorclosest($image, 255, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorclosest($image, 250, 0, 0);
echo $index === $red ? "red chosen\n" : "other\n";
Ожидаемый результат
red chosen

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorclosestalphaПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorclosestalpha(GdImage $image, int $red, int $green, int $blue, int $alpha): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
alphaЦелое 0–127: 0 полностью непрозрачно, 127 полностью прозрачно. Это шкала GD, не CSS opacity; промежуточный alpha требует подходящего формата и режима blending/savealpha.
Алгоритм и результатВозвращает индекс ближайшего цвета, а при пустой палитре −1. Ищет по расстоянию RGB с учётом alpha.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorclosestalpha($image, 255, 0, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorclosestalpha($image, 250, 0, 0, 0);
echo $index === $red ? "red chosen\n" : "other\n";
Ожидаемый результат
red chosen

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorclosesthwbПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorclosesthwb(GdImage $image, int $red, int $green, int $blue): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
Алгоритм и результатВозвращает индекс ближайшего цвета (при пустой палитре −1) по hue/whiteness/blackness: оттенку, белизне и черноте. Не сводите результат к простому расстоянию RGB.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorclosesthwb($image, 255, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorclosesthwb($image, 250, 0, 0);
echo $index === $red ? "red chosen\n" : "other\n";
Ожидаемый результат
red chosen

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorresolveПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorresolve(GdImage $image, int $red, int $green, int $blue): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
Алгоритм и результатСначала точное совпадение, затем выделение новой записи, а при заполненной палитре ближайшая доступная. Возвращает int, а не false.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorresolve($image, 255, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorresolve($image, 250, 0, 0);
echo imagecolorstotal($image), "\n";
echo imagecolorsforindex($image, $index)["red"], "\n";
Ожидаемый результат
3
250

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorresolvealphaПодобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

PHP 8: GdImage · gd

imagecolorresolvealpha(GdImage $image, int $red, int $green, int $blue, int $alpha): int

Подобрать цвет для ограниченной палитры, например значка GIF или схемы с фиксированными цветами.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
alphaЦелое 0–127: 0 полностью непрозрачно, 127 полностью прозрачно. Это шкала GD, не CSS opacity; промежуточный alpha требует подходящего формата и режима blending/savealpha.
Алгоритм и результатСначала точное совпадение, затем выделение новой записи, а при заполненной палитре ближайшая доступная. Возвращает int, а не false.
Граница примененияБлизость цвета не означает совпадение фирменного цвета. Для фото предпочитайте truecolor; не выполняйте повторный поиск палитры для каждого пикселя большого фото в PHP.
Найти уже имеющийся красныйСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorresolvealpha($image, 255, 0, 0, 0);
echo $index, "\n";
Ожидаемый результат
0

Первый выделенный цвет имеет индекс 0, поэтому if (!$index) ошибочно объявит неудачу.

Что произойдёт с отсутствующим оттенкомСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
$index = imagecolorresolvealpha($image, 250, 0, 0, 0);
echo imagecolorstotal($image), "\n";
echo imagecolorsforindex($image, $index)["red"], "\n";
Ожидаемый результат
3
250

Так различаются проверка существования, поиск приближения и выделение нового цвета. Выбор функции зависит от допустимости изменения палитры.

Связанные операции: imagecolorexact, imagecolorclosest, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorsforindexПосмотреть компоненты пикселя, чтобы проверить фон, прозрачность или результат фильтра.

PHP 8: GdImage · gd

imagecolorsforindex(GdImage $image, int $color): array

Посмотреть компоненты пикселя, чтобы проверить фон, прозрачность или результат фильтра.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
colorИндекс палитры либо packed-color truecolor, обычно из imagecolorat или imagecolorallocate. Число принадлежит модели конкретного изображения.
Возврат / ошибкиМассив red, green, blue (0–255), alpha (0–127). Недопустимый индекс палитры вызывает ValueError; не трактуйте индекс как RGB напрямую.
Разобрать выделенный цветСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$color = imagecolorallocatealpha($image, 10, 20, 30, 64);
echo json_encode(imagecolorsforindex($image, $color)), "\n";
Ожидаемый результат
{"red":10,"green":20,"blue":30,"alpha":64}

Надёжнее именованных компонентов нет: битовый разбор палитрового индекса даёт неверный цвет.

Проверить пиксель после рисованияСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Проверить пиксель после рисования: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 2, 1, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 2, 1));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Проверяется эффект операции, а не только её true.

Связанные операции: imagecolorat, imagecolorallocatealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecoloratПрочитать один пиксель: выбор цвета пипеткой, проверка рамки, анализ маленькой схемы.

PHP 8: GdImage · gd

imagecolorat(GdImage $image, int $x, int $y): int|false

Прочитать один пиксель: выбор цвета пипеткой, проверка рамки, анализ маленькой схемы.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
x, yЦелые координаты внутри холста. x растёт вправо, y вниз; отрицательные и выходящие за width−1/height−1 недопустимы.
Возвратint: индекс палитры либо упакованный ARGB truecolor; false при отказе, вне границ также предупреждение. Для компонентов используйте imagecolorsforindex.
Прочитать начальный чёрный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Прочитать начальный чёрный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
echo imagecolorat($image, 0, 0), "\n";
Текстовая проверка результата
0

Нулевой цвет не равен ошибке false.

Посчитать красные точки маленькой схемыСамостоятельный пример
Результат3 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Посчитать красные точки маленькой схемы: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(3, 2);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 1, 0, $red);
$count = 0;
for ($y = 0; $y < imagesy($image); $y++) {
    for ($x = 0; $x < imagesx($image); $x++) {
        if (imagecolorat($image, $x, $y) === $red) { $count++; }
    }
}
echo $count, "\n";
Текстовая проверка результата
1

Такой двойной PHP-цикл стоит O(width×height) вызовов; для преобразования фото используйте встроенные GD-операции.

Связанные операции: imagecolorsforindex, imagesetpixel.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorstotalУзнать, сколько записей занято в палитре, перед добавлением новых цветов.

PHP 8: GdImage · gd

imagecolorstotal(GdImage $image): int

Узнать, сколько записей занято в палитре, перед добавлением новых цветов.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Возвратint количества цветов палитры; для truecolor возвращается 0. Это не число уникальных видимых цветов и не оценка размера файла.
Посчитать записиСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
imagecolorallocate($image, 255, 0, 0);
imagecolorallocate($image, 0, 0, 255);
echo imagecolorstotal($image), "\n";
Ожидаемый результат
2

Цвет может быть выделен, даже если ещё не используется пикселями.

Не принять truecolor за пустую картинкуСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
echo imagecolorstotal($image), "\n";
echo imageistruecolor($image) ? "full color\n" : "palette\n";
Ожидаемый результат
0
full color

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

Связанные операции: imageistruecolor, imagetruecolortopalette.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolorsetПерекрасить сразу все пиксели одного индекса палитры, например статус на схеме.

PHP 8: GdImage · gd

imagecolorset(GdImage $image, int $color, int $red, int $green, int $blue, int $alpha = 0): ?false

Перекрасить сразу все пиксели одного индекса палитры, например статус на схеме.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
colorСуществующий индекс палитры. Меняется запись, а не конкретная координата.
red, green, blueКомпоненты RGB: целые 0–255 (0x00–0xFF). 0 — нет компонента, 255 — максимальная интенсивность. Цвет берётся в контексте конкретного холста.
alphaЦелое 0–127: 0 полностью непрозрачно, 127 полностью прозрачно. Это шкала GD, не CSS opacity; промежуточный alpha требует подходящего формата и режима blending/savealpha.
Возвратnull при успехе, false при недопустимом индексе. Не проверяйте успех через if (imagecolorset(...)); null ложноподобен.
Поменять цвет первой записиСамостоятельный пример
До изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Поменять цвет первой записи: До измененияСкачать PNG
После изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Поменять цвет первой записи: После измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$index = imagecolorallocate($image, 255, 0, 0);
var_dump(imagecolorset($image, $index, 0, 255, 0));
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
NULL
0,255,0

Все пиксели исходного фона ссылались на первый индекс и стали зелёными.

Сделать запись полупрозрачнойСамостоятельный пример
До изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сделать запись полупрозрачной: До измененияСкачать PNG
После изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сделать запись полупрозрачной: После измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$index = imagecolorallocate($image, 255, 0, 0);
imagecolorset($image, $index, 255, 0, 0, 64);
echo imagecolorsforindex($image, $index)["alpha"], "\n";
Текстовая проверка результата
64

Хранение значения в палитре и сохранение его конкретным форматом — разные вопросы.

Связанные операции: imagecolorallocate, imagecolortransparent.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolordeallocateОсвободить больше не используемую запись палитры при построении ограниченного набора цветов.

PHP 8: GdImage · gd

imagecolordeallocate(GdImage $image, int $color): true

Освободить больше не используемую запись палитры при построении ограниченного набора цветов.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
colorИндекс, выделенный в этой палитре. Пиксели, которые ещё ссылаются на него, автоматически не заменяются; дальнейшее переиспользование может поменять их вид.
Возвратbool успеха. Для truecolor отдельной палитры нет; практический смысл функция имеет с imagecreate.
Переиспользовать слот палитрыСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
imagecolorallocate($image, 0, 0, 0);
$unused = imagecolorallocate($image, 255, 0, 0);
imagecolordeallocate($image, $unused);
$new = imagecolorallocate($image, 0, 255, 0);
var_dump($new === $unused);
Ожидаемый результат
bool(true)

Освобождена не картинка, а запись цвета.

Сначала убрать ссылки пикселей на цветСамостоятельный пример
До изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сначала убрать ссылки пикселей на цвет: До измененияСкачать PNG
После изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сначала убрать ссылки пикселей на цвет: После измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$base = imagecolorallocate($image, 0, 0, 0);
$old = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 1, 1, $old);
imagesetpixel($image, 1, 1, $base);
var_dump(imagecolordeallocate($image, $old));
Текстовая проверка результата
bool(true)

В большой картинке замена каждого пикселя PHP-циклом дорога; проектируйте палитру заранее.

Связанные операции: imagecolorset, imagecolorresolve.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolortransparentНазначить один цвет прозрачным, например фон простого GIF-значка.

PHP 8: GdImage · gd

imagecolortransparent(GdImage $image, ?int $color = null): int

Назначить один цвет прозрачным, например фон простого GIF-значка.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
colorint идентификатор либо null для чтения. Новая установка заменяет предыдущий прозрачный цвет. Это один цвет целиком, не произвольный alpha каждого пикселя.
ВозвратНовый/текущий прозрачный индекс; −1, если прозрачный цвет не задан. Truecolor тоже допускается, но для полноценных полупрозрачных PNG используйте alpha.
Назначить прозрачный цветСамостоятельный пример
До изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Назначить прозрачный цвет: До измененияСкачать PNG
После изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Назначить прозрачный цвет: После измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$background = imagecolorallocate($image, 255, 0, 255);
echo imagecolortransparent($image), "\n";
imagecolortransparent($image, $background);
echo imagecolortransparent($image), "\n";
Текстовая проверка результата
-1
0

Фон исчезнет весь, поэтому такой же цвет внутри рисунка тоже станет прозрачным.

Проверить прозрачность после GIFСамостоятельный пример
Перед сохранением2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Проверить прозрачность после GIF: Перед сохранениемСкачать PNG
После сохранения и декодирования2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Проверить прозрачность после GIF: После сохранения и декодированияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(2, 2);
$bg = imagecolorallocate($image, 255, 0, 255);
imagecolortransparent($image, $bg);
imagegif($image, "icon.gif");
$loaded = imagecreatefromgif("icon.gif");
var_dump(imagecolortransparent($loaded) >= 0);
Текстовая проверка результата
bool(true)

GIF поддерживает один прозрачный индекс, но не мягкую прозрачную тень.

Связанные операции: imagecolorallocatealpha, imagesavealpha, imagegif.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagealphablendingУправлять тем, как прозрачная наклейка смешивается с фоном.

PHP 8: GdImage · gd

imagealphablending(GdImage $image, bool $enable): true

Управлять тем, как прозрачная наклейка смешивается с фоном.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
enabletrue смешивает новые пиксели с фоном (default true для truecolor), false записывает их цвет и alpha напрямую. Палитровый blending не поддерживается. При смешивании результирующий пиксель обычно непрозрачен.
Возвратbool успеха. Настройка меняет холст, а не уже записанный файл. Alpha GD 0 непрозрачно, 127 прозрачно.
Записать полупрозрачный пиксельСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Записать полупрозрачный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagealphablending($image, false);
imagesavealpha($image, true);
$color = imagecolorallocatealpha($image, 255, 0, 0, 64);
imagesetpixel($image, 0, 0, $color);
echo imagecolorsforindex($image, imagecolorat($image, 0, 0))["alpha"], "\n";
Текстовая проверка результата
64

Полупрозрачность хранится в пикселе; пока смешивание выключено, красный не превращается в тёмный красный.

Сохранить и снова прочитать прозрачный PNGСамостоятельный пример
Перед сохранением2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и снова прочитать прозрачный PNG: Перед сохранениемСкачать PNG
После сохранения и декодирования2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и снова прочитать прозрачный PNG: После сохранения и декодированияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagealphablending($image, false);
imagesavealpha($image, true);
$clear = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $clear);
imagepng($image, "clear.png");
$loaded = imagecreatefrompng("clear.png");
echo imagecolorsforindex($loaded, imagecolorat($loaded, 0, 0))["alpha"], "\n";
Текстовая проверка результата
127

Проверяется результат после кодирования, потому что флаг на исходном холсте ещё не доказывает сохранение alpha.

Связанные операции: imagesavealpha, imagecolorallocatealpha, imagecopy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesavealphaУправлять сохранением прозрачного фона после записи файла.

PHP 8: GdImage · gd

imagesavealpha(GdImage $image, bool $enable): true

Управлять сохранением прозрачного фона после записи файла.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
enabletrue просит сохранять полный alpha при кодировании; default false. Нужно также выбрать формат PNG/WebP/AVIF и отключить blending, когда записываются прозрачные пиксели. GIF/JPEG не получают полный alpha от этого флага.
Возвратbool успеха. Настройка меняет холст, а не уже записанный файл. Alpha GD 0 непрозрачно, 127 прозрачно.
Записать полупрозрачный пиксельСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Записать полупрозрачный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagealphablending($image, false);
imagesavealpha($image, true);
$color = imagecolorallocatealpha($image, 255, 0, 0, 64);
imagesetpixel($image, 0, 0, $color);
echo imagecolorsforindex($image, imagecolorat($image, 0, 0))["alpha"], "\n";
Текстовая проверка результата
64

Полупрозрачность хранится в пикселе; пока смешивание выключено, красный не превращается в тёмный красный.

Сохранить и снова прочитать прозрачный PNGСамостоятельный пример
Перед сохранением2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и снова прочитать прозрачный PNG: Перед сохранениемСкачать PNG
После сохранения и декодирования2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и снова прочитать прозрачный PNG: После сохранения и декодированияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagealphablending($image, false);
imagesavealpha($image, true);
$clear = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $clear);
imagepng($image, "clear.png");
$loaded = imagecreatefrompng("clear.png");
echo imagecolorsforindex($loaded, imagecolorat($loaded, 0, 0))["alpha"], "\n";
Текстовая проверка результата
127

Проверяется результат после кодирования, потому что флаг на исходном холсте ещё не доказывает сохранение alpha.

Связанные операции: imagealphablending, imagecolorallocatealpha, imagecopy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagelayereffectВыбрать, как следующий цвет сочетается с существующим: обычная прозрачность, замена, overlay или multiply.

PHP 8: GdImage · gd

imagelayereffect(GdImage $image, int $effect): true

Выбрать, как следующий цвет сочетается с существующим: обычная прозрачность, замена, overlay или multiply.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
effectIMG_EFFECT_REPLACE пишет без смешивания; IMG_EFFECT_ALPHABLEND/IMG_EFFECT_NORMAL — обычное alpha-смешивание; IMG_EFFECT_OVERLAY объединяет цвет как overlay; IMG_EFFECT_MULTIPLY затемняет умножением компонентов (PHP 8.0+). Требуется truecolor.
Возвратbool. Это режим последующих операций, не фильтр, который немедленно меняет всё изображение.
Режим замены сохраняет alphaСамостоятельный пример
Результат2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Режим замены сохраняет alpha: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
imagelayereffect($image, IMG_EFFECT_REPLACE);
$color = imagecolorallocatealpha($image, 255, 0, 0, 64);
imagesetpixel($image, 0, 0, $color);
echo imagecolorsforindex($image, imagecolorat($image, 0, 0))["alpha"], "\n";
Текстовая проверка результата
64

Пока ничего не рисуем, картинка не меняется.

Умножить белый фон на выбранный цветСамостоятельный пример
До изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Умножить белый фон на выбранный цвет: До измененияСкачать PNG
После операции2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Умножить белый фон на выбранный цвет: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
imagelayereffect($image, IMG_EFFECT_MULTIPLY);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 0, 0, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Для multiply белый нейтрален. Умножение на чёрный дало бы чёрный.

Связанные операции: imagealphablending, imagefilter.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagepalettetotruecolorПерейти от палитры к полноценному alpha и дальнейшему редактированию.

PHP 8: GdImage · gd

imagepalettetotruecolor(GdImage $image): bool

Перейти от палитры к полноценному alpha и дальнейшему редактированию.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
ПреобразованиеМеняет тот же объект. Возвращает bool; полноцветное изображение уже подходит и остаётся таким.

Полоса содержит четыре оттенка серого: 20, 90, 165 и 245 по каждой компоненте. Превращение палитры в truecolor меняет способ хранения, поэтому вид полосы должен сохраниться.

Четыре видимых оттенка и преобразование моделиСамостоятельный пример
До преобразования32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Четыре видимых оттенка и преобразование модели: До преобразованияСкачать PNG
После преобразования32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Четыре видимых оттенка и преобразование модели: После преобразованияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(32, 8);
$dark = imagecolorallocate($image, 20, 20, 20);
$middle = imagecolorallocate($image, 90, 90, 90);
$light = imagecolorallocate($image, 165, 165, 165);
$white = imagecolorallocate($image, 245, 245, 245);
imagefilledrectangle($image, 0, 0, 7, 7, $dark);
imagefilledrectangle($image, 8, 0, 15, 7, $middle);
imagefilledrectangle($image, 16, 0, 23, 7, $light);
imagefilledrectangle($image, 24, 0, 31, 7, $white);
imagepalettetotruecolor($image);
var_dump(imageistruecolor($image));
Текстовая проверка результата
bool(true)

Количество пикселей осталось 32 × 8. Truecolor позволяет дальше добавлять новые цвета; он не меняет уже существующие пиксели сам по себе.

Сохранить исходник и сравнить вариант с ditherСамостоятельный пример
Исходные четыре оттенка32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Сохранить исходник и сравнить вариант с dither: Исходные четыре оттенкаСкачать PNG
Вариант с dither32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Сохранить исходник и сравнить вариант с dither: Вариант с ditherСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreate(32, 8);
$dark = imagecolorallocate($image, 20, 20, 20);
$middle = imagecolorallocate($image, 90, 90, 90);
$light = imagecolorallocate($image, 165, 165, 165);
$white = imagecolorallocate($image, 245, 245, 245);
imagefilledrectangle($image, 0, 0, 7, 7, $dark);
imagefilledrectangle($image, 8, 0, 15, 7, $middle);
imagefilledrectangle($image, 16, 0, 23, 7, $light);
imagefilledrectangle($image, 24, 0, 31, 7, $white);
$original = $image;
$variant = imagecreatetruecolor(32, 8);
imagecopy($variant, $original, 0, 0, 0, 0, 32, 8);
imagetruecolortopalette($variant, true, 2);
imagepalettetotruecolor($variant);
echo imagesx($variant), "x", imagesy($variant), "\n";
Текстовая проверка результата
32x8

Теперь dither=true пытается передать промежуточные тона узором из двух доступных цветов. На увеличении видны точки, хотя отдельных оттенков в палитре всего два. Последующая imagepalettetotruecolor не убирает этот узор и не восстанавливает четыре исходных оттенка. $original хранит исходный объект; $variant создан отдельно и получает копию пикселей. Одно присваивание $variant = $original не дало бы независимой копии.

Связанные операции: imagetruecolortopalette, imagepalettecopy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagetruecolortopaletteПерейти к ограниченной палитре для маленькой схемы или GIF, осознанно потеряв часть цветов.

PHP 8: GdImage · gd

imagetruecolortopalette(GdImage $image, bool $dither, int $num_colors): bool

Перейти к ограниченной палитре для маленькой схемы или GIF, осознанно потеряв часть цветов.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
ПреобразованиеМеняет тот же объект. dither включает рассеивание ошибки цвета; num_colors задаёт желаемое число до 256. Палитра может получить меньше цветов. bool успеха; операция с уже палитровым холстом не является повторным квантованием.

Полоса содержит четыре оттенка серого: 20, 90, 165 и 245 по каждой компоненте. Попросим оставить лишь два цвета. Теперь соседние оттенки неизбежно сольются; это видимая цена сокращения палитры.

Четыре видимых оттенка и преобразование моделиСамостоятельный пример
До преобразования32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Четыре видимых оттенка и преобразование модели: До преобразованияСкачать PNG
После преобразования32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Четыре видимых оттенка и преобразование модели: После преобразованияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(32, 8);
$dark = imagecolorallocate($image, 20, 20, 20);
$middle = imagecolorallocate($image, 90, 90, 90);
$light = imagecolorallocate($image, 165, 165, 165);
$white = imagecolorallocate($image, 245, 245, 245);
imagefilledrectangle($image, 0, 0, 7, 7, $dark);
imagefilledrectangle($image, 8, 0, 15, 7, $middle);
imagefilledrectangle($image, 16, 0, 23, 7, $light);
imagefilledrectangle($image, 24, 0, 31, 7, $white);
imagetruecolortopalette($image, false, 2);
var_dump(imageistruecolor($image));
Текстовая проверка результата
bool(false)

Количество пикселей осталось 32 × 8. При dither=false четыре ровные полосы превращаются в две группы более близких оттенков. Число 2 ограничивает палитру, но не уменьшает ширину картинки.

Сохранить исходник и сравнить вариант с ditherСамостоятельный пример
Исходные четыре оттенка32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Сохранить исходник и сравнить вариант с dither: Исходные четыре оттенкаСкачать PNG
Вариант с dither32 × 8 пикселей · увеличение до 6× (на узком экране может уменьшаться)
Сохранить исходник и сравнить вариант с dither: Вариант с ditherСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(32, 8);
$dark = imagecolorallocate($image, 20, 20, 20);
$middle = imagecolorallocate($image, 90, 90, 90);
$light = imagecolorallocate($image, 165, 165, 165);
$white = imagecolorallocate($image, 245, 245, 245);
imagefilledrectangle($image, 0, 0, 7, 7, $dark);
imagefilledrectangle($image, 8, 0, 15, 7, $middle);
imagefilledrectangle($image, 16, 0, 23, 7, $light);
imagefilledrectangle($image, 24, 0, 31, 7, $white);
$original = $image;
$variant = imagecreatetruecolor(32, 8);
imagecopy($variant, $original, 0, 0, 0, 0, 32, 8);
imagetruecolortopalette($variant, true, 2);
echo imagesx($variant), "x", imagesy($variant), "\n";
Текстовая проверка результата
32x8

Теперь dither=true пытается передать промежуточные тона узором из двух доступных цветов. На увеличении видны точки, хотя отдельных оттенков в палитре всего два. Сравните ровные участки предыдущего примера и узор здесь. Для маленькой пиксельной схемы узор может мешать; для некоторых градиентов он смягчает полосы. $original хранит исходный объект; $variant создан отдельно и получает копию пикселей. Одно присваивание $variant = $original не дало бы независимой копии.

Связанные операции: imagepalettetotruecolor, imagepalettecopy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagepalettecopyСогласовать палитры двух схем перед операциями, в которых важны те же индексы цветов.

PHP 8: GdImage · gd

imagepalettecopy(GdImage $dst, GdImage $src): void

Согласовать палитры двух схем перед операциями, в которых важны те же индексы цветов.

Параметры и результатКак понимать и применять
dst, srcДва GdImage: палитра источника копируется в назначение. Сопоставление цветов назначения обновляется; пиксели источника не копируются.
Возвратvoid. Проверяйте палитру/пиксели назначения, а не bool результата.
Скопировать палитруСамостоятельный пример
Образец2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Скопировать палитру: ОбразецСкачать PNG
Получатель до изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Скопировать палитру: Получатель до измененияСкачать PNG
Получатель после изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Скопировать палитру: Получатель после измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreate(2, 2);
imagecolorallocate($source, 255, 0, 0);
imagecolorallocate($source, 0, 0, 255);
$target = imagecreate(2, 2);
imagecolorallocate($target, 0, 0, 0);
imagepalettecopy($target, $source);
echo imagecolorstotal($target), "\n";
Текстовая проверка результата
2

Это операция над таблицей цветов, не imagecopy.

Найти цвет после согласованияСамостоятельный пример
Образец2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Найти цвет после согласования: ОбразецСкачать PNG
Получатель до изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Найти цвет после согласования: Получатель до измененияСкачать PNG
Получатель после изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Найти цвет после согласования: Получатель после измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreate(2, 2);
imagecolorallocate($source, 255, 0, 0);
$target = imagecreate(2, 2);
imagecolorallocate($target, 255, 0, 0);
imagepalettecopy($target, $source);
echo imagecolorexact($target, 255, 0, 0), "\n";
Текстовая проверка результата
0

Для фотографии такая палитровая работа обычно не нужна.

Связанные операции: imagecopy, imagecolorexact.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecolormatchПодстроить цвета квантованной палитровой версии ближе к исходному полноцветному изображению.

PHP 8: GdImage · gd

imagecolormatch(GdImage $image1, GdImage $image2): true

Подстроить цвета квантованной палитровой версии ближе к исходному полноцветному изображению.

Параметры и результатКак понимать и применять
image1, image2Первое строго truecolor, второе строго palette, размеры должны совпадать. Сопоставляются пиксели и усредняются подходящие цвета палитры image2.
Возврат / ошибкиtrue; неправильная модель/размеры или пустая палитра вызывают ValueError. Это не поиск похожих изображений и не изменение image1.
Уточнить один цвет палитрыСамостоятельный пример
Образец2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уточнить один цвет палитры: ОбразецСкачать PNG
Получатель до изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уточнить один цвет палитры: Получатель до измененияСкачать PNG
Получатель после изменения2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уточнить один цвет палитры: Получатель после измененияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(2, 2);
imagefill($source, 0, 0, imagecolorallocate($source, 200, 10, 20));
$target = imagecreate(2, 2);
imagecolorallocate($target, 180, 0, 0);
var_dump(imagecolormatch($source, $target));
echo imagecolorsforindex($target, 0)["red"], "\n";
Текстовая проверка результата
bool(true)
200

Палитра назначения стала ближе к среднему цвету области исходника.

Проверить размеры до сопоставленияСамостоятельный пример
<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
$target = imagecreate(2, 2);
imagecolorallocate($target, 0, 0, 0);
echo imagesx($source) === imagesx($target) && imagesy($source) === imagesy($target) ? "match allowed\n" : "resize first\n";
Ожидаемый результат
resize first

Отдельно проверяются модели через imageistruecolor. Масштабирование — явный шаг до цветового сопоставления.

Связанные операции: imagetruecolortopalette, imagepalettecopy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesetpixelПоставить один пиксель: индикатор на схеме, маска или учебная пипетка.

PHP 8: GdImage · gd

imagesetpixel(GdImage $image, int $x, int $y, int $color): true

Поставить один пиксель: индикатор на схеме, маска или учебная пипетка.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатx, y — целые координаты пикселя; color — цвет этой картинки. Возвращает bool. За пределами холста не используйте результат как доказательство рисования.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 2, 2, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 2, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Проверочная точка на пиксельной сеткеСамостоятельный пример
Результат240 × 120 пикселей
Проверочная точка на пиксельной сетке: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagesetpixel($image, 20, 20, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Один пиксель при натуральном размере очень мал. Для заметного статуса интерфейса нужен круг или HTML-элемент; setpixel нужен точной сетке, маске и анализу. Откройте PNG и увеличьте область (20,20), чтобы увидеть выбранную точку. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagelineНарисовать ось графика или соединение блоков.

PHP 8: GdImage · gd

imageline(GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): true

Нарисовать ось графика или соединение блоков.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатx1, y1 и x2, y2 — начало и конец (включая конечные точки); color — обычный цвет или IMG_COLOR_STYLED/BRUSHED/STYLEDBRUSHED. Возвращает true.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imageline($image, 1, 2, 6, 2, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Разделитель над ценойСамостоятельный пример
Результат240 × 120 пикселей
Разделитель над ценой: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imageline($image, 16, 55, 224, 55, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Пара (16,55) — начало, (224,55) — конец линии. Обе точки находятся на одной высоте, поэтому разделитель горизонтальный. Подпись ниже остаётся независимым элементом. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagerectangleОбвести область товара рамкой, сохранив изображение внутри.

PHP 8: GdImage · gd

imagerectangle(GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): true

Обвести область товара рамкой, сохранив изображение внутри.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатx1, y1 и x2, y2 — противоположные углы; обе границы включены. color — цвет контура. Возвращает true. Для площади используйте filled-вариант.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagerectangle($image, 1, 1, 6, 4, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 1, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Рамка карточки без перекрытия текстаСамостоятельный пример
Результат240 × 120 пикселей
Рамка карточки без перекрытия текста: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagerectangle($image, 8, 8, 231, 111, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Рамка обводит область, но не закрашивает её середину: надпись читается. Чтобы сделать рамку толще, перед вызовом задайте imagesetthickness; отступ нужен, иначе часть толщины может уйти за край. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefilledrectangleНарисовать плашку под подпись или заполнить фон.

PHP 8: GdImage · gd

imagefilledrectangle(GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): true

Нарисовать плашку под подпись или заполнить фон.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатx1, y1 и x2, y2 — противоположные углы включительно; color — цвет или поддерживаемый специальный заполнитель. Возвращает true. Прямоугольник ширины 8 от нуля заканчивается на x=7.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image, 1, 1, 6, 4, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Цветная полоса категорииСамостоятельный пример
Результат240 × 120 пикселей
Цветная полоса категории: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagefilledrectangle($image, 0, 0, 239, 30, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Полоса занимает строки 0..30 включительно, то есть 31 пиксель по высоте. Для ровно 30 пикселей последняя координата была бы 29. Слова находятся ниже и не закрываются. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageellipseОбвести круглый маркер или овал на схеме.

PHP 8: GdImage · gd

imageellipse(GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): true

Обвести круглый маркер или овал на схеме.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатcenter_x, center_y — центр; width, height — полные диаметры, не радиусы; color — контур. Возвращает true.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imageellipse($image, 4, 3, 4, 4, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 6, 3));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Контур вокруг значка наличияСамостоятельный пример
Результат240 × 120 пикселей
Контур вокруг значка наличия: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imageellipse($image, 200, 78, 52, 36, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Это овал: центр (200,78), полный размер 52 × 36. Числа не задают координату противоположного угла. Внутри остаётся фон; для заполненного статуса выберите imagefilledellipse. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefilledellipseНарисовать заполненный статус или круглую точку.

PHP 8: GdImage · gd

imagefilledellipse(GdImage $image, int $center_x, int $center_y, int $width, int $height, int $color): true

Нарисовать заполненный статус или круглую точку.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатcenter_x, center_y — центр; width, height — полные диаметры; color — заливка. Возвращает true. Круг получается при равных диаметрах.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledellipse($image, 4, 3, 4, 4, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 4, 3));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Круглый индикатор статусаСамостоятельный пример
Результат240 × 120 пикселей
Круглый индикатор статуса: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagefilledellipse($image, 205, 78, 28, 28, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Диаметр 28 даёт радиус 14. Рядом с цветной точкой нужен текст статуса, чтобы смысл не зависел только от цвета. Для другой формы измените один диаметр. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagearcНарисовать часть круглой шкалы без заполнения сектора.

PHP 8: GdImage · gd

imagearc(GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color): true

Нарисовать часть круглой шкалы без заполнения сектора.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатcenter_x, center_y — центр; width, height — диаметры; start_angle, end_angle — градусы: 0 справа (3 часа), рост по часовой стрелке. color — цвет. Возвращает true.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagearc($image, 4, 3, 4, 4, 0, 180, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 6, 3));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Дуга индикатора выполненияСамостоятельный пример
Результат240 × 120 пикселей
Дуга индикатора выполнения: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagearc($image, 195, 66, 64, 64, 0, 270, $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Дуга идёт от правой точки по часовой стрелке на три четверти круга. Углы — градусы; 270 здесь иллюстрирует 75% полного оборота. Для переменного процента угол вычисляется как percent × 360 / 100. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefilledarcНарисовать сектор диаграммы или часть заполненного круга.

PHP 8: GdImage · gd

imagefilledarc(GdImage $image, int $center_x, int $center_y, int $width, int $height, int $start_angle, int $end_angle, int $color, int $style): true

Нарисовать сектор диаграммы или часть заполненного круга.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатcenter_x, center_y — центр, width, height — диаметры; углы в градусах, 0 справа, ход по часовой стрелке; color — цвет, style — маска. PIE (ROUNDED) и CHORD альтернативны; CHORD замыкает прямой хордой. NOFILL рисует контур; EDGED вместе с NOFILL добавляет радиусы. Возвращает true.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledarc($image, 4, 3, 4, 4, 0, 180, $red, IMG_ARC_PIE);
$pixel = imagecolorsforindex($image, imagecolorat($image, 4, 3));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Сектор: три четверти планаСамостоятельный пример
Результат240 × 120 пикселей
Сектор: три четверти плана: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagefilledarc($image, 195, 62, 70, 70, 0, 270, $red, IMG_ARC_PIE);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

PIE соединяет концы дуги с центром, получая сектор. CHORD замкнул бы их прямой хордой. Подпишите значение отдельно: площадь цветного сектора сама по себе не сообщает число. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagepolygonЗамкнуть контур многоугольника, например зону на плане.

PHP 8: GdImage · gd

imagepolygon(GdImage $image, array $points, int $color): bool

Замкнуть контур многоугольника, например зону на плане.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатpoints — плоский массив [x0, y0, x1, y1,...], минимум 3 вершины, чётное число элементов; color — цвет. Используйте 3 аргумента; отдельный num_points в старой 4-аргументной форме deprecated с 8.1, named arguments для перегрузки не поддерживаются. Возвращает bool, неверная структура вызывает ValueError.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagepolygon($image, [1, 1, 6, 1, 3, 4], $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 1));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Контур треугольного указателяСамостоятельный пример
Результат240 × 120 пикселей
Контур треугольного указателя: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagepolygon($image, [170, 25, 225, 55, 170, 85], $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Массив читается попарно: первая вершина (170,25), вторая (225,55), третья (170,85). Функция сама соединяет последнюю с первой. Координаты можно менять независимо от текста. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageopenpolygonНарисовать ломаную, например путь, который не надо замыкать к началу.

PHP 8: GdImage · gd

imageopenpolygon(GdImage $image, array $points, int $color): bool

Нарисовать ломаную, например путь, который не надо замыкать к началу.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатpoints — плоские пары координат, минимум 2 вершины; color — цвет. Последняя точка не соединяется с первой. Используйте 3 аргумента, num_points deprecated с 8.1; named arguments перегрузки не поддерживаются. bool; ValueError при некорректном числе координат.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imageopenpolygon($image, [1, 1, 6, 1, 3, 4], $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 1));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Ломаная маршрута без замыканияСамостоятельный пример
Результат240 × 120 пикселей
Ломаная маршрута без замыкания: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imageopenpolygon($image, [15, 20, 75, 45, 140, 20, 225, 45], $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Четыре точки соединены по порядку. Конец (225,45) не возвращается к началу (15,20), поэтому лишней диагонали нет. Этот вариант подходит траектории или графику. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefilledpolygonЗаполнить зону на карте или треугольный указатель.

PHP 8: GdImage · gd

imagefilledpolygon(GdImage $image, array $points, int $color): bool

Заполнить зону на карте или треугольный указатель.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
Аргументы / результатpoints — плоские пары, минимум 3 вершины, чётное число координат; color — цвет/заполнитель. 3 аргумента вместо deprecated num_points; не используйте named arguments для перегрузки. Возвращает bool, ошибочные точки дают ValueError.
Координаты и состояниеНачало слева сверху, x вправо, y вниз. За клип-областью пиксели не меняются; предварительные thickness/style/blending могут изменить вид результата. Дробные расчёты явно округляйте к int.
Нарисовать и проверить выбранный пиксельСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Нарисовать и проверить выбранный пиксель: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledpolygon($image, [1, 1, 6, 1, 3, 4], $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Холст 8×6; красная компонента 255 подтверждает попадание фигуры в нужную точку.

Заполненный указатель на карточкеСамостоятельный пример
Результат240 × 120 пикселей
Заполненный указатель на карточке: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(240, 120);
$background = imagecolorallocate($image, 242, 247, 250);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 20, 40, 55);
imagestring($image, 4, 16, 74, "CUP / 1290 RUB", $ink);
imagefilledpolygon($image, [170, 25, 225, 55, 170, 85], $red);
imagepng($image, "shape.png");
echo "shape.png 240x120\n";
Текстовая проверка результата
shape.png 240x120

Те же три вершины дают уже заполненную область. Самопересекающиеся точки делают заливку менее очевидной: начинайте с простой формы и проверяйте контур. Получился отдельный файл для карточки товара; используйте его размеры как явные ограничения для координат.

Связанные операции: imagecolorallocate, imagesetthickness, imagesetclip.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefillЗалить связную область одного цвета от выбранной точки, как инструмент «ведро» в редакторе.

PHP 8: GdImage · gd

imagefill(GdImage $image, int $x, int $y, int $color): true

Залить связную область одного цвета от выбранной точки, как инструмент «ведро» в редакторе.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
x, y, colorНачальная точка внутри изображения; заменяется связная область её цвета. color — новый цвет или IMG_COLOR_TILED. Не означает «всегда залить весь холст». Возвращает bool.
ПрактикаДля гарантированного прямоугольного фона используйте imagefilledrectangle. Точечная flood-fill зависит от замкнутости границ и режима alpha.
Залить весь одноцветный холстСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Залить весь одноцветный холст: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Залить весь одноцветный холст: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$red = imagecolorallocate($image, 255, 0, 0);
imagefill($image, 0, 0, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 7, 5));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Все чёрные пиксели связаны и перекрашиваются.

Ограничить заливку закрытой рамкойСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Ограничить заливку закрытой рамкой: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Ограничить заливку закрытой рамкой: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);
imagerectangle($image, 1, 1, 6, 4, $white);
imagefill($image, 2, 2, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,0,0
255,0,0

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

Связанные операции: imagefilltoborder, imagefilledrectangle.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefilltoborderЗаполнить область до границы определённого цвета, даже если внутри встречаются разные цвета.

PHP 8: GdImage · gd

imagefilltoborder(GdImage $image, int $x, int $y, int $border_color, int $color): true

Заполнить область до границы определённого цвета, даже если внутри встречаются разные цвета.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
x, y, border, colorСтартовая точка; border — цвет, на котором заливка останавливается; color — новая заливка. Рамка должна быть непрерывной. Возвращает true.
Отличиеimagefill следует равенству исходного цвета, filltoborder следует цвету границы. Сглаженная граница содержит несколько оттенков и может не удержать такую заливку.
Залить до белой рамкиСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Залить до белой рамки: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Залить до белой рамки: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$border = imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);
imagerectangle($image, 1, 1, 6, 4, $border);
imagefilltoborder($image, 2, 2, $border, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Белая линия остаётся границей, а не заменяемой областью.

Сохранить пиксели вне контураСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить пиксели вне контура: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить пиксели вне контура: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$border = imagecolorallocate($image, 255, 255, 255);
$red = imagecolorallocate($image, 255, 0, 0);
imagerectangle($image, 1, 1, 6, 4, $border);
imagefilltoborder($image, 2, 2, $border, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,0,0

Работает для небольших схем; не воспринимайте как устойчивое выделение объекта на фотографии.

Связанные операции: imagefill, imagerectangle.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesetthicknessСделать линию графика заметнее, задав толщину до рисования.

PHP 8: GdImage · gd

imagesetthickness(GdImage $image, int $thickness): true

Сделать линию графика заметнее, задав толщину до рисования.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
thicknessЦелая толщина в пикселях для линий, прямоугольников, дуг и контуров полигонов. Практически задавайте положительное число. Начальная толщина 1.
Возвратtrue. Меняет состояние последующих операций, не перерисовывает существующие линии; antialias не поддерживает thickness.
Толстая горизонтальная линияСамостоятельный пример
Результат9 × 9 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Толстая горизонтальная линия: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(9, 9);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetthickness($image, 3);
imageline($image, 1, 4, 7, 4, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 4, 3));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Соседний с центральной осью пиксель тоже закрашен.

Сбросить состояние для следующего элементаСамостоятельный пример
Результат9 × 9 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сбросить состояние для следующего элемента: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(9, 9);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetthickness($image, 3);
imageline($image, 0, 2, 8, 2, $red);
imagesetthickness($image, 1);
imageline($image, 0, 6, 8, 6, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 4, 5));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,0,0

Если забыть сброс, тонкая сетка графика тоже станет толстой.

Связанные операции: imageline, imageantialias.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesetstyleЗадать пунктир, чередование цветов или пропуски для линии графика.

PHP 8: GdImage · gd

imagesetstyle(GdImage $image, array $style): bool

Задать пунктир, чередование цветов или пропуски для линии графика.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
styleНепустой массив цветов пикселей; IMG_COLOR_TRANSPARENT оставляет пропуск. Рисовать затем с IMG_COLOR_STYLED; для включения/выключения кисти — IMG_COLOR_STYLEDBRUSHED.
Возврат / ошибкиbool; пустой массив недопустим. Стиль циклически повторяется по линии; это не CSS dasharray в геометрических единицах.
Красный пиксель через одинСамостоятельный пример
Результат8 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Красный пиксель через один: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 2);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetstyle($image, [$red, IMG_COLOR_TRANSPARENT]);
imageline($image, 0, 0, 7, 0, IMG_COLOR_STYLED);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 1, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Прозрачный элемент стиля пропускает рисование, а не присваивает alpha127.

Чередовать цвета легендыСамостоятельный пример
Результат8 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Чередовать цвета легенды: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 2);
$red = imagecolorallocate($image, 255, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);
imagesetstyle($image, [$red, $red, $blue, $blue]);
imageline($image, 0, 0, 7, 0, IMG_COLOR_STYLED);
$pixel = imagecolorsforindex($image, imagecolorat($image, 2, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,0,255

Одинаковый шаблон повторяется, пока хватает линии.

Связанные операции: imageline, imagedashedline, imagesetbrush.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagedashedlineПрочитать старый код пунктирной линии и заменить его явным стилем.

PHP 8: GdImage · gd

imagedashedline(GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): true

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

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
x1, y1, x2, y2, colorНачало, конец, цвет; координата (0,0) слева сверху. Возвращает true. Официальная документация помечает как устаревший способ, рекомендует imagesetstyle + imageline.
Старый пунктир остаётся доступнымСамостоятельный пример
Результат20 × 2 пикселей · увеличение до 9× (на узком экране может уменьшаться)
Старый пунктир остаётся доступным: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(20, 2);
$red = imagecolorallocate($image, 255, 0, 0);
var_dump(imagedashedline($image, 0, 0, 19, 0, $red));
Текстовая проверка результата
bool(true)

Длина штрихов не настраивается этим вызовом.

Управляемый пунктир вместо старой функцииСамостоятельный пример
Результат8 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Управляемый пунктир вместо старой функции: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 2);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetstyle($image, [$red, $red, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT]);
imageline($image, 0, 0, 7, 0, IMG_COLOR_STYLED);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 2, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Стиль описывает нужный рисунок непосредственно, поэтому его проще менять.

Связанные операции: imagesetstyle, imageline.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesetbrushИспользовать изображение как кисть для линий при построении схемы.

PHP 8: GdImage · gd

imagesetbrush(GdImage $image, GdImage $brush): true

Использовать изображение как кисть для линий при построении схемы.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
brush / tileВторой GdImage задаёт рисунок; затем IMG_COLOR_BRUSHED используется вместо обычного color. Для кисти со стилем доступен IMG_COLOR_STYLEDBRUSHED; tile может иметь прозрачный цвет.
Возврат / срок жизниtrue. Храните ссылку на объект кисти/плитки всё время использования; после его освобождения не рисуйте специальным цветом до назначения нового.
Применить одноцветный образецСамостоятельный пример
Кисть1 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Применить одноцветный образец: КистьСкачать PNG
Рисунок с образцом8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Применить одноцветный образец: Рисунок с образцомСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$pattern = imagecreatetruecolor(1, 1);
imagefill($pattern, 0, 0, imagecolorallocate($pattern, 255, 0, 0));
imagesetbrush($image, $pattern);
imageline($image, 1, 2, 6, 2, IMG_COLOR_BRUSHED);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Однопиксельный образец понятен для начала; более крупный создаёт узор или штамп.

Сохранить результат с узоромСамостоятельный пример
Кисть1 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить результат с узором: КистьСкачать PNG
Рисунок с образцом8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить результат с узором: Рисунок с образцомСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$pattern = imagecreatetruecolor(1, 1);
imagefill($pattern, 0, 0, imagecolorallocate($pattern, 255, 0, 0));
imagesetbrush($image, $pattern);
imageline($image, 1, 2, 6, 2, IMG_COLOR_BRUSHED);
imagepng($image, "pattern.png");
echo getimagesize("pattern.png")["mime"], "\n";
Текстовая проверка результата
image/png

Сначала завершаем рисование, потом освобождаем pattern. Файл не содержит ссылку на объект GD.

Связанные операции: imagesetstyle, imageline.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesettileИспользовать изображение как повторяющаяся плитка для заливки при построении схемы.

PHP 8: GdImage · gd

imagesettile(GdImage $image, GdImage $tile): true

Использовать изображение как повторяющаяся плитка для заливки при построении схемы.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
brush / tileВторой GdImage задаёт рисунок; затем IMG_COLOR_TILED используется вместо обычного color. Для кисти со стилем доступен IMG_COLOR_STYLEDBRUSHED; tile может иметь прозрачный цвет.
Возврат / срок жизниtrue. Храните ссылку на объект кисти/плитки всё время использования; после его освобождения не рисуйте специальным цветом до назначения нового.
Применить одноцветный образецСамостоятельный пример
Плитка1 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Применить одноцветный образец: ПлиткаСкачать PNG
Рисунок с образцом8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Применить одноцветный образец: Рисунок с образцомСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$pattern = imagecreatetruecolor(1, 1);
imagefill($pattern, 0, 0, imagecolorallocate($pattern, 255, 0, 0));
imagesettile($image, $pattern);
imagefilledrectangle($image, 1, 1, 6, 4, IMG_COLOR_TILED);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Однопиксельный образец понятен для начала; более крупный создаёт узор или штамп.

Сохранить результат с узоромСамостоятельный пример
Плитка1 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить результат с узором: ПлиткаСкачать PNG
Рисунок с образцом8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить результат с узором: Рисунок с образцомСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$pattern = imagecreatetruecolor(1, 1);
imagefill($pattern, 0, 0, imagecolorallocate($pattern, 255, 0, 0));
imagesettile($image, $pattern);
imagefilledrectangle($image, 1, 1, 6, 4, IMG_COLOR_TILED);
imagepng($image, "pattern.png");
echo getimagesize("pattern.png")["mime"], "\n";
Текстовая проверка результата
image/png

Сначала завершаем рисование, потом освобождаем pattern. Файл не содержит ссылку на объект GD.

Связанные операции: imagesetstyle, imagefill.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageantialiasСгладить ступеньки тонкой диагональной линии на непрозрачной схеме.

PHP 8: GdImage · gd

imageantialias(GdImage $image, bool $enable): true

Сгладить ступеньки тонкой диагональной линии на непрозрачной схеме.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
enablebool включает/выключает быстрое сглаживание линий и контурных полигонов. Работает только с truecolor; alpha, толщина и стиль не поддерживаются.
Возврат / ограничениеtrue. Прямое смешивание с фоном может дать ореолы на прозрачности; это не универсальное сглаживание каждого примитива/текста.
Включить сглаживаниеСамостоятельный пример
Результат12 × 12 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Включить сглаживание: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(12, 12);
var_dump(imageantialias($image, true));
$red = imagecolorallocate($image, 255, 0, 0);
imageline($image, 1, 1, 10, 7, $red);
echo imagesx($image), "\n";
Текстовая проверка результата
bool(true)
12

Сравнивайте края на реальном размере; сглаживание меняет соседние пиксели.

Отключить перед точной пиксельной схемойСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Отключить перед точной пиксельной схемой: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imageantialias($image, false);
$red = imagecolorallocate($image, 255, 0, 0);
imageline($image, 1, 2, 6, 2, $red);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Для pixel-art промежуточные оттенки нежелательны.

Связанные операции: imagesetthickness, imagesetstyle.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesetclipОграничить рисование областью графика и не закрасить подписи вокруг него.

PHP 8: GdImage · gd

imagesetclip(GdImage $image, int $x1, int $y1, int $x2, int $y2): true

Ограничить рисование областью графика и не закрасить подписи вокруг него.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
ОбластьЧетыре целые границы x1, y1, x2, y2 включительно. Начальный clip охватывает весь холст. imagesetclip возвращает bool; imagegetclip возвращает [x1, y1, x2, y2]. Клип ограничивает рисование и чтение imagecolorat; перед чтением снаружи восстановите полный clip. Он не меняет размеры и не обрезает файл.
Поставить и прочитать clipСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetclip($image, 1, 1, 6, 4);
echo implode(",", imagegetclip($image)), "\n";
Ожидаемый результат
1,1,6,4

Границы относятся к текущему холсту; начало координат не переносится.

Убедиться, что вне clip цвет не меняетсяСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Убедиться, что вне clip цвет не меняется: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetclip($image, 1, 1, 6, 4);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image, 0, 0, 7, 5, $red);
imagesetclip($image, 0, 0, imagesx($image) - 1, imagesy($image) - 1);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,0,0
255,0,0

После области графика clip возвращён на весь холст, чтобы подписи снова рисовались.

Связанные операции: imagegetclip, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegetclipОграничить рисование областью графика и не закрасить подписи вокруг него.

PHP 8: GdImage · gd

imagegetclip(GdImage $image): array

Ограничить рисование областью графика и не закрасить подписи вокруг него.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
ОбластьЧетыре целые границы x1, y1, x2, y2 включительно. Начальный clip охватывает весь холст. imagesetclip возвращает bool; imagegetclip возвращает [x1, y1, x2, y2]. Клип ограничивает рисование и чтение imagecolorat; перед чтением снаружи восстановите полный clip. Он не меняет размеры и не обрезает файл.
Поставить и прочитать clipСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetclip($image, 1, 1, 6, 4);
echo implode(",", imagegetclip($image)), "\n";
Ожидаемый результат
1,1,6,4

Границы относятся к текущему холсту; начало координат не переносится.

Убедиться, что вне clip цвет не меняетсяСамостоятельный пример
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Убедиться, что вне clip цвет не меняется: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetclip($image, 1, 1, 6, 4);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image, 0, 0, 7, 5, $red);
imagesetclip($image, 0, 0, imagesx($image) - 1, imagesy($image) - 1);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,0,0
255,0,0

После области графика clip возвращён на весь холст, чтобы подписи снова рисовались.

Связанные операции: imagesetclip, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecopyВставить логотип или фрагмент изображения в другой холст без изменения масштаба.

PHP 8: GdImage · gd

imagecopy(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height): true

Вставить логотип или фрагмент изображения в другой холст без изменения масштаба.

Параметры и результатКак понимать и применять
dst_image, src_imageНазначение меняется, источник читается. Оба GdImage; не пути. Для перекрывающихся областей одного холста проще подготовить отдельный промежуточный объект.
Прямоугольникиdst_x, dst_y — куда вставить; src_x, src_y — откуда брать; src_width, src_height — размер копируемой области, без масштабирования.
ОсобенностиУчитывайте alpha/blending назначения. Для полной независимой копии создайте новый холст и перенесите все пиксели.
Возвратtrue. Это изменение объекта назначения; файл появится только после imagepng/imagejpeg. Сохраняйте разумные положительные размеры и проверяйте границы.

Вставка картинки похожа на перенос наклейки на лист: есть два холста, а меняется только тот, на который наклеивают.

В imagecopy($image, $source, 2, 1, 0, 0, 4, 4) первые два аргумента — куда и откуда. Пара 2,1 задаёт левый верхний угол вставки на $image; пара 0,0 — начало выбранного участка $source; последние 4,4 — его ширина и высота. Возвращаемый true — статус, а пиксели находятся в $image.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Перенести красную областьСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagecopy($image, $source, 2, 1, 0, 0, 4, 4);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Внутри вставки красный, вне её исходный чёрный фон.

Получить файл композицииСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить файл композиции: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить файл композиции: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить файл композиции: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagecopy($image, $source, 2, 1, 0, 0, 4, 4);
imagepng($image, "composition.png");
echo getimagesize("composition.png")[0], "x", getimagesize("composition.png")[1], "\n";
Текстовая проверка результата
8x6

В рабочем проекте загрузка, расчёт координат, композиция и кодирование остаются явными шагами.

Следующий шаг: Разместить логотип или подготовленную подпись поверх карточки. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Наложить отдельную отметку SALE на карточкуСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Наложить отдельную отметку SALE на карточку: Исходная карточка товараСкачать PNG
Отдельная плашка SALE44 × 18 пикселей
Практика: Наложить отдельную отметку SALE на карточку: Отдельная плашка SALEСкачать PNG
После обработки160 × 120 пикселей
Практика: Наложить отдельную отметку SALE на карточку: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$stamp = imagecreatetruecolor(44, 18);
imagefill($stamp, 0, 0, imagecolorallocate($stamp, 255, 205, 75));
imagestring($stamp, 2, 6, 3, "SALE", imagecolorallocate($stamp, 40, 40, 40));
imagecopy($image, $stamp, 100, 64, 0, 0, 44, 18);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Исходная карточка и маленькая плашка подготовлены отдельно. Координаты 100,64 задают место внизу справа от корпуса; плашка 44×18 пересекается с товаром, поэтому видно, как работает наложение. imagecopy переносит непрозрачную плашку целиком. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecopyresampled, imagealphablending, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecopymergeСмешать непрозрачную плашку с фоном с заданной общей интенсивностью.

PHP 8: GdImage · gd

imagecopymerge(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): true

Смешать непрозрачную плашку с фоном с заданной общей интенсивностью.

Параметры и результатКак понимать и применять
dst_image, src_imageНазначение меняется, источник читается. Оба GdImage; не пути. Для перекрывающихся областей одного холста проще подготовить отдельный промежуточный объект.
Прямоугольникиdst_x, dst_y — куда вставить; src_x, src_y — откуда брать; src_width, src_height — размер копируемой области, без масштабирования.
Особенностиpct — целое 0–100: 0 без вклада источника,100 полная копия. Не заменяет правильную работу полного alpha; для прозрачного PNG-логотипа обычно imagecopy и blending.
Возвратtrue. Это изменение объекта назначения; файл появится только после imagepng/imagejpeg. Сохраняйте разумные положительные размеры и проверяйте границы.

Нужно, чтобы сквозь цветную плашку был виден фон: источник должен участвовать в результате лишь частично.

Последний аргумент pct — процент вклада источника:100 означает полную вставку,50 смешивает его с назначением. Координаты и размеры до процента читаются так же, как у imagecopy. Это общий процент плашки, не прозрачность каждого пикселя PNG.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Перенести красную областьСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagecopymerge($image, $source, 2, 1, 0, 0, 4, 4, 100);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Внутри вставки красный, вне её исходный чёрный фон.

Смешать красную плашку с цветным фоном на 50%Самостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смешать красную плашку с цветным фоном на50%: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смешать красную плашку с цветным фоном на50%: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смешать красную плашку с цветным фоном на50%: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 80, 220));
imagecopymerge($image, $source, 2, 1, 0, 0, 4, 4, 50);
imagepng($image, "composition.png");
echo getimagesize("composition.png")[0], "x", getimagesize("composition.png")[1], "\n";
Текстовая проверка результата
8x6

Снаружи прямоугольника сохраняется синий фон; внутри участвуют и фон, и красный источник. Процент 50 относится ко всему источнику; это не альфа каждого пикселя. Сравните второй пример imagecopymergegray: там фон под плашкой предварительно теряет цвет.

Следующий шаг: Сделать цветную подложку или отметку поверх уже нарисованной карточки. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Наложить отдельную отметку SALE на карточкуСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Наложить отдельную отметку SALE на карточку: Исходная карточка товараСкачать PNG
Отдельная плашка SALE44 × 18 пикселей
Практика: Наложить отдельную отметку SALE на карточку: Отдельная плашка SALEСкачать PNG
После обработки160 × 120 пикселей
Практика: Наложить отдельную отметку SALE на карточку: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$stamp = imagecreatetruecolor(44, 18);
imagefill($stamp, 0, 0, imagecolorallocate($stamp, 255, 205, 75));
imagestring($stamp, 2, 6, 3, "SALE", imagecolorallocate($stamp, 40, 40, 40));
imagecopymerge($image, $stamp, 100, 64, 0, 0, 44, 18, 60);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Исходная карточка и маленькая плашка подготовлены отдельно. Координаты 100,64 задают место внизу справа от корпуса; плашка 44×18 пересекается с товаром, поэтому видно, как работает наложение. Вклад источника 60% позволяет увидеть фон под плашкой; для непрозрачного читаемого ценника такой эффект может быть не нужен. Цвета фона участвуют в смешивании. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecopyresampled, imagealphablending, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecopymergegrayНаложить источник, обесцветив фон под ним: эффект акцента на цветном объекте.

PHP 8: GdImage · gd

imagecopymergegray(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_width, int $src_height, int $pct): true

Наложить источник, обесцветив фон под ним: эффект акцента на цветном объекте.

Параметры и результатКак понимать и применять
dst_image, src_imageНазначение меняется, источник читается. Оба GdImage; не пути. Для перекрывающихся областей одного холста проще подготовить отдельный промежуточный объект.
Прямоугольникиdst_x, dst_y — куда вставить; src_x, src_y — откуда брать; src_width, src_height — размер копируемой области, без масштабирования.
Особенностиpct — целое 0–100: при 0 область назначения становится серой, при 100 цвет источника сохраняется. Не универсальный alpha-compositor; для прозрачных PNG предпочитайте imagecopy.
Возвратtrue. Это изменение объекта назначения; файл появится только после imagepng/imagejpeg. Сохраняйте разумные положительные размеры и проверяйте границы.

Цветная отметка должна выделяться на приглушённом фоне: внутри её прямоугольника фон участвует в оттенках серого.

Последний аргумент pct регулирует долю источника. Вне прямоугольника назначения цвет не меняется. При 100 вклад фона исчезает, поэтому отличие от обычного copymerge видно именно в примере 50% на цветном фоне.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Перенести красную областьСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagecopymergegray($image, $source, 2, 1, 0, 0, 4, 4, 100);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Внутри вставки красный, вне её исходный чёрный фон.

Смешать красную плашку с цветным фоном на 50%Самостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смешать красную плашку с цветным фоном на50%: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смешать красную плашку с цветным фоном на50%: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смешать красную плашку с цветным фоном на50%: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 80, 220));
imagecopymergegray($image, $source, 2, 1, 0, 0, 4, 4, 50);
imagepng($image, "composition.png");
echo getimagesize("composition.png")[0], "x", getimagesize("composition.png")[1], "\n";
Текстовая проверка результата
8x6

Снаружи прямоугольника сохраняется синий фон; внутри участвуют и фон, и красный источник. Под плашкой фон участвует в оттенках серого, тогда как вне области он остаётся синим. Сравните второй пример imagecopymerge с теми же исходниками: его фон участвует цветным.

Следующий шаг: Сравнить обычное смешивание и смешивание с обесцвеченным фоном. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Наложить отдельную отметку SALE на карточкуСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Наложить отдельную отметку SALE на карточку: Исходная карточка товараСкачать PNG
Отдельная плашка SALE44 × 18 пикселей
Практика: Наложить отдельную отметку SALE на карточку: Отдельная плашка SALEСкачать PNG
После обработки160 × 120 пикселей
Практика: Наложить отдельную отметку SALE на карточку: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$stamp = imagecreatetruecolor(44, 18);
imagefill($stamp, 0, 0, imagecolorallocate($stamp, 255, 205, 75));
imagestring($stamp, 2, 6, 3, "SALE", imagecolorallocate($stamp, 40, 40, 40));
imagecopymergegray($image, $stamp, 100, 64, 0, 0, 44, 18, 60);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Исходная карточка и маленькая плашка подготовлены отдельно. Координаты 100,64 задают место внизу справа от корпуса; плашка 44×18 пересекается с товаром, поэтому видно, как работает наложение. Вклад источника 60% позволяет увидеть фон под плашкой; для непрозрачного читаемого ценника такой эффект может быть не нужен. imagecopymergegray дополнительно меняет участие фона на серое. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecopyresampled, imagealphablending, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecopyresizedБыстро изменить размер пиксельной схемы без качественного пересчёта соседей.

PHP 8: GdImage · gd

imagecopyresized(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): true

Быстро изменить размер пиксельной схемы без качественного пересчёта соседей.

Параметры и результатКак понимать и применять
dst_image, src_imageНазначение меняется, источник читается. Оба GdImage; не пути. Для перекрывающихся областей одного холста проще подготовить отдельный промежуточный объект.
Прямоугольникиdst_x, dst_y — куда вставить; src_x, src_y — откуда брать; dst_width, dst_height и src_width, src_height описывают два прямоугольника: их отношение задаёт масштаб.
ОсобенностиБлижайшие пиксели дают ступеньки при уменьшении фото, зато сохраняют характер pixel-art. Для truecolor фотографий выбирайте resampled.
Возвратtrue. Это изменение объекта назначения; файл появится только после imagepng/imagejpeg. Сохраняйте разумные положительные размеры и проверяйте границы.

Готовый значок должен занять меньший прямоугольник внутри большой карточки: размер вставки отличается от размера исходника.

После координат следуют две пары размеров: сначала ширина/высота назначения, потом ширина/высота источника. Значения 3,3,4,4 означают взять 4×4 и поместить в 3×3. Функция меняет $image, а $source сохраняется.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Перенести красную областьСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagecopyresized($image, $source, 2, 1, 0, 0, 4, 4, 4, 4);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Внутри вставки красный, вне её исходный чёрный фон.

Уменьшить значок 4×4 до 3×3 и вставить на холстСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уменьшить значок4×4 до3×3 и вставить на холст: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уменьшить значок4×4 до3×3 и вставить на холст: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уменьшить значок4×4 до3×3 и вставить на холст: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$white = imagecolorallocate($source, 255, 255, 255);
imagefilledrectangle($source, 0, 0, 1, 1, $white);
$image = imagecreatetruecolor(8, 6);
imagecopyresized($image, $source, 2, 1, 0, 0, 3, 3, 4, 4);
imagepng($image, "composition.png");
echo getimagesize("composition.png")[0], "x", getimagesize("composition.png")[1], "\n";
Текстовая проверка результата
8x6

Белый угол на красном значке помогает увидеть пересчёт. Источник 4×4 читается целиком, но занимает в результате 3×3; чёрные поля холста остаются. resized выбирает исходные пиксели: граница остаётся ступенчатой. Сравните второй пример imagecopyresampled с теми же данными.

Следующий шаг: Масштабировать пиксельную схему; для фотографии сравнить с resampled. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Получить миниатюру в отдельном холстеСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Получить миниатюру в отдельном холсте: Исходная карточка товараСкачать PNG
После обработки80 × 60 пикселей
Практика: Получить миниатюру в отдельном холсте: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$result = imagecreatetruecolor(80, 60);
imagecopyresized($result, $image, 0, 0, 0, 0, 80, 60, 160, 120);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Первые 80,60 — размеры назначения, последние 160,120 — исходника. Оба холста нужны, потому что функция копирует в уже существующее место. Сравните наклонную ручку и буквы с парным примером imagecopyresampled: на деталях видна разница выборки пикселей. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecopyresampled, imagealphablending, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecopyresampledПодготовить качественную миниатюру фотографии с пересчётом цветов соседних пикселей.

PHP 8: GdImage · gd

imagecopyresampled(GdImage $dst_image, GdImage $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_width, int $dst_height, int $src_width, int $src_height): true

Подготовить качественную миниатюру фотографии с пересчётом цветов соседних пикселей.

Параметры и результатКак понимать и применять
dst_image, src_imageНазначение меняется, источник читается. Оба GdImage; не пути. Для перекрывающихся областей одного холста проще подготовить отдельный промежуточный объект.
Прямоугольникиdst_x, dst_y — куда вставить; src_x, src_y — откуда брать; dst_width, dst_height и src_width, src_height описывают два прямоугольника: их отношение задаёт масштаб.
ОсобенностиПересчёт качественнее и обычно дороже resized. На палитровом назначении доступные цвета ограничены; предпочтительно truecolor. Размер исходного файла не определяет память распакованных пикселей.
Возвратtrue. Это изменение объекта назначения; файл появится только после imagepng/imagejpeg. Сохраняйте разумные положительные размеры и проверяйте границы.

Фотография должна стать миниатюрой без резких ступенек: один новый пиксель получает вклад нескольких исходных.

Две пары размеров после координат относятся к назначению и источнику в этом порядке. На бело-красной границе при 4×4→3×3 возникают промежуточные цвета. Они являются результатом пересчёта, а не ошибкой цвета.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Перенести красную областьСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести красную область: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$image = imagecreatetruecolor(8, 6);
imagecopyresampled($image, $source, 2, 1, 0, 0, 4, 4, 4, 4);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0
0,0,0

Внутри вставки красный, вне её исходный чёрный фон.

Уменьшить значок 4×4 до 3×3 и вставить на холстСамостоятельный пример
Копируемая область4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уменьшить значок4×4 до3×3 и вставить на холст: Копируемая областьСкачать PNG
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уменьшить значок4×4 до3×3 и вставить на холст: До измененияСкачать PNG
Композиция8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Уменьшить значок4×4 до3×3 и вставить на холст: КомпозицияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$source = imagecreatetruecolor(4, 4);
imagefill($source, 0, 0, imagecolorallocate($source, 255, 0, 0));
$white = imagecolorallocate($source, 255, 255, 255);
imagefilledrectangle($source, 0, 0, 1, 1, $white);
$image = imagecreatetruecolor(8, 6);
imagecopyresampled($image, $source, 2, 1, 0, 0, 3, 3, 4, 4);
imagepng($image, "composition.png");
echo getimagesize("composition.png")[0], "x", getimagesize("composition.png")[1], "\n";
Текстовая проверка результата
8x6

Белый угол на красном значке помогает увидеть пересчёт. Источник 4×4 читается целиком, но занимает в результате 3×3; чёрные поля холста остаются. resampled усредняет вклад соседних пикселей: на границе белого и красного появляются промежуточные оттенки. Сравните второй пример imagecopyresized с теми же данными.

Следующий шаг: Вставить фотографию в заранее подготовленный холст превью. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Получить миниатюру в отдельном холстеСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Получить миниатюру в отдельном холсте: Исходная карточка товараСкачать PNG
После обработки80 × 60 пикселей
Практика: Получить миниатюру в отдельном холсте: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$result = imagecreatetruecolor(80, 60);
imagecopyresampled($result, $image, 0, 0, 0, 0, 80, 60, 160, 120);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Первые 80,60 — размеры назначения, последние 160,120 — исходника. Оба холста нужны, потому что функция копирует в уже существующее место. Сравните наклонную ручку и буквы с парным примером imagecopyresized: на деталях видна разница выборки пикселей. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagescale, imagealphablending, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecropВырезать прямоугольник для аватара или убрать известные поля скана.

PHP 8: GdImage · gd

imagecrop(GdImage $image, array $rectangle): GdImage|false

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

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
rectangleАссоциативный массив x, y, width, height: координата начала и размеры. Размер — не последняя координата. Проверяйте положительность и попадание в холст до вызова.
ВозвратНовый GdImage либо false, исходный объект не меняется. Для отображения результата сохраните возвращённый объект, а не старый.

В каталоге нужны квадратные аватары, хотя исходные фото имеют разные пропорции. Обрезка оставляет выбранную область без растяжения предмета.

В $crop = imagecrop($image, ["x" => 1, "y" => 1, "width" => 2, "height" => 3]) массив описывает прямоугольник. x/y — начало в исходнике, width/height — число пикселей, не координаты конца. Результат сохраняется в новой переменной $crop; старый $image целиком остаётся в памяти.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Вырезать область 2×3Самостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Вырезать область2×3: ИсходникСкачать PNG
Результат2 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Вырезать область2×3: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 4, 3, $red);
imagefilledrectangle($image, 4, 3, 6, 4, $blue);
imagesetpixel($image, 1, 2, $blue);
$crop = imagecrop($image, ["x" => 1, "y" => 1, "width" => 2, "height" => 3]);
echo imagesx($crop), "x", imagesy($crop), "\n";
echo imagesx($image), "x", imagesy($image), "\n";
Текстовая проверка результата
2x3
8x6

Светлый фон и два цветных участка позволяют узнать исходник. Внутри выбранной области есть синяя точка: после обрезки она остаётся на новом маленьком холсте. x=1, y=1 задают его левый верхний угол; ширина 2 и высота 3 сохраняют столбцы 1–2 и строки 1–3. Новый объект позволяет сохранить полный оригинал.

Получить центральный квадратСамостоятельный пример
Исходник12 × 8 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить центральный квадрат: ИсходникСкачать PNG
Результат8 × 8 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить центральный квадрат: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(12, 8);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 6, 4, $red);
imagefilledrectangle($image, 6, 4, 10, 6, $blue);
imagesetpixel($image, 1, 2, $blue);
$size = min(imagesx($image), imagesy($image));
$x = intdiv(imagesx($image) - $size, 2);
$y = intdiv(imagesy($image) - $size, 2);
$avatar = imagecrop($image, ["x" => $x, "y" => $y, "width" => $size, "height" => $size]);
echo imagesx($avatar), "x", imagesy($avatar), "\n";
Текстовая проверка результата
8x8

Исходник 12×8 шире квадрата: x=2, y=0 отсекают по 2 столбца слева и справа. Сравните цветные участки до и после. Центральная обрезка не распознаёт лицо; интерфейс загрузки может дать человеку выбрать область.

Следующий шаг: Сначала выбрать область товара/лица, затем уменьшить её через imagescale. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($crop, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Выделить изображение товара без нижней подписиСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Выделить изображение товара без нижней подписи: Исходная карточка товараСкачать PNG
После обработки104 × 80 пикселей
Практика: Выделить изображение товара без нижней подписи: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$result = imagecrop($image, ["x" => 32, "y" => 12, "width" => 104, "height" => 80]);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Прямоугольник начинается в 32,12 и захватывает чашку с ручкой, но заканчивается раньше ценника. Обрезка выбирает содержимое, не уменьшает его. Если затем нужно превью фиксированной ширины, передайте $result в imagescale. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecropauto, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecropautoАвтоматически убрать однотонные поля вокруг небольшого рисунка.

PHP 8: GdImage · gd

imagecropauto(GdImage $image, int $mode = 0, float $threshold = 0.5, int $color = -1): GdImage|false

Автоматически убрать однотонные поля вокруг небольшого рисунка.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
modeIMG_CROP_DEFAULT сейчас равен прозрачной обрезке; TRANSPARENT убирает прозрачный фон, BLACK/WHITE — чёрный/белый, SIDES оценивает фон по четырём углам, THRESHOLD сравнивает с color.
threshold, colorВ THRESHOLD порог различия в процентах (default0.5) по расстоянию RGB(a), color — packed RGB или индекс палитры. В других режимах игнорируются.
Возврат / версииНовый GdImage либо false, в том числе когда обрезано всё. С 7.4 DEFAULT больше не откатывается к SIDES, алгоритм порога согласован bundled/system GD. Не передавайте историческое −1 вместо актуальной константы.

Вокруг рисунка осталась одноцветная рамка неизвестной толщины. Можно попросить GD найти непустую область по выбранному правилу.

В $crop = imagecropauto($image, IMG_CROP_WHITE) константа означает удаление белых полей. Новый $crop может оказаться false, если полями было всё изображение: в этом случае нечего сохранять. Не вызывайте imagesx или imagepng для false.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Убрать белую рамкуСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Убрать белую рамку: ИсходникСкачать PNG
Результат4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Убрать белую рамку: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$red = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image, 2, 1, 5, 4, $red);
$crop = imagecropauto($image, IMG_CROP_WHITE);
echo imagesx($crop), "x", imagesy($crop), "\n";
Текстовая проверка результата
4x4

Подходит для иллюстрации с чистым фоном; JPEG-артефакты потребуют осмысленного порога.

Обработать полностью пустую областьСамостоятельный пример
Исходник: вся область — фон8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Обработать полностью пустую область: Исходник: вся область — фонСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$crop = imagecropauto($image, IMG_CROP_BLACK);
echo $crop === false ? "nothing remains\n" : "image remains\n";
Текстовая проверка результата
nothing remains

false здесь нормальный результат отсутствия содержимого, а не обязательно поломка GD.

Следующий шаг: Подготовить значок без лишних полей перед сборкой каталога. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($crop, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Убрать однотонные поля готового макетаСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Убрать однотонные поля готового макета: Исходная карточка товараСкачать PNG
После обработки119 × 90 пикселей
Практика: Убрать однотонные поля готового макета: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$result = imagecropauto($image, IMG_CROP_SIDES);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Четыре угла имеют одинаковый светлый фон, поэтому SIDES использует его для поиска содержимого. В отличие от обрезки по заданным координатам здесь сохраняется и подпись: она тоже непустая часть картинки. Для фотографии с разноцветными краями этот способ может не соответствовать вашему замыслу. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecrop, imagecolorat.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagescaleСоздать уменьшенную версию картинки одной операцией, сохранив оригинал.

PHP 8: GdImage · gd

imagescale(GdImage $image, int $width, int $height = -1, int $mode = 3): GdImage|false

Создать уменьшенную версию картинки одной операцией, сохранив оригинал.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
width, heightНовая положительная ширина; height=-1/пропуск сохраняет пропорции. Если обе стороны заданы, картинка растягивается в них.
modeDefault IMG_BILINEAR_FIXED. NEAREST_NEIGHBOUR для pixel-art; BICUBIC/BICUBIC_FIXED и другие поддержанные ядра для пересчёта; IMG_WEIGHTED4 пока не поддержан.
Возврат / ошибкиНовый GdImage либо false. PHP8.4+ бросает ValueError при переполнении размеров/неверном mode. Уменьшайте после проверки исходных размеров; декодирование уже требует память полного входа.

Для списка товаров достаточно небольшой картинки: посетителю не нужен исходник большого размера в каждой строке.

В $small = imagescale($image, 6) число 6 — новая ширина в пикселях. Высота не задана, поэтому вычисляется пропорционально. $image не меняется; если сохранить его вместо $small, вы случайно снова получите большой файл.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Сохранить пропорцииСамостоятельный пример
Исходник12 × 8 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить пропорции: ИсходникСкачать PNG
Результат6 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить пропорции: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(12, 8);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 6, 4, $red);
imagefilledrectangle($image, 6, 4, 10, 6, $blue);
imagesetpixel($image, 1, 2, $blue);
$small = imagescale($image, 6);
echo imagesx($small), "x", imagesy($small), "\n";
echo imagesx($image), "\n";
Текстовая проверка результата
6x4
12

В исходнике 12×8 видны красный и синий участки на светлом фоне. Результат 6×4 уменьшает оба измерения вдвое, сохраняя их положение и пропорции; исходный объект остался шириной 12. imagescale возвращает другой объект, поэтому показываем $small, а не $image.

Увеличить пиксельный значок без размыванияСамостоятельный пример
Исходник2 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Увеличить пиксельный значок без размывания: ИсходникСкачать PNG
Результат4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Увеличить пиксельный значок без размывания: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(2, 2);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 0, 0, $red);
$large = imagescale($image, 4, 4, IMG_NEAREST_NEIGHBOUR);
echo imagecolorsforindex($large, imagecolorat($large, 0, 0))["red"], "\n";
Текстовая проверка результата
255

Для фото ближайший сосед даёт ступеньки, зато для технической пиксельной схемы предсказуем.

Следующий шаг: Создать отдельное превью и сохранить исходник для страницы товара. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($small, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Подготовить небольшое превью карточки товараСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Подготовить небольшое превью карточки товара: Исходная карточка товараСкачать PNG
После обработки80 × 60 пикселей
Практика: Подготовить небольшое превью карточки товара: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$result = imagescale($image, 80);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Карточка 160×120 стала 80×60. Заголовок, ручка и корпус уменьшились вместе; видны и польза масштаба, и предел читаемости мелкого текста. На настоящем сайте подпись цены часто лучше оставить HTML-текстом рядом с картинкой. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagecopyresampled, imagesetinterpolation.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagerotateПовернуть изображение после чтения ориентации камеры или наклонить штамп.

PHP 8: GdImage · gd

imagerotate(GdImage $image, float $angle, int $background_color): GdImage|false

Повернуть изображение после чтения ориентации камеры или наклонить штамп.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
angle, background_colorУгол float в градусах против часовой стрелки, центр вращения — центр картинки; background_color заполняет открывшиеся углы.
Возврат / версииНовый GdImage либо false, габариты могут увеличиться. Ранее неиспользуемый ignore_transparent удалён в 8.3. Alpha результата сохраняйте отдельно. EXIF orientation не применяется автоматически: зеркальные ориентации требуют ещё flip.

Фотография или скан лежит боком: нужно повернуть содержимое, сохранив узнаваемые детали.

В $rotated = imagerotate($image, 90, 0) угол 90 отсчитывается против часовой стрелки;0 — упакованный чёрный цвет открывшихся углов. В примере 90° углы не открываются. Для другого фона подготовьте цвет через imagecolorallocate. Результат — другой объект в $rotated.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Повернуть прямоугольник на 90°Самостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Повернуть прямоугольник на90°: ИсходникСкачать PNG
Результат6 × 8 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Повернуть прямоугольник на90°: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 4, 3, $red);
imagefilledrectangle($image, 4, 3, 6, 4, $blue);
imagesetpixel($image, 1, 2, $blue);
$rotated = imagerotate($image, 90, 0);
echo imagesx($rotated), "x", imagesy($rotated), "\n";
Текстовая проверка результата
6x8

Красный участок и синяя отметка помогают проследить поворот, а не только смену размеров: верхняя левая часть переходит вниз влево при повороте против часовой стрелки. Направление противоположно углам imagearc.

Полный оборот сохраняет размерыСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Полный оборот сохраняет размеры: ИсходникСкачать PNG
Результат8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Полный оборот сохраняет размеры: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 4, 3, $red);
imagefilledrectangle($image, 4, 3, 6, 4, $blue);
imagesetpixel($image, 1, 2, $blue);
$rotated = imagerotate($image, 360, 0);
echo imagesx($rotated), "x", imagesy($rotated), "\n";
Текстовая проверка результата
8x6

После 360° цветные участки возвращаются на исходные места: это наглядный контроль полного оборота. Для произвольного угла выбирайте цвет углов и допустимые новые размеры до кодирования.

Следующий шаг: Исправить ориентацию; для EXIF отдельно определить угол и необходимость отражения. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($rotated, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Наклонить карточку для иллюстрацииСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Наклонить карточку для иллюстрации: Исходная карточка товараСкачать PNG
После обработки184 × 157 пикселей
Практика: Наклонить карточку для иллюстрации: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$background = imagecolorallocate($image, 242, 238, 224);
$result = imagerotate($image, 15, $background);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Карточка повернулась против часовой стрелки на 15°. Теперь холст больше, а новые углы заполнены выбранным светлым цветом. Для каталога такой поворот обычно не нужен; он полезен для иллюстраций и демонстрирует выбор фона. Исправление EXIF-ориентации — отдельная задача с известным углом. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imageflip, imagesetinterpolation.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageflipЗеркально отразить скан, карточку или исправить зеркальную EXIF-ориентацию.

PHP 8: GdImage · gd

imageflip(GdImage $image, int $mode): true

Зеркально отразить скан, карточку или исправить зеркальную EXIF-ориентацию.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
modeIMG_FLIP_HORIZONTAL — слева/справа; VERTICAL — сверху/снизу; BOTH — обе оси. Это не 90°поворот.
Возвратtrue, изменяет тот же объект. Неизвестный режим вызывает ValueError.

Скан или фотография зеркальные: нужно поменять местами левую и правую стороны, сохранив размер.

imageflip($image, IMG_FLIP_HORIZONTAL) меняет сам $image. Здесь не нужна переменная $flipped для картинки: возвращается true, а изображение остаётся в $image. Для x=0 и ширины 4 новая координата равна 3.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Перенести левую точку направоСамостоятельный пример
До изменения4 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести левую точку направо: До измененияСкачать PNG
После операции4 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перенести левую точку направо: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(4, 2);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 0, 0, $red);
imageflip($image, IMG_FLIP_HORIZONTAL);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Ширина 4 значит новая координата width−1−oldX=3.

Отразить по обеим осямСамостоятельный пример
До изменения4 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Отразить по обеим осям: До измененияСкачать PNG
После операции4 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Отразить по обеим осям: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(4, 2);
$red = imagecolorallocate($image, 255, 0, 0);
imagesetpixel($image, 0, 0, $red);
imageflip($image, IMG_FLIP_BOTH);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 1));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
255,0,0

Источник меняется, поэтому для отдельного варианта сначала нужна копия.

Следующий шаг: Исправить зеркальную ориентацию перед поворотом и созданием превью. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Увидеть, что отражение затрагивает также текстСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Увидеть, что отражение затрагивает также текст: Исходная карточка товараСкачать PNG
После обработки160 × 120 пикселей
Практика: Увидеть, что отражение затрагивает также текст: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
imageflip($image, IMG_FLIP_HORIZONTAL);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Ручка чашки переехала влево, но надпись тоже стала зеркальной. Это важная граница: исправляйте ориентацию исходной фотографии до добавления подписей и логотипов. Функция не понимает, где текст, а где предмет. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagerotate, imagecopy.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagesetinterpolationВыбрать и проверить алгоритм пересчёта пикселей для rotate/affine и совместимых операций.

PHP 8: GdImage · gd

imagesetinterpolation(GdImage $image, int $method = 3): bool

Выбрать и проверить алгоритм пересчёта пикселей для rotate/affine и совместимых операций.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
methodУ setter метод интерполяции, default IMG_BILINEAR_FIXED; полный перечень IMG_* ядер в константах. getter не принимает method и возвращает int текущего режима.
Возвратsetter bool, getter int. Не все операции поддерживают все ядра; imagescale имеет собственный аргумент mode. Параметр не улучшает уже обработанный результат.

Один алгоритм подходит пиксельной схеме, другой — фотографии. Настройку выбирают перед преобразованием.

imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR) меняет настройку объекта, но ещё не рисует новое изображение. Эффект появляется только при поддерживающей настройку операции, например imagerotate. У imagescale есть собственный аргумент mode.

Прочитать явно заданный методСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR);
var_dump(imagegetinterpolation($image) === IMG_NEAREST_NEIGHBOUR);
Ожидаемый результат
bool(true)

Константу сравниваем с константой, не с магическим числом.

Вернуть bilinear перед преобразованиемСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR);
imagesetinterpolation($image, IMG_BILINEAR_FIXED);
var_dump(imagegetinterpolation($image) === IMG_BILINEAR_FIXED);
Ожидаемый результат
bool(true)

Режим — состояние конкретного исходного GdImage.

Следующий шаг: Сначала задать режим, затем получить повернутую или аффинно преобразованную картинку. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Увидеть настройку в действии при поворотеСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Увидеть настройку в действии при повороте: Исходная карточка товараСкачать PNG
После обработки184 × 157 пикселей
Практика: Увидеть настройку в действии при повороте: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR);
$result = imagerotate($image, 15, $background);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Setter только выбирает режим, а картинку создаёт следующая строка imagerotate. Ближайший сосед сохраняет жёсткие пиксели и даёт ступеньки на наклонных краях; это иногда нужно схемам, но редко фотографиям. Для сравнения замените константу на IMG_BILINEAR_FIXED, сохранив угол и исходник. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagescale, imagerotate, imageaffine.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegetinterpolationВыбрать и проверить алгоритм пересчёта пикселей для rotate/affine и совместимых операций.

PHP 8: GdImage · gd

imagegetinterpolation(GdImage $image): int

Выбрать и проверить алгоритм пересчёта пикселей для rotate/affine и совместимых операций.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
methodУ setter метод интерполяции, default IMG_BILINEAR_FIXED; полный перечень IMG_* ядер в константах. getter не принимает method и возвращает int текущего режима.
Возвратsetter bool, getter int. Не все операции поддерживают все ядра; imagescale имеет собственный аргумент mode. Параметр не улучшает уже обработанный результат.

Нужно проверить, какой режим использует объект перед преобразованием, например при поиске причины размытых пикселей.

imagegetinterpolation($image) возвращает номер-константу настройки, а не GdImage. Сравните его с IMG_NEAREST_NEIGHBOUR или другим именем. Сам вызов ничего не масштабирует.

Прочитать явно заданный методСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR);
var_dump(imagegetinterpolation($image) === IMG_NEAREST_NEIGHBOUR);
Ожидаемый результат
bool(true)

Константу сравниваем с константой, не с магическим числом.

Вернуть bilinear перед преобразованиемСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR);
imagesetinterpolation($image, IMG_BILINEAR_FIXED);
var_dump(imagegetinterpolation($image) === IMG_BILINEAR_FIXED);
Ожидаемый результат
bool(true)

Режим — состояние конкретного исходного GdImage.

Следующий шаг: Проверить настройку до rotate/affine и при необходимости изменить её setter-функцией. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Проверить режим перед созданием производнойСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Проверить режим перед созданием производной: Исходная карточка товараСкачать PNG
После обработки184 × 157 пикселей
Практика: Проверить режим перед созданием производной: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
imagesetinterpolation($image, IMG_NEAREST_NEIGHBOUR);
$method = imagegetinterpolation($image);
if ($method !== IMG_NEAREST_NEIGHBOUR) { throw new RuntimeException("Unexpected interpolation"); }
$result = imagerotate($image, 15, $background);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

В $method находится число-константа, в $result — изображение после поворота. Проверка подходит для контролируемого конвейера, где следующий шаг должен использовать именно выбранный режим. Она не доказывает качество фотографии: для этого смотрят на края, детали и подходящий алгоритм. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagescale, imagerotate, imageaffine.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageaffinematrixgetПостроить преобразование наклейки: перенос, масштаб, поворот или сдвиг формы.

PHP 8: GdImage · gd

imageaffinematrixget(int $type,  $options): array|false

Построить преобразование наклейки: перенос, масштаб, поворот или сдвиг формы.

Параметры и результатКак понимать и применять
typeIMG_AFFINE_TRANSLATE/SCALE требуют options=["x"=>float,"y"=>float]; ROTATE/SHEAR_HORIZONTAL/SHEAR_VERTICAL требуют float угла в градусах.
Возвратarray из 6float с индексами 0..5 либо false. Коэффициенты a, b, c, d, e, f означают x′=a×x+c×y+e; y′=b×x+d×y+f. Неверный тип/options отклоняются; проверяйте их до вычисления.

Наклейку требуется одновременно сдвинуть и увеличить. Матрица хранит правило движения любой её точки.

IMG_AFFINE_SCALE с options["x" => 2.0, "y" => 3.0] даёт коэффициенты масштаба. В переменной $m находится массив из 6 чисел, не изображение. Для точки 4,2 расчёт даёт 8,6; чтобы применить правило к пикселям, нужен отдельный imageaffine.

Получить матрицу переносаСамостоятельный пример
<?php
declare(strict_types=1);

$m = imageaffinematrixget(IMG_AFFINE_TRANSLATE, ["x" => 5.0, "y" => 3.0]);
echo implode(",", $m), "\n";
Ожидаемый результат
1,0,0,1,5,3

Первые 4 коэффициента оставляют форму, последние 2 сдвигают координаты.

Посчитать положение точки после масштабаСамостоятельный пример
<?php
declare(strict_types=1);

$m = imageaffinematrixget(IMG_AFFINE_SCALE, ["x" => 2.0, "y" => 3.0]);
$x = 4; $y = 2;
echo $m[0] * $x + $m[2] * $y + $m[4], ",", $m[1] * $x + $m[3] * $y + $m[5], "\n";
Ожидаемый результат
8,6

Это арифметика координат; изображение создаёт отдельный imageaffine.

Следующий шаг: Подготовить правило, объединить его с другим, затем один раз пересчитать растр. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Превратить правило матрицы в изображениеСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Превратить правило матрицы в изображение: Исходная карточка товараСкачать PNG
После обработки191 × 120 пикселей
Практика: Превратить правило матрицы в изображение: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$matrix = imageaffinematrixget(IMG_AFFINE_SHEAR_HORIZONTAL, 15.0);
$result = imageaffine($image, $matrix);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Первая строка готовит шесть коэффициентов сдвига формы, вторая применяет их к пикселям. Сохранение одного массива $matrix не создаёт PNG: в imagepng передаётся $result. По наклонённым боковым сторонам видно, чем это отличается от обычного поворота. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imageaffinematrixconcat, imageaffine.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageaffinematrixconcatОбъединить несколько преобразований перед однократным пересчётом картинки.

PHP 8: GdImage · gd

imageaffinematrixconcat(array $matrix1, array $matrix2): array|false

Объединить несколько преобразований перед однократным пересчётом картинки.

Параметры и результатКак понимать и применять
matrix1, matrix2Два массива 0..5 с шестью коэффициентами. Порядок важен: перенос и масштаб не взаимозаменяемы; сверяйте нужную точку по формуле.
ВозвратНовая матрица array либо false. Само изображение не меняется; объединение уменьшает число повторных интерполяций и потерю резкости.

Несколько преобразований нужно собрать в одну операцию, чтобы не пересчитывать и не размывать изображение после каждого шага.

imageaffinematrixconcat($a, $b) возвращает новую матрицу. Два масштаба 2 и 3 дают 6; это специальный простой случай. Порядок переноса и масштаба в общем случае меняет результат, поэтому сверяйте движение конкретной точки.

Сложить два переносаСамостоятельный пример
<?php
declare(strict_types=1);

$a = imageaffinematrixget(IMG_AFFINE_TRANSLATE, ["x" => 2.0, "y" => 1.0]);
$b = imageaffinematrixget(IMG_AFFINE_TRANSLATE, ["x" => 3.0, "y" => 4.0]);
echo implode(",", imageaffinematrixconcat($a, $b)), "\n";
Ожидаемый результат
1,0,0,1,5,5

Два переноса удобны для первого опыта: итоговые сдвиги складываются.

Объединить увеличение сторонСамостоятельный пример
<?php
declare(strict_types=1);

$a = imageaffinematrixget(IMG_AFFINE_SCALE, ["x" => 2.0, "y" => 2.0]);
$b = imageaffinematrixget(IMG_AFFINE_SCALE, ["x" => 3.0, "y" => 3.0]);
echo implode(",", imageaffinematrixconcat($a, $b)), "\n";
Ожидаемый результат
6,0,0,6,0,0

При повороте/переносе проверяйте порядок отдельно; такие простые примеры не доказывают коммутативность общего случая.

Следующий шаг: Передать объединённую матрицу imageaffine, затем сохранить возвращённый GdImage. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Собрать масштаб и поворот в одну обработкуСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Собрать масштаб и поворот в одну обработку: Исходная карточка товараСкачать PNG
После обработки222 × 182 пикселей
Практика: Собрать масштаб и поворот в одну обработку: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$scale = imageaffinematrixget(IMG_AFFINE_SCALE, ["x" => 1.25, "y" => 1.25]);
$turn = imageaffinematrixget(IMG_AFFINE_ROTATE, 10.0);
$matrix = imageaffinematrixconcat($scale, $turn);
$result = imageaffine($image, $matrix);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Две матрицы описывают увеличение и поворот; concat объединяет правила, а единственный imageaffine пересчитывает пиксели. В этой задаче масштаб равномерный, поэтому такой пример не доказывает взаимозаменяемость любого порядка. При переносах и неравных масштабах проверяйте конкретную точку формулой из карточки. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imageaffinematrixget, imageaffine.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

Разбор порядка: масштаб и перенос дают (13,7) или (18,10). Этот пример показывает случай, в котором перестановка действительно меняет результат.

imageaffineПолучить растровый результат общей матрицы, например наклонённую этикетку для макета.

PHP 8: GdImage · gd

imageaffine(GdImage $image, array $affine, ?array $clip = null): GdImage|false

Получить растровый результат общей матрицы, например наклонённую этикетку для макета.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
affine, clipaffine —6 чисел с ключами 0..5. clip=null или массив x, y, width, height исходной области. Не путайте clip с imagesetclip, которое меняет состояние исходника.
Возврат / документацияНовый GdImage либо false. Официальная страница краткая; правила матрицы связываем с libgd и проверяем на известных точках. Вырожденная матрица и большие размеры требуют предварительной проверки.

Этикетку надо наклонить, растянуть или совместить несколько преобразований: одной ширины и угла уже недостаточно.

В $result = imageaffine($image, [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]) шесть чисел описывают правило для координат. Это единичная матрица — без задуманного сдвига/масштаба. Новый объект находится в $result; фактические размеры зависят от расчёта границы GD и отдельно проверяются ниже.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Проверить габариты результата единичной матрицыСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Проверить габариты результата единичной матрицы: ИсходникСкачать PNG
Результат7 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Проверить габариты результата единичной матрицы: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 4, 3, $red);
imagefilledrectangle($image, 4, 3, 6, 4, $blue);
imagesetpixel($image, 1, 2, $blue);
$result = imageaffine($image, [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]);
echo imagesx($result), "x", imagesy($result), "\n";
Текстовая проверка результата
7x6

В bundled libgd PHP 8.5.11 этот пример даёт ширину 7 вместо математически ожидаемых 8: граница вычисляется реализацией преобразования. Это ограничение показано явно. Для копии точных размеров используйте imagecopy, для масштаба imagescale; всегда проверяйте фактические габариты affine.

Изменить масштаб матрицейСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 12× (на узком экране может уменьшаться)
Изменить масштаб матрицей: ИсходникСкачать PNG
Результат15 × 12 пикселей · увеличение до 12× (на узком экране может уменьшаться)
Изменить масштаб матрицей: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$background = imagecolorallocate($image, 238, 238, 238);
imagefill($image, 0, 0, $background);
$red = imagecolorallocate($image, 220, 60, 50);
$blue = imagecolorallocate($image, 20, 110, 190);
imagefilledrectangle($image, 1, 1, 4, 3, $red);
imagefilledrectangle($image, 4, 3, 6, 4, $blue);
imagesetpixel($image, 1, 2, $blue);
$matrix = imageaffinematrixget(IMG_AFFINE_SCALE, ["x" => 2.0, "y" => 2.0]);
$result = imageaffine($image, $matrix);
echo imagesx($result), "x", imagesy($result), "\n";
Текстовая проверка результата
15x12

В этой сборке affine даёт ширину 15, а не 16 из непрерывной геометрии. Нельзя обещать размер без проверки результата. Простое масштабирование точных размеров делайте через imagescale; affine полезен для комбинаций.

Следующий шаг: Применить рассчитанную матрицу к этикетке; для обычного превью проще imagescale. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($result, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Придать карточке наклон формы без обычного поворотаСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Придать карточке наклон формы без обычного поворота: Исходная карточка товараСкачать PNG
После обработки191 × 120 пикселей
Практика: Придать карточке наклон формы без обычного поворота: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
$matrix = imageaffinematrixget(IMG_AFFINE_SHEAR_HORIZONTAL, 15.0);
$result = imageaffine($image, $matrix);
imagepng($result, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

При сдвиге формы строки смещаются относительно друг друга: вертикальные стороны наклоняются, а горизонтальные остаются горизонтальными. Сравните это с imagerotate, где поворачивается вся система осей. Проверяйте реальные размеры и поля результата; GD не обещает идеальную геометрическую границу. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imageaffinematrixget, imageaffinematrixconcat, imagesetinterpolation.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegammacorrectИсправить известное различие гаммы источника и назначения, а не произвольно поднять яркость.

PHP 8: GdImage · gd

imagegammacorrect(GdImage $image, float $input_gamma, float $output_gamma): true

Исправить известное различие гаммы источника и назначения, а не произвольно поднять яркость.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
input_gamma, output_gammaПоложительные float. Отношение гамм меняет нелинейное распределение яркости; ноль/отрицательные недопустимы.
Возвратtrue, изменяет изображение. Это не полноценное управление ICC-профилями и не автоматическое исправление цвета камеры.

Известно, что источник и устройство вывода используют разную гамму: требуется перераспределить яркости, а не просто прибавить число к каждому каналу.

imagegammacorrect($image, 1.0, 2.2) меняет тот же объект; числа задают входную и выходную гамму. Средние тёмные уровни в этом примере светлеют. Не угадывайте гамму произвольной фотографии: это не универсальная кнопка улучшения.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Одинаковая гамма сохраняет цветСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Одинаковая гамма сохраняет цвет: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Одинаковая гамма сохраняет цвет: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$gray = imagecolorallocate($image, 100, 100, 100);
imagefill($image, 0, 0, $gray);
imagegammacorrect($image, 1.0, 1.0);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
100,100,100

Так проверяется нейтральный случай до подбора рабочего преобразования.

Изменить известную гаммуСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Изменить известную гамму: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Изменить известную гамму: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagefill($image, 0, 0, imagecolorallocate($image, 64, 64, 64));
imagegammacorrect($image, 1.0, 2.2);
$level = imagecolorsforindex($image, imagecolorat($image, 0, 0))["red"];
echo $level > 64 ? "lighter\n" : "not lighter\n";
Текстовая проверка результата
lighter

Проверяется направление эффекта, а не байтовая идентичность разных библиотек.

Следующий шаг: Сделать контролируемое преобразование производной при известных характеристиках источника. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Сравнить гамма-преобразование на цветном макетеСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Сравнить гамма-преобразование на цветном макете: Исходная карточка товараСкачать PNG
После обработки160 × 120 пикселей
Практика: Сравнить гамма-преобразование на цветном макете: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
imagegammacorrect($image, 1.0, 2.2);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Синий корпус и тёмная надпись светлеют нелинейно, а почти белый фон меняется меньше. Для этого учебного макета гаммы заданы явно. В рабочем процессе сначала выясните реальные характеристики источника; не применять 1.0→2.2 автоматически ко всем загрузкам. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagefilter.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageconvolutionПрименить небольшое ядро резкости, размытия или выделения границ.

PHP 8: GdImage · gd

imageconvolution(GdImage $image, array $matrix, float $divisor, float $offset): bool

Применить небольшое ядро резкости, размытия или выделения границ.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
matrixМассив 3×3float: каждый выходной цвет зависит от соседей и этих весов.
divisor, offsetСумма делится на ненулевой divisor, затем прибавляется offset. Для среднего девяти пикселей divisor9; для резкости часто 1. Ограничение компонентов 0..255 сохраняется.
Возвратbool; неправильная размерность вызывает ValueError. Проход по всем пикселям стоит времени и дополнительной памяти; не повторяйте фильтр без необходимости.

Резкую границу значка нужно смягчить: новый пиксель должен учитывать соседей, а не только своё исходное значение.

Матрица 3×3 задаёт веса девяти соседей. Девять единиц и divisor9 дают среднее; offset0 ничего к нему не прибавляет. Функция изменяет $image. В примере белая половина даёт соседним чёрным пикселям часть своей яркости.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
Понять ядро без изменения цветаСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Понять ядро без изменения цвета: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Понять ядро без изменения цвета: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagefill($image, 0, 0, imagecolorallocate($image, 20, 40, 60));
imageconvolution($image, [[0,0,0], [0,1,0], [0,0,0]], 1.0, 0.0);
$pixel = imagecolorsforindex($image, imagecolorat($image, 2, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
20,40,60

Единица в центре берёт исходный пиксель, нули не берут соседей.

Смягчить контрастную границуСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смягчить контрастную границу: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Смягчить контрастную границу: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image, 4, 0, 7, 5, $white);
imageconvolution($image, [[1,1,1], [1,1,1], [1,1,1]], 9.0, 0.0);
$pixel = imagecolorsforindex($image, imagecolorat($image, 3, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
$pixel = imagecolorsforindex($image, imagecolorat($image, 4, 2));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
85,85,85
170,170,170

До обработки слева чёрный, справа белый: граница проходит между x=3 и x=4. В окне 3×3 для x=3 три белых соседа дают 255×3/9=85; для x=4 шесть белых дают 170. На картинке появляются две серые полосы вместо резкого перехода. Однотонные участки дальше от границы сохраняются.

Следующий шаг: Подобрать ядро размытия/резкости и применить к отдельной производной изображения. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Увидеть размытие на краях и подписи карточкиСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Увидеть размытие на краях и подписи карточки: Исходная карточка товараСкачать PNG
После обработки160 × 120 пикселей
Практика: Увидеть размытие на краях и подписи карточки: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
imageconvolution($image, [[1,1,1], [1,1,1], [1,1,1]], 9.0, 0.0);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Внутри однотонного синего корпуса почти ничего не меняется. На границе корпуса и фона появляются смешанные пиксели; мелкая подпись теряет резкость. Это объясняет, почему размытие нельзя считать универсальным улучшением качества. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imagefilter, imagecopyresampled.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefilterПрименить готовый эффект к превью, например обесцветить недоступный товар.

PHP 8: GdImage · gd

imagefilter(GdImage $image, int $filter,  ...$args): bool

Применить готовый эффект к превью, например обесцветить недоступный товар.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
filter, argsКонстанта определяет количество/смысл variadic args. Не передавайте одинаковый набор параметров всем фильтрам.
Возвратbool, меняет исходник. Для варианта сохраните отдельную копию. Фильтры не заменяют валидацию входа; scatter случайный и не даёт стабильных пикселей.

Недоступный товар можно показать серым, а подготовленное превью сделать немного светлее: это изменение содержимого картинки.

imagefilter($image, IMG_FILTER_BRIGHTNESS, 15) меняет $image и прибавляет 15 к RGB-компонентам. У NEGATE дополнительных чисел нет, у других фильтров они имеют иной смысл. true подтверждает операцию, но показывать нужно изменённый $image.

Что проверять на изображениях
  1. Исходник: найдите цветной участок или край
  2. Вызов: проследите координаты и размер выбранной области
  3. Результат: сравните положение, размеры и цвет; число в выводе только подтверждает проверку
ФильтрПараметры и смысл
IMG_FILTER_NEGATEБез параметров: обратить RGB.
IMG_FILTER_GRAYSCALEБез параметров: серый по взвешенной REC.601 яркости; alpha сохраняется. Палитра ограничивает результат.
IMG_FILTER_BRIGHTNESSОдно число−255..255: добавить яркость.
IMG_FILTER_CONTRASTОдно число изменения контраста; подбирайте визуально, стандартный диапазон−100..100, положительный уменьшает контраст.
IMG_FILTER_COLORIZEred, green, blue0..255 и optional alpha0..127 задают цветовой сдвиг.
IMG_FILTER_EDGEDETECTБез аргументов: границы.
IMG_FILTER_EMBOSSБез аргументов: рельеф.
IMG_FILTER_GAUSSIAN_BLURБез аргументов: Gaussian размытие.
IMG_FILTER_SELECTIVE_BLURБез аргументов: выборочное размытие.
IMG_FILTER_MEAN_REMOVALБез аргументов: подчёркнутые детали/эскиз.
IMG_FILTER_SMOOTHОдно число степени сглаживания.
IMG_FILTER_PIXELATEРазмер блока в пикселях и optional bool advanced=false.
IMG_FILTER_SCATTERsub, plus задают случайное смещение, sub< plus; optional массив цветов ограничивает применение. В 8.4+переполнение вызывает ValueError.
Инвертировать красныйСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Инвертировать красный: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Инвертировать красный: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagefill($image, 0, 0, imagecolorallocate($image, 255, 0, 0));
imagefilter($image, IMG_FILTER_NEGATE);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
0,255,255

Каждая компонента превращается в 255−исходная.

Поднять яркость превьюСамостоятельный пример
До изменения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Поднять яркость превью: До измененияСкачать PNG
После операции8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Поднять яркость превью: После операцииСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagefill($image, 0, 0, imagecolorallocate($image, 20, 40, 60));
imagefilter($image, IMG_FILTER_BRIGHTNESS, 15);
$pixel = imagecolorsforindex($image, imagecolorat($image, 0, 0));
echo $pixel["red"], ",", $pixel["green"], ",", $pixel["blue"], "\n";
Текстовая проверка результата
35,55,75

Более светлые компоненты могут упереться в 255 и потерять детали. Изменение обычно применяют к производной, сохраняя оригинал.

Следующий шаг: Сохранить отдельный вариант для состояния интерфейса, не затронув оригинал товара. Для сохранения нужен объект с итоговыми пикселями, а не возвращённый флаг успеха.

Например, imagepng($image, "result.png") записывает файл. На HTML-странице <img src="result.png" alt="Результат обработки"> показывает его, если файл размещён в доступном каталоге сайта. PHP-путь на диске и URL в браузере — разные адреса; для веб-ответа напрямую нужен отдельный обработчик и Content-Type. imagepng объясняет оба варианта. В примерах, где итог назван иначе ($avatar, $large), передайте именно эту переменную.

Теперь применим операцию к целой карточке. Сначала код создаёт небольшой узнаваемый макет и сохраняет оригинал. Корпус — заполненный прямоугольник, ручка — эллипс, подпись — встроенный шрифт. Эти вызовы уже разобраны в imagefilledrectangle, imageellipse и imagestring. Блок после сохранения исходника выполняет текущую операцию; последняя запись создаёт файл результата.

Практика: Подготовить серую версию для недоступного товараСамостоятельный пример
Исходная карточка товара160 × 120 пикселей
Практика: Подготовить серую версию для недоступного товара: Исходная карточка товараСкачать PNG
После обработки160 × 120 пикселей
Практика: Подготовить серую версию для недоступного товара: После обработкиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

// Учебный исходник карточки: в проекте его можно загрузить из PNG/JPEG.
$image = imagecreatetruecolor(160, 120);
$background = imagecolorallocate($image, 242, 238, 224);
imagefill($image, 0, 0, $background);
$blue = imagecolorallocate($image, 30, 110, 180);
$ink = imagecolorallocate($image, 25, 45, 55);
imagefilledrectangle($image, 40, 20, 112, 84, $blue);
imageellipse($image, 112, 50, 36, 42, $blue);
imagestring($image, 3, 12, 99, "CUP / 1290 RUB", $ink);
imagepng($image, "product-source.png");
imagefilter($image, IMG_FILTER_GRAYSCALE);
imagepng($image, "product-result.png");
echo "product-source.png -> product-result.png\n";
echo getimagesize("product-result.png")["mime"], "\n";
Текстовая проверка результата
product-source.png -> product-result.png
image/png

Контуры и подпись остаются на месте, синий корпус превращается в серый. Оригинал сохранён отдельно, поэтому при возвращении товара в наличие не потребуется восстанавливать цвета. На сайте статус дополнительно нужно написать текстом: один цвет недоступен части читателей. В браузере разместите рядом <img src="product-source.png" alt="Исходная карточка"> и <img src="product-result.png" alt="Обработанная карточка">. Текстовый вывод подтверждает файлы; сами различия смотрите на изображениях.

Связанные операции: imageconvolution, imagegammacorrect.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagepngЗакодировать готовый холст в PNG для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagepng(GdImage $image,  $file = null, int $quality = -1, int $filters = -1): bool

Закодировать готовый холст в PNG для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
НастройкиСжатие quality −1(default zlib) либо 0..9; оно без потерь, это не качество JPEG. filters −1 отключён/default, PNG_FILTER_* маска, PNG_NO_FILTER/ALL_FILTERS; system libgd игнорирует filters. PHP8.4+неверный quality вызывает ValueError.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьСохраняет full alpha при imagesavealpha; palette и truecolor возможны.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "picture.png", 6);
$info = getimagesize("picture.png");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/png

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagepng($image, null, 6);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefrompng, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefrompngОткрыть PNG как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefrompng(string $filename): GdImage|false

Открыть PNG как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияСохраняет full alpha при imagesavealpha; palette и truecolor возможны.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "picture.png", 6);
$loaded = imagecreatefrompng("picture.png");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "picture.png", 6);
$loaded = imagecreatefrompng("picture.png");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagepng, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagejpegЗакодировать готовый холст в JPEG для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagejpeg(GdImage $image,  $file = null, int $quality = -1): bool

Закодировать готовый холст в JPEG для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
Настройкиquality −1 выбирает библиотечный default,0..100 задаёт баланс потерь/размера. Чем выше, тем обычно больше файл. PHP8.4+неверный quality даёт ValueError.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьНет alpha; перед конверсией прозрачного PNG явно наложите выбранный фон. EXIF-ориентация/ICC/IPTC не сохраняются автоматически.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать JPEG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagejpeg($image, "picture.jpeg", 85);
$info = getimagesize("picture.jpeg");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/jpeg

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagejpeg($image);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefromjpeg, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromjpegОткрыть JPEG как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefromjpeg(string $filename): GdImage|false

Открыть JPEG как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияНет alpha; перед конверсией прозрачного PNG явно наложите выбранный фон. EXIF-ориентация/ICC/IPTC не сохраняются автоматически.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagejpeg($image, "picture.jpeg", 85);
$loaded = imagecreatefromjpeg("picture.jpeg");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagejpeg($image, "picture.jpeg", 85);
$loaded = imagecreatefromjpeg("picture.jpeg");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagejpeg, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegifЗакодировать готовый холст в GIF для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagegif(GdImage $image,  $file = null): bool

Закодировать готовый холст в GIF для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
НастройкиНет quality; формат палитровый с одним прозрачным цветом.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьЧтение возвращает только первый кадр, его размеры могут отличаться от logical screen в getimagesize. GD не сохраняет анимацию.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать GIF

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegif($image, "picture.gif");
$info = getimagesize("picture.gif");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/gif

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagegif($image);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefromgif, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromgifОткрыть GIF как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefromgif(string $filename): GdImage|false

Открыть GIF как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияЧтение возвращает только первый кадр, его размеры могут отличаться от logical screen в getimagesize. GD не сохраняет анимацию.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegif($image, "picture.gif");
$loaded = imagecreatefromgif("picture.gif");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegif($image, "picture.gif");
$loaded = imagecreatefromgif("picture.gif");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagegif, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagebmpЗакодировать готовый холст в BMP для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagebmp(GdImage $image,  $file = null, bool $compressed = true): bool

Закодировать готовый холст в BMP для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
Настройкиcompressed=true(default) просит RLE, false без сжатия; применимость зависит от вида BMP/палитры. При null явно передавайте compressed; старые версии имели оговорки для null.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьДля обмена проверяйте поддержку BMP у получателя; файлы часто заметно больше PNG.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать BMP

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagebmp($image, "picture.bmp", false);
$info = getimagesize("picture.bmp");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/bmp

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagebmp($image, null, false);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefrombmp, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefrombmpОткрыть BMP как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefrombmp(string $filename): GdImage|false

Открыть BMP как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияДля обмена проверяйте поддержку BMP у получателя; файлы часто заметно больше PNG.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagebmp($image, "picture.bmp", false);
$loaded = imagecreatefrombmp("picture.bmp");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagebmp($image, "picture.bmp", false);
$loaded = imagecreatefrombmp("picture.bmp");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagebmp, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagewebpЗакодировать готовый холст в WebP для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagewebp(GdImage $image,  $file = null, int $quality = -1): bool

Закодировать готовый холст в WebP для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
Настройкиquality −1 означает 80;0..100 lossy. IMG_WEBP_LOSSLESS включает lossless (PHP8.1+при подходящей libwebp). PHP8.4+неверный quality даёт ValueError.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьАнимированный WebP декодер GD не читает. Для полноцветной записи нужен truecolor; alpha поддерживается.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать WEBP

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagewebp($image, "picture.webp", 80);
$info = getimagesize("picture.webp");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/webp

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagewebp($image);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefromwebp, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromwebpОткрыть WebP как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefromwebp(string $filename): GdImage|false

Открыть WebP как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияАнимированный WebP декодер GD не читает. Для полноцветной записи нужен truecolor; alpha поддерживается.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagewebp($image, "picture.webp", 80);
$loaded = imagecreatefromwebp("picture.webp");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagewebp($image, "picture.webp", 80);
$loaded = imagecreatefromwebp("picture.webp");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagewebp, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageavifЗакодировать готовый холст в AVIF для файла или HTTP-ответа.

PHP 8: GdImage · gd

imageavif(GdImage $image,  $file = null, int $quality = -1, int $speed = -1): bool

Закодировать готовый холст в AVIF для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
Настройкиquality −1 означает 52,0..100; speed −1 означает 6,0..10: меньше обычно медленнее/компактнее. PHP8.4+неверные значения дают ValueError.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьPHP8.1+, нужен AVIF-enabled libgd/libavif. Кодирование может быть существенно дороже JPEG; готовые превью кешируют.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать AVIF

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imageavif($image, "picture.avif", 52, 6);
$info = getimagesize("picture.avif");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/avif

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imageavif($image);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefromavif, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromavifОткрыть AVIF как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefromavif(string $filename): GdImage|false

Открыть AVIF как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияPHP8.1+, нужен AVIF-enabled libgd/libavif. Кодирование может быть существенно дороже JPEG; готовые превью кешируют.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imageavif($image, "picture.avif", 52, 6);
$loaded = imagecreatefromavif("picture.avif");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imageavif($image, "picture.avif", 52, 6);
$loaded = imagecreatefromavif("picture.avif");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imageavif, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagewbmpЗакодировать готовый холст в WBMP для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagewbmp(GdImage $image,  $file = null, ?int $foreground_color = null): bool

Закодировать готовый холст в WBMP для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; доступен открытый stream resource, который согласно API может закрыться после вызова: не продолжайте писать в него без проверки.
Настройкиforeground_color=null(default black) либо выделенный цвет; все остальные становятся фоном.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьМонохромный формат для старых устройств; не сохраняет фотографические цвета.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать WBMP

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagewbmp($image, "picture.wbmp");
$info = getimagesize("picture.wbmp");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Текстовая проверка результата
8x6 image/vnd.wap.wbmp

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagewbmp($image);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefromwbmp, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromwbmpОткрыть WBMP как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefromwbmp(string $filename): GdImage|false

Открыть WBMP как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияМонохромный формат для старых устройств; не сохраняет фотографические цвета.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagewbmp($image, "picture.wbmp");
$loaded = imagecreatefromwbmp("picture.wbmp");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagewbmp($image, "picture.wbmp");
$loaded = imagecreatefromwbmp("picture.wbmp");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagewbmp, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagexbmЗакодировать готовый холст в XBM для файла или HTTP-ответа.

PHP 8: GdImage · gd

imagexbm(GdImage $image, ?string $filename, ?int $foreground_color = null): bool

Закодировать готовый холст в XBM для файла или HTTP-ответа.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
file / filenameПуть либо null/пропуск для вывода бинарного потока; XBM принимает путь/null, не ресурс.
Настройкиfilename обязателен, но null выводит в поток. foreground_color=null(defaultblack); остальные цвета фон. Имя файла участвует в C-идентификаторах, неподходящие символы заменяются _.
Результат / границаbool успеха, но manual предупреждает: некоторые отказы libgd всё равно возвращают true. Проверяйте фактический файл/длину и декодирование. Не допускайте warning/HTML/пробелов перед бинарным HTTP-ответом.
Когда выбратьТекстовый C-bitmap, а не веб-формат фотографии. С 7.0.9 ширина не обязана быть кратной 8; исторический четвёртый аргумент удалён в 8.0.
Сохранить и проверить форматСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Холст перед кодированиемСкачать PNG
Сохранённый файл8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить и проверить формат: Сохранённый файлСкачать XBM

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagexbm($image, "picture.xbm", 0);
$loaded = imagecreatefromxbm("picture.xbm");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

На белом фоне чёрный прямоугольник и красная точка: по ним видно, что сохранил выбранный формат. У WBMP/XBM остаётся только чёрный рисунок: красная точка не является заданным foreground и превращается в фон. JPEG/WebP/AVIF могут изменить цвета крошечных деталей из-за потерь. Файл доступен рядом с результатом. Не подставляйте непроверенное имя посетителя в путь.

Получить байты для хранилища или ответаСамостоятельный пример
Холст перед кодированием8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Холст перед кодированиемСкачать PNG
Декодированные выходные байты8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить байты для хранилища или ответа: Декодированные выходные байтыСкачать исходные байты

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start();
imagexbm($image, null, 0);
$bytes = ob_get_clean();
echo strlen($bytes) > 0 ? "encoded\n" : "empty\n";
Текстовая проверка результата
encoded

ob_start временно собирает вывод кодека в строку; return функции не содержит изображение. Для HTTP заранее задайте правильный Content-Type и завершите ответ без HTML.

Связанные операции: imagecreatefromxbm, imagetypes, imagesavealpha.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromxbmОткрыть XBM как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

PHP 8: GdImage · gd

imagecreatefromxbm(string $filename): GdImage|false

Открыть XBM как редактируемые пиксели: затем можно вырезать, уменьшить или подписать.

Параметры и результатКак понимать и применять
filenameПуть к файлу нужного формата. URL допустим только при разрешённых wrappers; в сервисе сначала отдельно скачайте разрешённый ресурс с лимитами, не принимайте произвольный URL.
ВозвратGdImage либо false; недоступный/битый файл обычно даёт предупреждение. Распакованный размер может быть во много раз больше файла; сначала лимиты байтов/сторон/пикселей.
ОграниченияТекстовый C-bitmap, а не веб-формат фотографии. С 7.0.9 ширина не обязана быть кратной 8; исторический четвёртый аргумент удалён в 8.0.
Загрузить собственный файлСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Загрузить собственный файл: Декодированный исходникСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagexbm($image, "picture.xbm", 0);
$loaded = imagecreatefromxbm("picture.xbm");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Сначала создаётся и сохраняется маленький опознавательный рисунок; затем декодер возвращает его пиксели в $loaded. Сравните положение чёрного прямоугольника и точки. В своём проекте оставьте строку чтения и передайте путь к реальному файлу нужного формата; подготовительный рисунок не требуется.

Получить небольшую PNG-производнуюСамостоятельный пример
Декодированный исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Декодированный исходникСкачать PNG
Уменьшенная производная4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Получить небольшую PNG-производную: Уменьшенная производнаяСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagexbm($image, "picture.xbm", 0);
$loaded = imagecreatefromxbm("picture.xbm");
$small = imagescale($loaded, 4);
imagepng($small, "thumb.png");
$info = getimagesize("thumb.png");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

Сравните исходник 8 × 6 и превью 4 × 3: вся схема уменьшена, поэтому одиночная точка может потерять контраст. Декодер читает, imagescale пересчитывает пиксели, imagepng записывает новый формат. Переименование .jpg в .png этих действий не выполняет. Для PNG/WebP с alpha дополнительно сохраните настройки прозрачности на новом холсте.

Связанные операции: imagexbm, getimagesize, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromstringОткрыть байты изображения, полученные из БД, API или локального файла без промежуточного сохранения.

PHP 8: GdImage · gd

imagecreatefromstring(string $data): GdImage|false

Открыть байты изображения, полученные из БД, API или локального файла без промежуточного сохранения.

Параметры и результатКак понимать и применять
dataБинарная PHP-строка с самим файлом, не URL, не base64 и не data:-URL. Base64 сначала строго декодируется. Поддержаны JPEG, PNG, GIF, BMP, WBMP, GD2, WebP, AVIF при наличии кодеков.
Возврат / ошибкиGdImage либо false при неизвестном/повреждённом формате; E_WARNING при нераспознанных данных. Наличие строки не отменяет лимиты памяти и пикселей. Анимация не становится поддержанной от смены функции.
Прочитать PNG-байтыСамостоятельный пример
Исходник до кодирования8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Прочитать PNG-байты: Исходник до кодированияСкачать PNG
После передачи и декодирования8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Прочитать PNG-байты: После передачи и декодированияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start(); imagepng($image); $bytes = ob_get_clean();
$loaded = imagecreatefromstring($bytes);
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Вход — содержимое PNG. Переменная с именем файла потребовала бы file_get_contents или imagecreatefrompng.

Принять изображение из учебного JSON-поляСамостоятельный пример
Исходник до кодирования8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Принять изображение из учебного JSON-поля: Исходник до кодированияСкачать PNG
После передачи и декодирования8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Принять изображение из учебного JSON-поля: После передачи и декодированияСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
ob_start(); imagepng($image); $bytes = ob_get_clean();
$payload = json_encode(["picture" => base64_encode($bytes)], JSON_THROW_ON_ERROR);
$data = json_decode($payload, true, flags: JSON_THROW_ON_ERROR);
$binary = base64_decode($data["picture"], true);
if ($binary === false) { throw new UnexpectedValueException("Invalid base64"); }
$loaded = imagecreatefromstring($binary);
echo imagesx($loaded), "\n";
Текстовая проверка результата
8

Перед этими шагами реальный API ограничивает длину запроса и тип поля. Base64 увеличивает объём примерно на треть и не проверяет безопасность файла.

Связанные операции: getimagesizefromstring, imagecreatefrompng.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

getimagesizeУзнать размеры и тип до полного декодирования: выбрать лимит и зарезервировать место на странице.

PHP 8: GdImage · standard

getimagesize(string $filename,  &$image_info = null): array|false

Узнать размеры и тип до полного декодирования: выбрать лимит и зарезервировать место на странице.

Параметры и результатКак понимать и применять
filename / stringЛокальный путь/разрешённый stream для getimagesize; готовые бинарные байты для fromstring. Это функции стандартного расширения, не требуют GD для самого чтения размеров.
image_infoOptional параметр по ссылке получает JPG APP-маркеры для JFIF, например APP13 с IPTC. Он не равен основному возвращённому массиву.
Возвратarray: [0]width,[1]height,[2]IMAGETYPE_*,[3]строка HTML размеров, mime и иногда bits/channels. RGB обычно 3 канала, CMYK4; отсутствие bits/channels допустимо. false при отказе; размеры 0 возможны для сложных/пустых контейнеров.
Особые форматыGIF — logical screen всего файла, не обязательно первый GD кадр; ICO — вариант с наибольшей глубиной; JP2/JPC — максимальная глубина компонент, первый корневой codestream. AVIF корректные размеры/bits/channels с 8.2. EXIForientation не применяет поворот: видимые стороны могут поменяться местами.
Ошибки / довериеНедоступный путь E_WARNING, ошибка чтения E_NOTICE; пустой filename в 8.0+ValueError. Не использовать как доказательство «безопасного изображения»: нужен Fileinfo, выбранный декодер, лимиты и безопасное хранение.
Разобрать возвращённый массивСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "source.png");
$info = getimagesize("source.png");
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Ожидаемый результат
8x6 image/png

Числовой тип IMAGETYPE_* не совпадает с маской IMG_* функции imagetypes.

Применить лимит количества пикселейСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "source.png");
$info = getimagesize("source.png");
$allowed = $info !== false && $info[0] > 0 && $info[1] > 0
    && $info[0] <= 1000 && $info[1] <= 1000
    && $info[0] * $info[1] <= 500000;
echo $allowed ? "size accepted\n" : "rejected\n";
Ожидаемый результат
size accepted

Это только проверка габаритов. Приём загрузки дополнительно проверяет UPLOAD_ERR, размер байтов, MIME, успешный decode и права доступа.

Связанные операции: imagecreatefromstring, iptcparse.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

getimagesizefromstringУзнать размеры и тип до полного декодирования: выбрать лимит и зарезервировать место на странице.

PHP 8: GdImage · standard

getimagesizefromstring(string $string,  &$image_info = null): array|false

Узнать размеры и тип до полного декодирования: выбрать лимит и зарезервировать место на странице.

Параметры и результатКак понимать и применять
filename / stringЛокальный путь/разрешённый stream для getimagesize; готовые бинарные байты для fromstring. Это функции стандартного расширения, не требуют GD для самого чтения размеров.
image_infoOptional параметр по ссылке получает JPG APP-маркеры для JFIF, например APP13 с IPTC. Он не равен основному возвращённому массиву.
Возвратarray: [0]width,[1]height,[2]IMAGETYPE_*,[3]строка HTML размеров, mime и иногда bits/channels. RGB обычно 3 канала, CMYK4; отсутствие bits/channels допустимо. false при отказе; размеры 0 возможны для сложных/пустых контейнеров.
Особые форматыGIF — logical screen всего файла, не обязательно первый GD кадр; ICO — вариант с наибольшей глубиной; JP2/JPC — максимальная глубина компонент, первый корневой codestream. AVIF корректные размеры/bits/channels с 8.2. EXIForientation не применяет поворот: видимые стороны могут поменяться местами.
Ошибки / довериеНедоступный путь E_WARNING, ошибка чтения E_NOTICE; пустой filename в 8.0+ValueError. Не использовать как доказательство «безопасного изображения»: нужен Fileinfo, выбранный декодер, лимиты и безопасное хранение.
Разобрать возвращённый массивСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "source.png");
$info = getimagesizefromstring(file_get_contents("source.png"));
echo $info[0], "x", $info[1], " ", $info["mime"], "\n";
Ожидаемый результат
8x6 image/png

Числовой тип IMAGETYPE_* не совпадает с маской IMG_* функции imagetypes.

Применить лимит количества пикселейСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "source.png");
$info = getimagesizefromstring(file_get_contents("source.png"));
$allowed = $info !== false && $info[0] > 0 && $info[1] > 0
    && $info[0] <= 1000 && $info[1] <= 1000
    && $info[0] * $info[1] <= 500000;
echo $allowed ? "size accepted\n" : "rejected\n";
Ожидаемый результат
size accepted

Это только проверка габаритов. Приём загрузки дополнительно проверяет UPLOAD_ERR, размер байтов, MIME, успешный decode и права доступа.

Связанные операции: imagecreatefromstring, iptcparse.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

image_type_to_extensionПолучить расширение имени для уже определённого формата.

PHP 8: GdImage · standard

image_type_to_extension(int $image_type, bool $include_dot = true): string|false

Получить расширение имени для уже определённого формата.

Параметры и результатКак понимать и применять
image_typeОдна из IMAGETYPE_* функций getimagesize/exif_imagetype, не IMG_* bitmask. Поддерживаемые типы включают GIF, JPEG, PNG, SWF, PSD, BMP, TIFF, JPC/JP2/JPX/JB2, SWC, IFF, WBMP, XBM, ICO, WebP, AVIF и исторические варианты.
include_dot / результатinclude_dot=true(default) включает точку, false убирает; строка либо false для неизвестного типа. Некоторые контейнеры имеют близкие расширения, это не функция декодирования.
Получить обозначение PNGСамостоятельный пример
<?php
declare(strict_types=1);

echo image_type_to_extension(IMAGETYPE_PNG), "\n";
Ожидаемый результат
.png

Расширение файла не проверяется этой функцией — ей уже передали числовой формат.

Назвать производный файлСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "source.bin");
$info = getimagesize("source.bin");
echo "thumbnail.", image_type_to_extension($info[2], false), "\n";
Ожидаемый результат
thumbnail.png

Фактический PNG распознан по данным, хотя исходное имя заканчивалось на.bin.

Связанные операции: getimagesize.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

image_type_to_mime_typeПолучить MIME для HTTP-ответа по известному типу.

PHP 8: GdImage · standard

image_type_to_mime_type(int $image_type): string

Получить MIME для HTTP-ответа по известному типу.

Параметры и результатКак понимать и применять
image_typeОдна из IMAGETYPE_* функций getimagesize/exif_imagetype, не IMG_* bitmask. Поддерживаемые типы включают GIF, JPEG, PNG, SWF, PSD, BMP, TIFF, JPC/JP2/JPX/JB2, SWC, IFF, WBMP, XBM, ICO, WebP, AVIF и исторические варианты.
include_dot / результатMIME возвращается строкой, неизвестный тип даёт application/octet-stream.
Получить обозначение PNGСамостоятельный пример
<?php
declare(strict_types=1);

echo image_type_to_mime_type(IMAGETYPE_PNG), "\n";
Ожидаемый результат
image/png

Расширение файла не проверяется этой функцией — ей уже передали числовой формат.

Назвать производный файлСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "source.bin");
$info = getimagesize("source.bin");
echo image_type_to_mime_type($info[2]), "\n";
Ожидаемый результат
image/png

Фактический PNG распознан по данным, хотя исходное имя заканчивалось на.bin.

Связанные операции: getimagesize.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromtgaПрочитать растровую TGA-текстуру из графического конвейера.

PHP7.4+ · gd

imagecreatefromtga(string $filename): GdImage|false

Прочитать растровую TGA-текстуру из графического конвейера.

Параметры и результатКак понимать и применять
filenameПуть к Truevision TGA, доступная с PHP7.4+функция; поддержка чтения зависит от сборки.
ВозвратGdImage либо false. GD не предоставляет imageTGA для обратной записи; после обработки выбирайте поддержанный выходной формат.
Открыть собственный двухпиксельный TGAСамостоятельный пример
Результат2 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Открыть собственный двухпиксельный TGA: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$header = pack("CCCvvCvvvvCC", 0, 0, 2, 0, 0, 0, 0, 0, 2, 1, 24, 32);
file_put_contents("sample.tga", $header . hex2bin("0000ff00ff00"));
$image = imagecreatefromtga("sample.tga");
echo imagesx($image), "x", imagesy($image), "\n";
Текстовая проверка результата
2x1

18 байт заголовка описывают 2×1truecolor24bit, затем идут два BGR пикселя; это учебный fixture, не необходимость писать TGA вручную в приложении.

Перевести TGA в PNGСамостоятельный пример
Результат2 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Перевести TGA в PNG: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$header = pack("CCCvvCvvvvCC", 0, 0, 2, 0, 0, 0, 0, 0, 2, 1, 24, 32);
file_put_contents("sample.tga", $header . hex2bin("0000ff00ff00"));
$image = imagecreatefromtga("sample.tga");
imagepng($image, "texture.png");
echo getimagesize("texture.png")["mime"], "\n";
Текстовая проверка результата
image/png

Такой шаг удобен для просмотра текстуры на сайте.

Связанные операции: imagepng, gd_info.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromxpmОткрыть текстовый XPM-значок из старого набора графики.

PHP 8: GdImage · gd

imagecreatefromxpm(string $filename): GdImage|false

Открыть текстовый XPM-значок из старого набора графики.

Параметры и результатКак понимать и применять
filenameПуть к XPM. Функция требует сборки с XPM; наличие GD само по себе её не гарантирует.
ВозвратGdImage либо false; повреждённый/неподдержанный вход отклоняется. Отдельного XPM кодера в GD PHP нет.
Прочитать двухцветный значокСамостоятельный пример
Результат2 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Прочитать двухцветный значок: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatefromxpm("icon.xpm");
echo imagesx($image), "x", imagesy($image), "\n";
Текстовая проверка результата
2x1

Каждая буква строки ab ссылается на запись таблицы цветов — аналог палитры.

Сохранить веб-версию значкаСамостоятельный пример
Результат2 × 1 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Сохранить веб-версию значка: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatefromxpm("icon.xpm");
imagepng($image, "icon.png");
echo getimagesize("icon.png")["mime"], "\n";
Текстовая проверка результата
image/png

PNG удобнее для текущего веб-интерфейса.

Связанные операции: imagepng, gd_info.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegdРазобрать старый GD-кеш и выбрать переносимый путь миграции.

PHP 8: GdImage · gd

imagegd(GdImage $image, ?string $file = null): bool

Разобрать старый GD-кеш и выбрать переносимый путь миграции.

Параметры и результатКак понимать и применять
НазначениеСобственные форматы libgd GD/GD2 считаются устаревшими и предназначены только для разработки/тестирования, не для публикации или долговечного обмена.
Аргументыimage — GdImage, file/null выбирает файл/вывод; дополнительного качества нет.
ВозвратЧтение возвращает GdImage|false; запись bool, при отказе libgd возможен true с пустыми данными. Многие актуальные сборки отключают эти кодеки; function_exists не доказывает поддержку конкретного формата.
Проверка фактического кодекаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
$warnings = [];
set_error_handler(static function (int $severity, string $message) use (&$warnings): bool { $warnings[] = $message; return true; });
try {
    ob_start();
    imagegd($image);
    $bytes = ob_get_clean();
} finally { restore_error_handler(); }
echo $bytes === "" && $warnings !== [] ? "codec unavailable in this build\n" : "codec available\n";
Ожидаемый результат
codec available

В этой bundled GD кодек доступен. На другом сервере он может быть отключён. Локальный обработчик фиксирует диагностику только этой проверки.

Восстановить тестовый GD-кешСамостоятельный пример
До записи кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: До записи кешаСкачать PNG
Прочитано из кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: Прочитано из кешаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegd($image, "cache.gd");
$loaded = imagecreatefromgd("cache.gd");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Проверено только в сборке с работающим кодеком. GD2 part читает область; для нового долговечного формата предпочтителен PNG.

Переносимый PNG-кешСамостоятельный пример
До сохранения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: До сохраненияСкачать PNG
Восстановлено из PNG8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: Восстановлено из PNGСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "cache.png");
$restored = imagecreatefrompng("cache.png");
echo imagesx($restored), "x", imagesy($restored), "\n";
Текстовая проверка результата
8x6

PNG не умеет специальное чтение GD2 чанков, но совместим и сохраняет без потерь. Для очень больших изображений выбирайте специализированный tiled формат/библиотеку.

Связанные операции: imagepng, imagecreatefrompng, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegd2Разобрать старый GD-кеш и выбрать переносимый путь миграции.

PHP 8: GdImage · gd

imagegd2(GdImage $image, ?string $file = null, int $chunk_size = 128, int $mode = 1): bool

Разобрать старый GD-кеш и выбрать переносимый путь миграции.

Параметры и результатКак понимать и применять
НазначениеСобственные форматы libgd GD/GD2 считаются устаревшими и предназначены только для разработки/тестирования, не для публикации или долговечного обмена.
Аргументыimage — GdImage, file/null выбирает файл/вывод; chunk_size=128 задаёт блоки (обычно 64..4096), mode IMG_GD2_RAW либо IMG_GD2_COMPRESSED.
ВозвратЧтение возвращает GdImage|false; запись bool, при отказе libgd возможен true с пустыми данными. Многие актуальные сборки отключают эти кодеки; function_exists не доказывает поддержку конкретного формата.
Проверка фактического кодекаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
$warnings = [];
set_error_handler(static function (int $severity, string $message) use (&$warnings): bool { $warnings[] = $message; return true; });
try {
    ob_start();
    imagegd2($image);
    $bytes = ob_get_clean();
} finally { restore_error_handler(); }
echo $bytes === "" && $warnings !== [] ? "codec unavailable in this build\n" : "codec available\n";
Ожидаемый результат
codec available

В этой bundled GD кодек доступен. На другом сервере он может быть отключён. Локальный обработчик фиксирует диагностику только этой проверки.

Восстановить тестовый GD-кешСамостоятельный пример
До записи кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: До записи кешаСкачать PNG
Прочитано из кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: Прочитано из кешаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegd2($image, "cache.gd2", 128, IMG_GD2_COMPRESSED);
$loaded = imagecreatefromgd2("cache.gd2");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Проверено только в сборке с работающим кодеком. GD2 part читает область; для нового долговечного формата предпочтителен PNG.

Переносимый PNG-кешСамостоятельный пример
До сохранения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: До сохраненияСкачать PNG
Восстановлено из PNG8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: Восстановлено из PNGСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "cache.png");
$restored = imagecreatefrompng("cache.png");
echo imagesx($restored), "x", imagesy($restored), "\n";
Текстовая проверка результата
8x6

PNG не умеет специальное чтение GD2 чанков, но совместим и сохраняет без потерь. Для очень больших изображений выбирайте специализированный tiled формат/библиотеку.

Связанные операции: imagepng, imagecreatefrompng, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromgdРазобрать старый GD-кеш и выбрать переносимый путь миграции.

PHP 8: GdImage · gd

imagecreatefromgd(string $filename): GdImage|false

Разобрать старый GD-кеш и выбрать переносимый путь миграции.

Параметры и результатКак понимать и применять
НазначениеСобственные форматы libgd GD/GD2 считаются устаревшими и предназначены только для разработки/тестирования, не для публикации или долговечного обмена.
Аргументыfilename — путь к GD/GD2; декодируется весь файл.
ВозвратЧтение возвращает GdImage|false; запись bool, при отказе libgd возможен true с пустыми данными. Многие актуальные сборки отключают эти кодеки; function_exists не доказывает поддержку конкретного формата.
Проверка фактического кодекаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
$warnings = [];
set_error_handler(static function (int $severity, string $message) use (&$warnings): bool { $warnings[] = $message; return true; });
try {
    ob_start();
    imagegd($image);
    $bytes = ob_get_clean();
} finally { restore_error_handler(); }
echo $bytes === "" && $warnings !== [] ? "codec unavailable in this build\n" : "codec available\n";
Ожидаемый результат
codec available

В этой bundled GD кодек доступен. На другом сервере он может быть отключён. Локальный обработчик фиксирует диагностику только этой проверки.

Восстановить тестовый GD-кешСамостоятельный пример
До записи кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: До записи кешаСкачать PNG
Прочитано из кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: Прочитано из кешаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegd($image, "cache.gd");
$loaded = imagecreatefromgd("cache.gd");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Проверено только в сборке с работающим кодеком. GD2 part читает область; для нового долговечного формата предпочтителен PNG.

Переносимый PNG-кешСамостоятельный пример
До сохранения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: До сохраненияСкачать PNG
Восстановлено из PNG8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: Восстановлено из PNGСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "cache.png");
$restored = imagecreatefrompng("cache.png");
echo imagesx($restored), "x", imagesy($restored), "\n";
Текстовая проверка результата
8x6

PNG не умеет специальное чтение GD2 чанков, но совместим и сохраняет без потерь. Для очень больших изображений выбирайте специализированный tiled формат/библиотеку.

Связанные операции: imagepng, imagecreatefrompng, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromgd2Разобрать старый GD-кеш и выбрать переносимый путь миграции.

PHP 8: GdImage · gd

imagecreatefromgd2(string $filename): GdImage|false

Разобрать старый GD-кеш и выбрать переносимый путь миграции.

Параметры и результатКак понимать и применять
НазначениеСобственные форматы libgd GD/GD2 считаются устаревшими и предназначены только для разработки/тестирования, не для публикации или долговечного обмена.
Аргументыfilename — путь к GD/GD2; декодируется весь файл.
ВозвратЧтение возвращает GdImage|false; запись bool, при отказе libgd возможен true с пустыми данными. Многие актуальные сборки отключают эти кодеки; function_exists не доказывает поддержку конкретного формата.
Проверка фактического кодекаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
$warnings = [];
set_error_handler(static function (int $severity, string $message) use (&$warnings): bool { $warnings[] = $message; return true; });
try {
    ob_start();
    imagegd2($image);
    $bytes = ob_get_clean();
} finally { restore_error_handler(); }
echo $bytes === "" && $warnings !== [] ? "codec unavailable in this build\n" : "codec available\n";
Ожидаемый результат
codec available

В этой bundled GD кодек доступен. На другом сервере он может быть отключён. Локальный обработчик фиксирует диагностику только этой проверки.

Восстановить тестовый GD-кешСамостоятельный пример
До записи кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: До записи кешаСкачать PNG
Прочитано из кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: Прочитано из кешаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegd2($image, "cache.gd2", 128, IMG_GD2_COMPRESSED);
$loaded = imagecreatefromgd2("cache.gd2");
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
8x6

Проверено только в сборке с работающим кодеком. GD2 part читает область; для нового долговечного формата предпочтителен PNG.

Переносимый PNG-кешСамостоятельный пример
До сохранения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: До сохраненияСкачать PNG
Восстановлено из PNG8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: Восстановлено из PNGСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "cache.png");
$restored = imagecreatefrompng("cache.png");
echo imagesx($restored), "x", imagesy($restored), "\n";
Текстовая проверка результата
8x6

PNG не умеет специальное чтение GD2 чанков, но совместим и сохраняет без потерь. Для очень больших изображений выбирайте специализированный tiled формат/библиотеку.

Связанные операции: imagepng, imagecreatefrompng, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecreatefromgd2partРазобрать старый GD-кеш и выбрать переносимый путь миграции.

PHP 8: GdImage · gd

imagecreatefromgd2part(string $filename, int $x, int $y, int $width, int $height): GdImage|false

Разобрать старый GD-кеш и выбрать переносимый путь миграции.

Параметры и результатКак понимать и применять
НазначениеСобственные форматы libgd GD/GD2 считаются устаревшими и предназначены только для разработки/тестирования, не для публикации или долговечного обмена.
Аргументыfilename — путь к GD/GD2; x, y, width, height выделяют исходную область.
ВозвратЧтение возвращает GdImage|false; запись bool, при отказе libgd возможен true с пустыми данными. Многие актуальные сборки отключают эти кодеки; function_exists не доказывает поддержку конкретного формата.
Проверка фактического кодекаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
$warnings = [];
set_error_handler(static function (int $severity, string $message) use (&$warnings): bool { $warnings[] = $message; return true; });
try {
    ob_start();
    imagegd2($image);
    $bytes = ob_get_clean();
} finally { restore_error_handler(); }
echo $bytes === "" && $warnings !== [] ? "codec unavailable in this build\n" : "codec available\n";
Ожидаемый результат
codec available

В этой bundled GD кодек доступен. На другом сервере он может быть отключён. Локальный обработчик фиксирует диагностику только этой проверки.

Восстановить тестовый GD-кешСамостоятельный пример
До записи кеша8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: До записи кешаСкачать PNG
Прочитано из кеша3 × 2 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Восстановить тестовый GD-кеш: Прочитано из кешаСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagegd2($image, "cache.gd2", 128, IMG_GD2_COMPRESSED);
$loaded = imagecreatefromgd2part("cache.gd2", 1, 1, 3, 2);
echo imagesx($loaded), "x", imagesy($loaded), "\n";
Текстовая проверка результата
3x2

Проверено только в сборке с работающим кодеком. GD2 part читает область; для нового долговечного формата предпочтителен PNG.

Переносимый PNG-кешСамостоятельный пример
До сохранения8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: До сохраненияСкачать PNG
Восстановлено из PNG8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Переносимый PNG-кеш: Восстановлено из PNGСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "cache.png");
$restored = imagecreatefrompng("cache.png");
echo imagesx($restored), "x", imagesy($restored), "\n";
Текстовая проверка результата
8x6

PNG не умеет специальное чтение GD2 чанков, но совместим и сохраняет без потерь. Для очень больших изображений выбирайте специализированный tiled формат/библиотеку.

Связанные операции: imagepng, imagecreatefrompng, imagecrop.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

image2wbmpУзнать удалённую функцию в старом проекте и перейти к явному чтению, масштабу и WBMP-кодированию.

Удалена PHP8.0 · gd

image2wbmp(resource $image, string $filename = ?, int $foreground = ?): bool

Узнать удалённую функцию в старом проекте и перейти к явному чтению, масштабу и WBMP-кодированию.

Параметры и результатКак понимать и применять
Статусimage2wbmp deprecated7.3; jpeg2wbmp/png2wbmp deprecated7.2. Все три удалены PHP8.0. Вызов в новом PHP завершится Error.
Исторические аргументыimage2wbmp принимала gd-resource, optionalfilename, foreground(defaultblack). Конвертеры принимали исходный путь, целевой путь, dest_height, dest_width и threshold0..8 — порядок высота/ширина отличается от многих функций GD.
Исторический результатbool, но true не всегда гарантировал файл. Для threshold-конверсии миграция должна явно выбрать порог/палитру: простая замена имени не воспроизводит старое квантование.
Проверить старый вызов перед миграциейСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(function_exists("image2wbmp"));
Ожидаемый результат
bool(false)

Отсутствие в PHP8 ожидаемо; не пытайтесь включить функцию настройкой ini.

Современная явная цепочкаСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Современная явная цепочка: ИсходникСкачать PNG
Уменьшенный WBMP4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Современная явная цепочка: Уменьшенный WBMPСкачать WBMP

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "original.png");
$source = imagecreatefrompng("original.png");
$small = imagescale($source, 4, 3, IMG_NEAREST_NEIGHBOUR);
imagewbmp($small, "legacy.wbmp");
$info = getimagesize("legacy.wbmp");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

WBMP нужен только при требовании старого потребителя. Для сайта оставьте PNG/JPEG/WebP/AVIF.

Связанные операции: imagewbmp, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

jpeg2wbmpУзнать удалённую функцию в старом проекте и перейти к явному чтению, масштабу и WBMP-кодированию.

Удалена PHP8.0 · gd

jpeg2wbmp(string $jpegname, string $wbmpname, int $dest_height, int $dest_width, int $threshold): bool

Узнать удалённую функцию в старом проекте и перейти к явному чтению, масштабу и WBMP-кодированию.

Параметры и результатКак понимать и применять
Статусimage2wbmp deprecated7.3; jpeg2wbmp/png2wbmp deprecated7.2. Все три удалены PHP8.0. Вызов в новом PHP завершится Error.
Исторические аргументыimage2wbmp принимала gd-resource, optionalfilename, foreground(defaultblack). Конвертеры принимали исходный путь, целевой путь, dest_height, dest_width и threshold0..8 — порядок высота/ширина отличается от многих функций GD.
Исторический результатbool, но true не всегда гарантировал файл. Для threshold-конверсии миграция должна явно выбрать порог/палитру: простая замена имени не воспроизводит старое квантование.
Проверить старый вызов перед миграциейСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(function_exists("jpeg2wbmp"));
Ожидаемый результат
bool(false)

Отсутствие в PHP8 ожидаемо; не пытайтесь включить функцию настройкой ini.

Современная явная цепочкаСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Современная явная цепочка: ИсходникСкачать PNG
Уменьшенный WBMP4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Современная явная цепочка: Уменьшенный WBMPСкачать WBMP

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "original.png");
$source = imagecreatefrompng("original.png");
$small = imagescale($source, 4, 3, IMG_NEAREST_NEIGHBOUR);
imagewbmp($small, "legacy.wbmp");
$info = getimagesize("legacy.wbmp");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

WBMP нужен только при требовании старого потребителя. Для сайта оставьте PNG/JPEG/WebP/AVIF.

Связанные операции: imagewbmp, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

png2wbmpУзнать удалённую функцию в старом проекте и перейти к явному чтению, масштабу и WBMP-кодированию.

Удалена PHP8.0 · gd

png2wbmp(string $pngname, string $wbmpname, int $dest_height, int $dest_width, int $threshold): bool

Узнать удалённую функцию в старом проекте и перейти к явному чтению, масштабу и WBMP-кодированию.

Параметры и результатКак понимать и применять
Статусimage2wbmp deprecated7.3; jpeg2wbmp/png2wbmp deprecated7.2. Все три удалены PHP8.0. Вызов в новом PHP завершится Error.
Исторические аргументыimage2wbmp принимала gd-resource, optionalfilename, foreground(defaultblack). Конвертеры принимали исходный путь, целевой путь, dest_height, dest_width и threshold0..8 — порядок высота/ширина отличается от многих функций GD.
Исторический результатbool, но true не всегда гарантировал файл. Для threshold-конверсии миграция должна явно выбрать порог/палитру: простая замена имени не воспроизводит старое квантование.
Проверить старый вызов перед миграциейСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(function_exists("png2wbmp"));
Ожидаемый результат
bool(false)

Отсутствие в PHP8 ожидаемо; не пытайтесь включить функцию настройкой ini.

Современная явная цепочкаСамостоятельный пример
Исходник8 × 6 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Современная явная цепочка: ИсходникСкачать PNG
Уменьшенный WBMP4 × 3 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Современная явная цепочка: Уменьшенный WBMPСкачать WBMP

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
$white = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $white);
$black = imagecolorallocate($image, 0, 0, 0);
imagefilledrectangle($image, 1, 1, 4, 4, $black);
$red = imagecolorallocate($image, 220, 50, 45);
imagesetpixel($image, 6, 1, $red);
imagepng($image, "original.png");
$source = imagecreatefrompng("original.png");
$small = imagescale($source, 4, 3, IMG_NEAREST_NEIGHBOUR);
imagewbmp($small, "legacy.wbmp");
$info = getimagesize("legacy.wbmp");
echo $info[0], "x", $info[1], "\n";
Текстовая проверка результата
4x3

WBMP нужен только при требовании старого потребителя. Для сайта оставьте PNG/JPEG/WebP/AVIF.

Связанные операции: imagewbmp, imagescale.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegrabscreenПолучить экран Windows в локальном инструменте, когда пользователь явно запросил снимок.

PHP 8: GdImage · gd

imagegrabscreen(): GdImage|false

Получить экран Windows в локальном инструменте, когда пользователь явно запросил снимок.

Параметры и результатКак понимать и применять
ОкружениеТолько Windows и доступный интерактивный рабочий стол. Это не скриншот браузера посетителя: PHP на сервере видит окружение сервера.
АргументыНет.
ВозвратGdImage либо false; сервисная сессия/права/состояние окна влияют на результат. Не используйте для рендера произвольной веб-страницы.
Проверить наличие API без снимкаСамостоятельный пример
<?php
declare(strict_types=1);

echo PHP_OS_FAMILY === "Windows" && function_exists("imagegrabscreen") ? "Windows API present\n" : "not available\n";
Ожидаемый результат
Windows API present

Проверка не захватывает экран и не доказывает доступность снимка в текущей сессии.

Локальный вызов после выбора пользователемФрагмент или команда
$screen = imagegrabscreen();

Это контекстный фрагмент. Захват экрана/окна не выполнялся; результат следует проверить !==false, затем сохранить через imagepng.

Связанные операции: imagepng.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagegrabwindowПолучить окно Windows в локальном инструменте, когда пользователь явно запросил снимок.

PHP 8: GdImage · gd

imagegrabwindow(int $handle, bool $client_area = false): GdImage|false

Получить окно Windows в локальном инструменте, когда пользователь явно запросил снимок.

Параметры и результатКак понимать и применять
ОкружениеТолько Windows и доступный интерактивный рабочий стол. Это не скриншот браузера посетителя: PHP на сервере видит окружение сервера.
Аргументыhandle — HWND целевой windows-форточки, не PID и не браузерный tabId; client_area=true выбирает клиентскую область, false включает оформление окна. Неверный HWND даёт E_NOTICE, слишком старый WindowsAPI E_WARNING.
ВозвратGdImage либо false; сервисная сессия/права/состояние окна влияют на результат. Не используйте для рендера произвольной веб-страницы.
Проверить наличие API без снимкаСамостоятельный пример
<?php
declare(strict_types=1);

echo PHP_OS_FAMILY === "Windows" && function_exists("imagegrabwindow") ? "Windows API present\n" : "not available\n";
Ожидаемый результат
Windows API present

Проверка не захватывает экран и не доказывает доступность снимка в текущей сессии.

Локальный вызов после выбора пользователемФрагмент или команда
$window = imagegrabwindow($windowHandle, true);

Это контекстный фрагмент. Захват экрана/окна не выполнялся; результат следует проверить !==false, затем сохранить через imagepng.

Связанные операции: imagepng.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefontwidthУзнать ширину одной ячейки bitmapшрифта перед размещением подписи.

PHP 8: GdImage · gd

imagefontwidth(GdFont|int $font): int

Узнать ширину одной ячейки bitmap шрифта перед размещением подписи.

Параметры и результатКак понимать и применять
fontЦелое 1..5 выбирает встроенный Latin2bitmap шрифт (большее число крупнее), либо GdFont из imageloadfont (PHP8.1+). Это не путь.ttf и не размер в points; UTF-8 кириллица требует FreeType.
Возвратint пикселей. Встроенные шрифты моноширинные, поэтому ASCII строка занимает strlen(text)×width. Это не измерение UTF-8TrueType текста.
Измерить встроенный шрифтСамостоятельный пример
<?php
declare(strict_types=1);

echo imagefontwidth(1), "\n";
Ожидаемый результат
5

У первого шрифта ячейка 5×8 пикселей.

Рассчитать холст под короткий кодСамостоятельный пример
Надпись SKU42 с рассчитанными полями43 × 21 пикселей · увеличение до 4× (на узком экране может уменьшаться)
Рассчитать холст под короткий код: Надпись SKU42 с рассчитанными полямиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$label = "SKU42";
$width = strlen($label) * imagefontwidth(3) + 8;
$height = imagefontheight(3) + 8;
$image = imagecreatetruecolor($width, $height);
$ink = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 3, 4, 4, $label, $ink);
echo imagesx($image) > 8 && imagesy($image) > 8 ? "text and padding fit\n" : "too small\n";
Текстовая проверка результата
text and padding fit

На картинке виден код SKU42 с отступом 4 пикселя со всех сторон. imagestring использует тот же шрифт 3, которым посчитаны размеры. Четыре пикселя с каждой стороны добавляют 8 к общей длине. Для перевода текста на кириллицу меняется и способ измерения.

Связанные операции: imagestring, imagettfbbox.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefontheightУзнать высоту одной ячейки bitmapшрифта перед размещением подписи.

PHP 8: GdImage · gd

imagefontheight(GdFont|int $font): int

Узнать высоту одной ячейки bitmap шрифта перед размещением подписи.

Параметры и результатКак понимать и применять
fontЦелое 1..5 выбирает встроенный Latin2bitmap шрифт (большее число крупнее), либо GdFont из imageloadfont (PHP8.1+). Это не путь.ttf и не размер в points; UTF-8 кириллица требует FreeType.
Возвратint пикселей. Встроенные шрифты моноширинные, поэтому ASCII строка занимает strlen(text)×width. Это не измерение UTF-8TrueType текста.
Измерить встроенный шрифтСамостоятельный пример
<?php
declare(strict_types=1);

echo imagefontheight(1), "\n";
Ожидаемый результат
8

У первого шрифта ячейка 5×8 пикселей.

Рассчитать холст под короткий кодСамостоятельный пример
Надпись SKU42 с рассчитанными полями43 × 21 пикселей · увеличение до 4× (на узком экране может уменьшаться)
Рассчитать холст под короткий код: Надпись SKU42 с рассчитанными полямиСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$label = "SKU42";
$width = strlen($label) * imagefontwidth(3) + 8;
$height = imagefontheight(3) + 8;
$image = imagecreatetruecolor($width, $height);
$ink = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 3, 4, 4, $label, $ink);
echo imagesx($image) > 8 && imagesy($image) > 8 ? "text and padding fit\n" : "too small\n";
Текстовая проверка результата
text and padding fit

На картинке виден код SKU42 с отступом 4 пикселя со всех сторон. imagestring использует тот же шрифт 3, которым посчитаны размеры. Четыре пикселя с каждой стороны добавляют 8 к общей длине. Для перевода текста на кириллицу меняется и способ измерения.

Связанные операции: imagestring, imagettfbbox.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecharНарисовать один bitmapсимвол горизонтально, например код позиции на схеме.

PHP 8: GdImage · gd

imagechar(GdImage $image, GdFont|int $font, int $x, int $y, string $char, int $color): true

Нарисовать один bitmap символ горизонтально, например код позиции на схеме.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
fontЦелое 1..5 выбирает встроенный Latin2bitmap шрифт (большее число крупнее), либо GdFont из imageloadfont (PHP8.1+). Это не путь.ttf и не размер в points; UTF-8 кириллица требует FreeType.
x, yТочка начала; верхний левый угол bitmap ячейки, в отличие от baselineFreeType.
char/string, colorТекст в однобайтовом наборе шрифта, используется первый символ; color из imagecolorallocate. Не передавайте UTF-8 многобайтовый текст как последовательность правильных glyphs.
Возвратtrue; изменяет холст. Не переносит длинный текст по шири не и не подбирает размер автоматически.
Вывести подпись на холстСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Вывести подпись на холст: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagechar($image, 3, 2, 2, "A", $white);
imagepng($image, "label.png");
echo "label.png\n";
Текстовая проверка результата
label.png

На картинке виден результат: одна буква A, расположенная слева направо. Здесь не нужны циклы или подсчёт пикселей: проверьте знак, направление и отступы непосредственно на PNG.

Сохранить графическую подписьСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Сохранить графическую подпись: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagechar($image, 3, 2, 2, "A", $white);
imagepng($image, "label.png");
echo getimagesize("label.png")["mime"], "\n";
Текстовая проверка результата
image/png

Для посетителя текст важного интерфейса лучше оставить HTML; растровые подписи уместны в экспортируемом изображении.

Связанные операции: imagefontwidth, imagefontheight, imagettftext.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagecharupНарисовать один bitmapсимвол вертикально снизу вверх, например подпись оси.

PHP 8: GdImage · gd

imagecharup(GdImage $image, GdFont|int $font, int $x, int $y, string $char, int $color): true

Нарисовать один bitmap символ вертикально снизу вверх, например подпись оси.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
fontЦелое 1..5 выбирает встроенный Latin2bitmap шрифт (большее число крупнее), либо GdFont из imageloadfont (PHP8.1+). Это не путь.ttf и не размер в points; UTF-8 кириллица требует FreeType.
x, yТочка начала; у stringup это нижний левый угол, направление снизу вверх.
char/string, colorТекст в однобайтовом наборе шрифта, используется первый символ; color из imagecolorallocate. Не передавайте UTF-8 многобайтовый текст как последовательность правильных glyphs.
Возвратtrue; изменяет холст. Не переносит длинный текст по шири не и не подбирает размер автоматически.
Вывести подпись на холстСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Вывести подпись на холст: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagecharup($image, 3, 2, 35, "A", $white);
imagepng($image, "label.png");
echo "label.png\n";
Текстовая проверка результата
label.png

На картинке виден результат: одна буква A, направленная снизу вверх. Здесь не нужны циклы или подсчёт пикселей: проверьте знак, направление и отступы непосредственно на PNG.

Сохранить графическую подписьСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Сохранить графическую подпись: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagecharup($image, 3, 2, 35, "A", $white);
imagepng($image, "label.png");
echo getimagesize("label.png")["mime"], "\n";
Текстовая проверка результата
image/png

Для посетителя текст важного интерфейса лучше оставить HTML; растровые подписи уместны в экспортируемом изображении.

Связанные операции: imagefontwidth, imagefontheight, imagettftext.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagestringНарисовать короткую bitmapстроку горизонтально, например код позиции на схеме.

PHP 8: GdImage · gd

imagestring(GdImage $image, GdFont|int $font, int $x, int $y, string $string, int $color): true

Нарисовать короткую bitmap строку горизонтально, например код позиции на схеме.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
fontЦелое 1..5 выбирает встроенный Latin2bitmap шрифт (большее число крупнее), либо GdFont из imageloadfont (PHP8.1+). Это не путь.ttf и не размер в points; UTF-8 кириллица требует FreeType.
x, yТочка начала; верхний левый угол bitmap ячейки, в отличие от baselineFreeType.
char/string, colorТекст в однобайтовом наборе шрифта, color из imagecolorallocate. Не передавайте UTF-8 многобайтовый текст как последовательность правильных glyphs.
Возвратtrue; изменяет холст. Не переносит длинный текст по шири не и не подбирает размер автоматически.
Вывести подпись на холстСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Вывести подпись на холст: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 3, 2, 2, "ABC", $white);
imagepng($image, "label.png");
echo "label.png\n";
Текстовая проверка результата
label.png

На картинке виден результат: строка ABC, расположенная слева направо. Здесь не нужны циклы или подсчёт пикселей: проверьте знак, направление и отступы непосредственно на PNG.

Сохранить графическую подписьСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Сохранить графическую подпись: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, 3, 2, 2, "ABC", $white);
imagepng($image, "label.png");
echo getimagesize("label.png")["mime"], "\n";
Текстовая проверка результата
image/png

Для посетителя текст важного интерфейса лучше оставить HTML; растровые подписи уместны в экспортируемом изображении.

Связанные операции: imagefontwidth, imagefontheight, imagettftext.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagestringupНарисовать короткую bitmapстроку вертикально снизу вверх, например подпись оси.

PHP 8: GdImage · gd

imagestringup(GdImage $image, GdFont|int $font, int $x, int $y, string $string, int $color): true

Нарисовать короткую bitmap строку вертикально снизу вверх, например подпись оси.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
fontЦелое 1..5 выбирает встроенный Latin2bitmap шрифт (большее число крупнее), либо GdFont из imageloadfont (PHP8.1+). Это не путь.ttf и не размер в points; UTF-8 кириллица требует FreeType.
x, yТочка начала; у stringup это нижний левый угол, направление снизу вверх.
char/string, colorТекст в однобайтовом наборе шрифта, color из imagecolorallocate. Не передавайте UTF-8 многобайтовый текст как последовательность правильных glyphs.
Возвратtrue; изменяет холст. Не переносит длинный текст по шири не и не подбирает размер автоматически.
Вывести подпись на холстСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Вывести подпись на холст: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagestringup($image, 3, 2, 35, "ABC", $white);
imagepng($image, "label.png");
echo "label.png\n";
Текстовая проверка результата
label.png

На картинке виден результат: строка ABC, направленная снизу вверх. Здесь не нужны циклы или подсчёт пикселей: проверьте знак, направление и отступы непосредственно на PNG.

Сохранить графическую подписьСамостоятельный пример
Результат50 × 40 пикселей · увеличение до 3× (на узком экране может уменьшаться)
Сохранить графическую подпись: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$image = imagecreatetruecolor(50, 40);
$white = imagecolorallocate($image, 255, 255, 255);
imagestringup($image, 3, 2, 35, "ABC", $white);
imagepng($image, "label.png");
echo getimagesize("label.png")["mime"], "\n";
Текстовая проверка результата
image/png

Для посетителя текст важного интерфейса лучше оставить HTML; растровые подписи уместны в экспортируемом изображении.

Связанные операции: imagefontwidth, imagefontheight, imagettftext.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageloadfontЗагрузить собственный небольшой bitmapшрифт для старой фиксированной пиксельной схемы.

PHP 8: GdImage · gd

imageloadfont(string $filename): GdFont|false

Загрузить собственный небольшой bitmap шрифт для старой фиксированной пиксельной схемы.

Параметры и результатКак понимать и применять
filenameПуть к бинарному GDF шрифту. Формат зависит от архитектуры CPU: 4nativeCint — количество символов, код первого, ширина и высота каждого; затем nchars×width×height байтов пикселей.
Возврат / версииGdFont либо false; до 8.1 возвращался int. Для.ttf эта функция не подходит. Не принимайте произвольный шрифтовой файл от посетителя.
Создать учебный шрифт из одного блокаСамостоятельный пример
<?php
declare(strict_types=1);

$header = pack("i4", 1, 65, 2, 2);
file_put_contents("fixture.gdf", $header . chr(1) . chr(1) . chr(1) . chr(1));
$font = imageloadfont("fixture.gdf");
echo get_class($font), " ", imagefontwidth($font), "x", imagefontheight($font), "\n";
Ожидаемый результат
GdFont 2x2

pack i использует машинный signedint; fixture создаётся и читается на одной архитектуре. Символ A здесь специально выглядит квадратом.

Применить загруженный GdFontСамостоятельный пример
Результат4 × 4 пикселей · увеличение до 16× (на узком экране может уменьшаться)
Применить загруженный GdFont: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$header = pack("i4", 1, 65, 2, 2);
file_put_contents("fixture.gdf", $header . chr(1) . chr(1) . chr(1) . chr(1));
$font = imageloadfont("fixture.gdf");
$image = imagecreatetruecolor(4, 4);
$white = imagecolorallocate($image, 255, 255, 255);
imagestring($image, $font, 0, 0, "A", $white);
echo imagecolorat($image, 0, 0) === $white ? "custom glyph drawn\n" : "empty\n";
Текстовая проверка результата
custom glyph drawn

Объект font передаётся в обычную imagestring, поэтому приложение не знает внутренний двоичный формат.

Связанные операции: imagestring, imagefontwidth, imagefontheight.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imageftbboxИзмерить будущую надпись до рисования, чтобы она не обрезалась и помещалась в плашку.

PHP 8: GdImage · gd

imageftbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array|false

Измерить будущую надпись до рисования, чтобы она не обрезалась и помещалась в плашку.

Параметры и результатКак понимать и применять
size, anglesize — размер в points, не пикселях; angle — градусы против часовой стрелки,0 обычный текст,90 снизу вверх.
font_filenameЯвный проверенный абсолютный путь к.ttf. Относительный поиск/GDFONTPATH зависит от libgd; старые GD до 2.0.18 имели проблемы с пробелами в путях. open_basedir не защищает путь шрифта — не давайте пользователю выбирать произвольный файл.
string/text, optionsUTF-8 текст, нужные glyphs должны быть в шрифте. Числовые HTML references поддержаны, именованные вроде &copy; предварительно декодируются. options["linespacing"] float задаёт межстрочный интервал.
Возвратarray из 8 координат четырёх углов:0,1 нижний левый;2,3 нижний правый;4,5 верхний правый;6,7 верхний левый относительно направления текста. false при отказе. Для повернутого текста габариты вычисляются через min/max всех x/y, а не только x2−x0.
ВерсииС PHP 8 imagettfbbox — alias imageftbbox, imagettftext — alias imagefttext; раньше FT варианты дополнительно принимали options.
Получить четыре угла текстаСамостоятельный пример
<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$box = imageftbbox(18.0, 0.0, $font, "Чашка");
echo count($box), "\n";
echo max($box[0], $box[2], $box[4], $box[6]) > min($box[0], $box[2], $box[4], $box[6]) ? "positive width\n" : "empty\n";
Ожидаемый результат
8
positive width

В архиве настоящий DejaVu Sans с кириллицей и лицензией. Первые строки восстанавливают TTF из текстового вложения; в проекте с готовым TTF оставьте путь $font. Четыре угла описывают слово Чашка относительно baseline, а не новый рисунок. Для видимой подписи следующий шаг — imagefttext.

Посчитать границы с учётом отрицательных координатСамостоятельный пример
<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$box = imageftbbox(18.0, 0.0, $font, "Чашка");
$xs = [$box[0], $box[2], $box[4], $box[6]];
$ys = [$box[1], $box[3], $box[5], $box[7]];
$width = max($xs) - min($xs) + 8;
$height = max($ys) - min($ys) + 8;
$x = 4 - min($xs);
$y = 4 - min($ys);
echo $width > 8 && $height > 8 && $y >= 4 ? "box with padding ready\n" : "invalid\n";
Ожидаемый результат
box with padding ready

Отрицательная верхняя координата нормальна: bbox отсчитывается от базовой линии, а не от верха холста.

Связанные операции: imagefttext, imagettftext.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagettfbboxИзмерить будущую надпись до рисования, чтобы она не обрезалась и помещалась в плашку.

PHP 8: GdImage · gd

imagettfbbox(float $size, float $angle, string $font_filename, string $string, array $options = []): array|false

Измерить будущую надпись до рисования, чтобы она не обрезалась и помещалась в плашку.

Параметры и результатКак понимать и применять
size, anglesize — размер в points, не пикселях; angle — градусы против часовой стрелки,0 обычный текст,90 снизу вверх.
font_filenameЯвный проверенный абсолютный путь к.ttf. Относительный поиск/GDFONTPATH зависит от libgd; старые GD до 2.0.18 имели проблемы с пробелами в путях. open_basedir не защищает путь шрифта — не давайте пользователю выбирать произвольный файл.
string/text, optionsUTF-8 текст, нужные glyphs должны быть в шрифте. Числовые HTML references поддержаны, именованные вроде &copy; предварительно декодируются. options["linespacing"] float задаёт межстрочный интервал.
Возвратarray из 8 координат четырёх углов:0,1 нижний левый;2,3 нижний правый;4,5 верхний правый;6,7 верхний левый относительно направления текста. false при отказе. Для повернутого текста габариты вычисляются через min/max всех x/y, а не только x2−x0.
ВерсииС PHP 8 imagettfbbox — alias imageftbbox, imagettftext — alias imagefttext; раньше FT варианты дополнительно принимали options.
Получить четыре угла текстаСамостоятельный пример
<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$box = imagettfbbox(18.0, 0.0, $font, "Чашка");
echo count($box), "\n";
echo max($box[0], $box[2], $box[4], $box[6]) > min($box[0], $box[2], $box[4], $box[6]) ? "positive width\n" : "empty\n";
Ожидаемый результат
8
positive width

В архиве настоящий DejaVu Sans с кириллицей и лицензией. Первые строки восстанавливают TTF из текстового вложения; в проекте с готовым TTF оставьте путь $font. Четыре угла описывают слово Чашка относительно baseline, а не новый рисунок. Для видимой подписи следующий шаг — imagefttext.

Посчитать границы с учётом отрицательных координатСамостоятельный пример
<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$box = imagettfbbox(18.0, 0.0, $font, "Чашка");
$xs = [$box[0], $box[2], $box[4], $box[6]];
$ys = [$box[1], $box[3], $box[5], $box[7]];
$width = max($xs) - min($xs) + 8;
$height = max($ys) - min($ys) + 8;
$x = 4 - min($xs);
$y = 4 - min($ys);
echo $width > 8 && $height > 8 && $y >= 4 ? "box with padding ready\n" : "invalid\n";
Ожидаемый результат
box with padding ready

Отрицательная верхняя координата нормальна: bbox отсчитывается от базовой линии, а не от верха холста.

Связанные операции: imagefttext, imagettftext.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagefttextПодписать изображение масштабируемым шрифтом: название товара, дата отчёта или водяной знак.

PHP 8: GdImage · gd

imagefttext(GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array|false

Подписать изображение масштабируемым шрифтом: название товара, дата отчёта или водяной знак.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
size, anglesize — размер в points, не пикселях; angle — градусы против часовой стрелки,0 обычный текст,90 снизу вверх.
font_filenameЯвный проверенный абсолютный путь к.ttf. Относительный поиск/GDFONTPATH зависит от libgd; старые GD до 2.0.18 имели проблемы с пробелами в путях. open_basedir не защищает путь шрифта — не давайте пользователю выбирать произвольный файл.
string/text, optionsUTF-8 текст, нужные glyphs должны быть в шрифте. Числовые HTML references поддержаны, именованные вроде &copy; предварительно декодируются. options["linespacing"] float задаёт межстрочный интервал.
Возвратarray из 8 координат четырёх углов:0,1 нижний левый;2,3 нижний правый;4,5 верхний правый;6,7 верхний левый относительно направления текста. false при отказе. Для повернутого текста габариты вычисляются через min/max всех x/y, а не только x2−x0.
ВерсииС PHP 8 imagettfbbox — alias imageftbbox, imagettftext — alias imagefttext; раньше FT варианты дополнительно принимали options.
x, y, colorx, y — точка базовой линии первого символа, не верхний левый угол и не нижняя граница всех glyphs. Цвет из allocate; отрицательное значение color выключает сглаживание для FreeType. Для чёрного 0 отрицание не меняет число — выбирайте подходящий способ/палитру осознанно.
Нарисовать текст по baselineСамостоятельный пример
Результат240 × 70 пикселей
Нарисовать текст по baseline: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$image = imagecreatetruecolor(240, 70);
$white = imagecolorallocate($image, 255, 255, 255);
$box = imagefttext($image, 18.0, 0.0, 4, 44, $white, $font, "Чашка");
echo count($box), " coordinates\n";
imagepng($image, "label.png");
echo getimagesize("label.png")[0], "x", getimagesize("label.png")[1], "\n";
Текстовая проверка результата
8 coordinates
240x70

На картинке настоящее русское слово Чашка. Размер 18 задан в points; координата y=44 — базовая линия, на которой стоят буквы, а не верхняя граница текста. Успешный bbox не означает, что всё помещается: слишком длинная строка выйдет за холст. В архиве есть лицензия шрифта.

Разместить текст по центру с измерениемСамостоятельный пример
Результат240 × 70 пикселей
Разместить текст по центру с измерением: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$image = imagecreatetruecolor(240, 70);
$white = imagecolorallocate($image, 255, 255, 255);
$box = imageftbbox(18.0, 0.0, $font, "Чашка");
$left = min($box[0], $box[2], $box[4], $box[6]);
$right = max($box[0], $box[2], $box[4], $box[6]);
$x = (int) floor((imagesx($image) - ($right - $left)) / 2 - $left);
imagefttext($image, 18.0, 0.0, $x, 44, $white, $font, "Чашка");
echo $x > 0 ? "centered with margin\n" : "too wide\n";
Текстовая проверка результата
centered with margin

Текст измерен теми же font/size/angle, которыми рисуется. Для длинной подписи выберите перенос или меньший размер; обрезать молча неудобно.

Связанные операции: imageftbbox, imagettfbbox, imagestring.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

imagettftextПодписать изображение масштабируемым шрифтом: название товара, дата отчёта или водяной знак.

PHP 8: GdImage · gd

imagettftext(GdImage $image, float $size, float $angle, int $x, int $y, int $color, string $font_filename, string $text, array $options = []): array|false

Подписать изображение масштабируемым шрифтом: название товара, дата отчёта или водяной знак.

Параметры и результатКак понимать и применять
imageОбъект GdImage — распакованные пиксели в памяти, не имя файла. Создайте холст или декодируйте файл. Операции рисования меняют этот же объект; присваивание другой переменной его не копирует.
size, anglesize — размер в points, не пикселях; angle — градусы против часовой стрелки,0 обычный текст,90 снизу вверх.
font_filenameЯвный проверенный абсолютный путь к.ttf. Относительный поиск/GDFONTPATH зависит от libgd; старые GD до 2.0.18 имели проблемы с пробелами в путях. open_basedir не защищает путь шрифта — не давайте пользователю выбирать произвольный файл.
string/text, optionsUTF-8 текст, нужные glyphs должны быть в шрифте. Числовые HTML references поддержаны, именованные вроде &copy; предварительно декодируются. options["linespacing"] float задаёт межстрочный интервал.
Возвратarray из 8 координат четырёх углов:0,1 нижний левый;2,3 нижний правый;4,5 верхний правый;6,7 верхний левый относительно направления текста. false при отказе. Для повернутого текста габариты вычисляются через min/max всех x/y, а не только x2−x0.
ВерсииС PHP 8 imagettfbbox — alias imageftbbox, imagettftext — alias imagefttext; раньше FT варианты дополнительно принимали options.
x, y, colorx, y — точка базовой линии первого символа, не верхний левый угол и не нижняя граница всех glyphs. Цвет из allocate; отрицательное значение color выключает сглаживание для FreeType. Для чёрного 0 отрицание не меняет число — выбирайте подходящий способ/палитру осознанно.
Нарисовать текст по baselineСамостоятельный пример
Результат240 × 70 пикселей
Нарисовать текст по baseline: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$image = imagecreatetruecolor(240, 70);
$white = imagecolorallocate($image, 255, 255, 255);
$box = imagettftext($image, 18.0, 0.0, 4, 44, $white, $font, "Чашка");
echo count($box), " coordinates\n";
imagepng($image, "label.png");
echo getimagesize("label.png")[0], "x", getimagesize("label.png")[1], "\n";
Текстовая проверка результата
8 coordinates
240x70

На картинке настоящее русское слово Чашка. Размер 18 задан в points; координата y=44 — базовая линия, на которой стоят буквы, а не верхняя граница текста. Успешный bbox не означает, что всё помещается: слишком длинная строка выйдет за холст. В архиве есть лицензия шрифта.

Разместить текст по центру с измерениемСамостоятельный пример
Результат240 × 70 пикселей
Разместить текст по центру с измерением: РезультатСкачать PNG

Изображения получены выполнением кода этого примера. Шахматный фон обозначает прозрачность и не входит в PNG.

<?php
declare(strict_types=1);

$fontBytes = base64_decode(file_get_contents("fixture-font.base64"), true);
file_put_contents("fixture.ttf", $fontBytes);
$font = __DIR__ . "/fixture.ttf";
$image = imagecreatetruecolor(240, 70);
$white = imagecolorallocate($image, 255, 255, 255);
$box = imageftbbox(18.0, 0.0, $font, "Чашка");
$left = min($box[0], $box[2], $box[4], $box[6]);
$right = max($box[0], $box[2], $box[4], $box[6]);
$x = (int) floor((imagesx($image) - ($right - $left)) / 2 - $left);
imagettftext($image, 18.0, 0.0, $x, 44, $white, $font, "Чашка");
echo $x > 0 ? "centered with margin\n" : "too wide\n";
Текстовая проверка результата
centered with margin

Текст измерен теми же font/size/angle, которыми рисуется. Для длинной подписи выберите перенос или меньший размер; обрезать молча неудобно.

Связанные операции: imageftbbox, imagettfbbox, imagestring.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

iptcparseПолучить подпись или ключевые слова из IPTCблока фотографического архива.

PHP 8: GdImage · standard

iptcparse(string $iptc_block): array|false

Получить подпись или ключевые слова из IPTC блока фотографического архива.

Параметры и результатКак понимать и применять
iptc_blockБинарный IPTC блок, обычно APP13 из getimagesize($filename,$info), не полный JPEG и не JSON.
ВозвратАссоциативный массив: ключи вроде 2#120(подпись),2#025(ключевые слова),2#080(автор), значения — массивы, потому что тег может повторяться. false при ошибке/отсутствии IPTC.
ТекстIPTC байты не гарантированно UTF-8; учитывайте объявленную кодировку(например 1#090) и договор поставщика. При выводе в HTML экранируйте подпись, не доверяйте metadata.
Прочитать один двоичный тегСамостоятельный пример
<?php
declare(strict_types=1);

$caption = "Manual photo";
$block = chr(0x1c) . chr(2) . chr(120) . pack("n", strlen($caption)) . $caption;
$tags = iptcparse($block);
echo $tags["2#120"][0], "\n";
Ожидаемый результат
Manual photo

1C — маркер,2 номер записи,120 номер поля, два байта длины, затем текст; iptcparse снимает с вас ручной разбор.

Повторяющиеся ключевые словаСамостоятельный пример
<?php
declare(strict_types=1);

$block = "";
foreach (["shop", "catalog"] as $word) {
    $block .= chr(0x1c) . chr(2) . chr(25) . pack("n", strlen($word)) . $word;
}
$tags = iptcparse($block);
echo implode(",", $tags["2#025"]), "\n";
Ожидаемый результат
shop,catalog

Нельзя ожидать скаляр из каждого поля: несколько ключевых слов представлены массивом.

Связанные операции: iptcembed, getimagesize.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

iptcembedДобавитьIPTCподпись кJPEGархива, не изменяя сами пиксели.

PHP 8: GdImage · standard

iptcembed(string $iptc_data, string $filename, int $spool = 0): string|bool

Добавить IPTC подпись к JPEG архива, не изменяя сами пиксели.

Параметры и результатКак понимать и применять
iptc_data, filenameБинарный IPTC блок и путь к существующему JPEG. Функция не принимает GdImage; перед этим закодируйте картинку при необходимости.
spool0(default)возвращает JPEG строкой;1 возвращает строку и выводит её;2 и выше выводят байты в STDOUT и больше не возвращают JPEG. Уточняйте политику вывода: метаданные не должны смешаться с HTML.
ВозвратПри spool<2 string|false; при spool≥2 bool. Оригинальный файл не перезаписывается автоматически: сохраните вернувшуюся строку по выбранному пути.
ГраницаЭто IPTC-IIM, не EXIF/XMP редактор. Перезапись JPEG через GD может выбросить metadata; если поля нужны, перенесите их явно. Длина обычных коротких dataset кодируется двумя байтами; для больших нужна расширенная IPTC длина.
Добавить подпись и прочитать её обратноСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagejpeg($image, "photo.jpg");
$caption = "Manual photo";
$block = chr(0x1c) . chr(2) . chr(120) . pack("n", strlen($caption)) . $caption;
$jpeg = iptcembed($block, "photo.jpg", 0);
file_put_contents("tagged.jpg", $jpeg);
$info = [];
getimagesize("tagged.jpg", $info);
$tags = iptcparse($info["APP13"]);
echo $tags["2#120"][0], "\n";
Ожидаемый результат
Manual photo

image_info заполняется по ссылке, основной результат getimagesize содержит другие данные.

Захватить режим прямого выводаСамостоятельный пример
<?php
declare(strict_types=1);

$image = imagecreatetruecolor(8, 6);
imagejpeg($image, "photo.jpg");
$caption = "Manual photo";
$block = chr(0x1c) . chr(2) . chr(120) . pack("n", strlen($caption)) . $caption;
ob_start();
$ok = iptcembed($block, "photo.jpg", 2);
$bytes = ob_get_clean();
echo $ok && strlen($bytes) > 0 ? "JPEG output captured\n" : "failed\n";
Ожидаемый результат
JPEG output captured

В HTTP обработчике header передаётся до вызова. Буфер здесь нужен для автономной проверки, не для сокрытия ошибок.

Связанные операции: iptcparse, imagejpeg, getimagesize.

Первый холст, координаты, пиксели и сохранение · Ошибки, размер и граница загрузки.

Источники и обсуждения

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

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

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

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