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

Дерево руководства
Глава 409 · После первых изображений Gmagick
Gmagick: поворот, сдвиг узора, наклон и масштаб
Сравнить пять геометрических преобразований по видимому результату и фактическому размеру.
Сравнить поворот на прямой и небольшой угол
В каталоге нужны два представления одной карточки: портретный поворот на четверть оборота и небольшой декоративный наклон. На прямом угле стороны просто меняются местами. На 15° рисунок занимает больший прямоугольник; появившиеся углы нужно осознанно заполнить цветом.



<?php
$image = new Gmagick(__DIR__ . '/product.ppm');
$tilted = clone $image;
$tilted->rotateImage('#e5a74a', 15.0);
$tilted->setImageFormat('PNG');
$tilted->writeImage(__DIR__ . '/tilted.png');Первый аргумент rotateImage — фон новых участков, второй — угол в градусах. #e5a74a задаёт янтарный RGB-цвет, 15.0 — дробное число. Копия позволяет независимо сделать 90° и 15° из одного исходника. На нашем runtime результат 15° имеет 361×276, а 90° — 200×320; исходный объект остаётся 320×200. При +90° красная левая полоса оказывается сверху.
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__.'/product.ppm');
$quarter = clone $image;
$quarter->rotateImage('#e5a74a',90.0);
$tilted = clone $image;
$tilted->rotateImage('#e5a74a',15.0);
$quarter->setImageFormat('PNG');
$quarter->setImageDepth(8);
$quarter->writeImage(__DIR__.'/gm97-quarter-turn.png');
$tilted->setImageFormat('PNG');
$tilted->setImageDepth(8);
$tilted->writeImage(__DIR__.'/gm97-tilted.png');
gmReport('gm97-rotate-product',["__construct", "rotateimage", "setimageformat", "setimagedepth", "writeimage"],["gm97-quarter-turn.png", "gm97-tilted.png"],
['original_size'=>$image->getImageWidth()===320&&$image->getImageHeight()===200,'geometry_quarter_turn'=>gmInspect('gm97-quarter-turn.png')['width']===200&&gmInspect('gm97-quarter-turn.png')['height']===320,'geometry_tilted'=>gmInspect('gm97-tilted.png')['width']===361&&gmInspect('gm97-tilted.png')['height']===276],
$errors ?? [], []);
echo "gm97-quarter-turn.png 200x320 gm97-tilted.png 361x276\n";
Ожидаемый результат
gm97-quarter-turn.png 200x320 gm97-tilted.png 361x276
Скачайте все файлы примера в одну папку. php example.php восстановит собственные PPM из .b64, сохранит PNG и metrics.json. Восстановление и проверки вынесены в неизменённый gm-fixture.php; преобразования видны непосредственно в example.php. Требуется расширение Gmagick. Проверенный стенд: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16.
Вывод успешного запуска
gm97-quarter-turn.png 200x320 gm97-tilted.png 361x276
Не назначайте HTML-размеры по прежним 320×200: после преобразования читайте фактическую геометрию. Непрямой поворот пересчитывает пиксели, поэтому серия промежуточных поворотов может менять края и резкость. Для обычного выпрямления найдите конечный угол, поверните один раз и затем решайте, сохранять ли фон или обрезать холст.
Сдвинуть узор с переносом через противоположный край
Узор для фоновой полосы нужно сдвинуть, чтобы стык оказался в другом месте. Представьте замкнутую ленту: участок, вышедший справа, появляется слева. rollImage делает такой перенос отдельно для строк и столбцов. Он не добавляет однотонное поле и не увеличивает холст.



<?php
$image = new Gmagick(__DIR__ . '/product.ppm');
$image->rollImage(48, -20);
$image->setImageFormat('PNG');
$image->writeImage(__DIR__ . '/shifted-pattern.png');48 — число пикселей вправо, −20 — число пикселей вверх в этом проверенном вызове. Знак минуса является частью отрицательного числа. Левая часть результата содержит ранее правую зелёную полосу. В полной программе второй вызов rollImage(-48,20) выполняет обратный перенос; оба файла имеют 320×200. Числа задают расстояние в пикселях, а не процент ширины.
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__.'/product.ppm');
$result = $image->rollImage(48,-20);
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/gm97-rolled.png');
$image->rollImage(-48,20);
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/gm97-roll-restored.png');
gmReport('gm97-roll-tile',["__construct", "rollimage", "setimageformat", "setimagedepth", "writeimage"],["gm97-rolled.png", "gm97-roll-restored.png"],
['same_object'=>$result===$image,'geometry_rolled'=>gmInspect('gm97-rolled.png')['width']===320&&gmInspect('gm97-rolled.png')['height']===200,'geometry_roll_restored'=>gmInspect('gm97-roll-restored.png')['width']===320&&gmInspect('gm97-roll-restored.png')['height']===200],
$errors ?? [], []);
echo "gm97-rolled.png 320x200 gm97-roll-restored.png 320x200\n";
Ожидаемый результат
gm97-rolled.png 320x200 gm97-roll-restored.png 320x200
Скачайте все файлы примера в одну папку. php example.php восстановит собственные PPM из .b64, сохранит PNG и metrics.json. Восстановление и проверки вынесены в неизменённый gm-fixture.php; преобразования видны непосредственно в example.php. Требуется расширение Gmagick. Проверенный стенд: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16.
Вывод успешного запуска
gm97-rolled.png 320x200 gm97-roll-restored.png 320x200
При оформлении целой фотографии перенос через край может разрезать объект, поэтому roll удобнее применять к узорам и техническим полосам. Последовательность с chop в конце блока показывает другой сценарий: сначала перемещаем рисунок, затем удаляем выбранные разделительные строки и столбцы.
Наклонить стороны баннера по одной оси
Для рекламной плашки нужен параллелограмм: можно наклонить боковые стороны либо верх и низ. Поворот изменил бы направление всей карточки сразу. shearImage задаёт отдельные углы вдоль осей и добавляет фон в открывшиеся части.



<?php
$image = new Gmagick(__DIR__ . '/product.ppm');
$image->shearImage('#ffffff', 12.0, 0.0);
$image->setImageFormat('PNG');
$image->writeImage(__DIR__ . '/slanted-banner.png');Здесь белый фон стоит первым аргументом. 12.0 — наклон вдоль X; угол рассматривается относительно оси Y. Последний 0.0 оставляет наклон вдоль Y нулевым. Полная программа сравнивает независимый вариант (0,10): для него угол относится к X. На собственном входе получены 341×200 и 320×256. Две копии нужны, чтобы второй результат не наследовал уже выполненный первый наклон.
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__.'/product.ppm');
$horizontal = clone $image;
$horizontal->shearImage('#ffffff',12.0,0.0);
$vertical = clone $image;
$vertical->shearImage('#ffffff',0.0,10.0);
$errors = ['empty'=>gmTry(fn()=>(new Gmagick())->shearImage('#ffffff',10.0,0.0))];
$horizontal->setImageFormat('PNG');
$horizontal->setImageDepth(8);
$horizontal->writeImage(__DIR__.'/gm97-shear-x.png');
$vertical->setImageFormat('PNG');
$vertical->setImageDepth(8);
$vertical->writeImage(__DIR__.'/gm97-shear-y.png');
gmReport('gm97-shear-banner',["__construct", "shearimage", "setimageformat", "setimagedepth", "writeimage"],["gm97-shear-x.png", "gm97-shear-y.png"],
['empty_rejected'=>$errors['empty']['class']==='GmagickException','geometry_shear_x'=>gmInspect('gm97-shear-x.png')['width']===341&&gmInspect('gm97-shear-x.png')['height']===200,'geometry_shear_y'=>gmInspect('gm97-shear-y.png')['width']===320&&gmInspect('gm97-shear-y.png')['height']===256],
$errors ?? [], []);
echo "gm97-shear-x.png 341x200 gm97-shear-y.png 320x256\n";
Ожидаемый результат
gm97-shear-x.png 341x200 gm97-shear-y.png 320x256
Скачайте все файлы примера в одну папку. php example.php восстановит собственные PPM из .b64, сохранит PNG и metrics.json. Восстановление и проверки вынесены в неизменённый gm-fixture.php; преобразования видны непосредственно в example.php. Требуется расширение Gmagick. Проверенный стенд: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16.
Вывод успешного запуска
gm97-shear-x.png 341x200 gm97-shear-y.png 320x256
После наклона размеры зависят от алгоритма и входа: измеряйте их, а не прибавляйте «12 пикселей» к ширине. Метод принимает градусы, не пиксели. Полная программа также ловит GmagickException для пустого объекта. Для произвольного снимка страницы это не готовое распознавание перспективы: сначала нужны соответствующие точки и модель преобразования.
Получить размер по ширине, рамке или двум точным сторонам
Одна и та же фотография нужна в колонке шириной 160 и в квадратном месте интерфейса. До обработки решите, что сохранять: весь рисунок и пропорции либо обе точные стороны. Три результата ниже позволяют увидеть цену каждого выбора на одинаковом входе.




<?php
$image = new Gmagick(__DIR__ . '/product.ppm');
$image->scaleImage(160, 0);
$image->setImageFormat('PNG');
$image->writeImage(__DIR__ . '/width-160.png');160 задаёт ширину, 0 просит библиотеку вычислить высоту по пропорции. Получается 160×100. В полной программе scaleImage(160,160,true) означает «вписать в рамку»: true — логическое значение, поэтому высота тоже становится 100. При false задаются точные 160×160 и форма растягивается. scaleImage не даёт аргумента фильтра; resizeImage нужен, когда требуется выбрать способ пересчёта и blur.
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__.'/product.ppm');
$byWidth = clone $image;
$byWidth->scaleImage(160,0);
$fit = clone $image;
$fit->scaleImage(160,160,true);
$stretch = clone $image;
$stretch->scaleImage(160,160,false);
$errors = ['zero'=>gmTry(fn()=>(new Gmagick(__DIR__.'/product.ppm'))->scaleImage(0,0))];
$byWidth->setImageFormat('PNG');
$byWidth->setImageDepth(8);
$byWidth->writeImage(__DIR__.'/gm97-scale-width.png');
$fit->setImageFormat('PNG');
$fit->setImageDepth(8);
$fit->writeImage(__DIR__.'/gm97-scale-fit.png');
$stretch->setImageFormat('PNG');
$stretch->setImageDepth(8);
$stretch->writeImage(__DIR__.'/gm97-scale-stretch.png');
gmReport('gm97-scale-preview',["__construct", "scaleimage", "setimageformat", "setimagedepth", "writeimage"],["gm97-scale-width.png", "gm97-scale-fit.png", "gm97-scale-stretch.png"],
['zero_rejected'=>$errors['zero']['class']==='GmagickException','geometry_scale_width'=>gmInspect('gm97-scale-width.png')['width']===160&&gmInspect('gm97-scale-width.png')['height']===100,'geometry_scale_fit'=>gmInspect('gm97-scale-fit.png')['width']===160&&gmInspect('gm97-scale-fit.png')['height']===100,'geometry_scale_stretch'=>gmInspect('gm97-scale-stretch.png')['width']===160&&gmInspect('gm97-scale-stretch.png')['height']===160],
$errors ?? [], []);
echo "gm97-scale-width.png 160x100 gm97-scale-fit.png 160x100 gm97-scale-stretch.png 160x160\n";
Ожидаемый результат
gm97-scale-width.png 160x100 gm97-scale-fit.png 160x100 gm97-scale-stretch.png 160x160
Скачайте все файлы примера в одну папку. php example.php восстановит собственные PPM из .b64, сохранит PNG и metrics.json. Восстановление и проверки вынесены в неизменённый gm-fixture.php; преобразования видны непосредственно в example.php. Требуется расширение Gmagick. Проверенный стенд: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16.
Вывод успешного запуска
gm97-scale-width.png 160x100 gm97-scale-fit.png 160x100 gm97-scale-stretch.png 160x160
Оба нуля не задают ни одной опорной стороны и в проверенном runtime приводят к GmagickException. Если задача запрещает увеличивать маленький вход, проверяйте его размеры перед преобразованием, как в предыдущей главе про превью. Размер файла в байтах измеряется отдельно после записи и не выводится только из 160×100.
Для выбора фильтра и запрета увеличения см. размеры превью и политика маленького входа. Для масштаба важны число пикселей и дополнительные копии: сохранение оригинала через clone удобно, но увеличивает потребление памяти. Ограничения входа задают до запуска большой обработки; эти маленькие примеры не измеряют скорость сервера.
Удалить полосы и сомкнуть оставшиеся части
В макете есть техническая разделительная полоса, которую нужно убрать, соединив соседние части. crop оставил бы только один прямоугольник. chopImage удаляет выбранные строки и столбцы со смыканием: сравнение двух вариантов показывает, что это не закрашивание прямоугольной дырки.




<?php
$image = new Gmagick(__DIR__ . '/product.ppm');
$image->chopImage(32, 20, 48, 20);
$image->setImageFormat('PNG');
$image->writeImage(__DIR__ . '/joined.png');Ширина удаления 32 начинается в x=48; высота удаления 20 начинается в y=20. Числа x и y задают начало удаления, а не смещение результата. После смыкания ширина равна 320−32=288, высота 200−20=180. Второй вариант с нулевой шириной убирает лишь горизонтальную полосу: 320×180. Затем scaleImage(160,0) готовит превью 160×100 из варианта 288×180.
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__.'/product.ppm');
$both = clone $image;
$both->chopImage(32,20,48,20);
$band = clone $image;
$band->chopImage(0,20,0,20);
$both->setImageFormat('PNG');
$both->setImageDepth(8);
$both->writeImage(__DIR__.'/gm97-chopped.png');
$band->setImageFormat('PNG');
$band->setImageDepth(8);
$band->writeImage(__DIR__.'/gm97-band-removed.png');
$both->scaleImage(160,0);
$both->setImageFormat('PNG');
$both->setImageDepth(8);
$both->writeImage(__DIR__.'/gm97-chop-preview.png');
gmReport('gm97-remove-band',["__construct", "chopimage", "setimageformat", "setimagedepth", "writeimage", "scaleimage"],["gm97-chopped.png", "gm97-band-removed.png", "gm97-chop-preview.png"],
['geometry_chopped'=>gmInspect('gm97-chopped.png')['width']===288&&gmInspect('gm97-chopped.png')['height']===180,'geometry_band_removed'=>gmInspect('gm97-band-removed.png')['width']===320&&gmInspect('gm97-band-removed.png')['height']===180,'geometry_chop_preview'=>gmInspect('gm97-chop-preview.png')['width']===160&&gmInspect('gm97-chop-preview.png')['height']===100],
$errors ?? [], []);
echo "gm97-chopped.png 288x180 gm97-band-removed.png 320x180 gm97-chop-preview.png 160x100\n";
Ожидаемый результат
gm97-chopped.png 288x180 gm97-band-removed.png 320x180 gm97-chop-preview.png 160x100
Скачайте все файлы примера в одну папку. php example.php восстановит собственные PPM из .b64, сохранит PNG и metrics.json. Восстановление и проверки вынесены в неизменённый gm-fixture.php; преобразования видны непосредственно в example.php. Требуется расширение Gmagick. Проверенный стенд: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16.
Вывод успешного запуска
gm97-chopped.png 288x180 gm97-band-removed.png 320x180 gm97-chop-preview.png 160x100
Такой разрыв заметен на предмете или надписи; применять его следует там, где удаляемые полосы действительно не нужны. После chop меняются координаты последующих операций. Если в программе есть несколько областей в исходной системе координат, заранее определите порядок либо пересчитайте координаты.
Упражнение: что даст rollImage(0,20) по размерам? Ответ: прежние 320×200; перенос меняет положение. Что даст chopImage(0,20,0,20)? Ответ: 320×180. Что даст scaleImage(80,0) на 320×200? Ответ: 80×50. Эти три вызова решают разные задачи, хотя каждый способен изменить внешний вид.
Практический вопрос, из которого вырос сценарий
Not getting transparent background while rotating an image: После поворота изображения автор получает нежелательное заполнение новых углов и смешивает вызовы GD с командой ImageMagick. В Gmagick задаём цвет первым аргументом rotateImage и показываем реальные новые углы на собственном изображении. Сравниваем 90° и 15°, измеряем увеличившийся холст. Исходный вопрос касается прозрачности, но непрозрачные результаты этой главы доказывают только явный выбор RGB-фона; GD, Imagick и Gmagick не объявляются одним API.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Gmagick::chopimageУдалить строки и столбцы со смыканием изображения
PECL gmagick >= Unknown · gmagick
Gmagick::chopimage(int $width, int $height, int $x, int $y): GmagickУдалить строки и столбцы со смыканием изображения. width и height описывают удаляемую область, x и y задают начало. Результат смыкается на месте удалённых частей. На нашем входе (32,20,48,20) удалены столбцы 48…79 и строки 20…39: размер стал 288×180. При (0,20,0,20) удалена только горизонтальная полоса, результат 320×180. Это не получение прямоугольного фрагмента, как cropImage, и не закрашивание дырки: оставшиеся части соединяются. Поэтому операция полезна для однотонной разделительной полосы или узора, но может разорвать важную форму предмета.
Gmagick::chopimage(int $width, int $height, int $x, int $y): Gmagick| Параметр | Тип и обязательность | Значение |
|---|---|---|
width | int; обязательный | Ширина удаляемой области. |
height | int; обязательный | Высота удаляемой области. |
x | int; обязательный | Начальная X-координата удаления. |
y | int; обязательный | Начальная Y-координата удаления. |
Результат: Gmagick с результатом операции. Проверенные преобразования меняют текущий объект и возвращают его же; для независимого варианта сначала создайте clone.
Ошибка по официальному контракту: GmagickException. Ошибочный PHP-тип может дать TypeError до обработки изображения; при разборе некорректного цвета возможен GmagickPixelException. Не печатайте успешный результат после перехвата ошибки, если файл не получен. Требуется PECL Gmagick; PHP.net помечает нижнюю границу версии как Unknown, поэтому конкретную минимальную версию здесь не придумываем.
Два разных применения: Удалить полосы и сомкнуть оставшиеся части; Подготовить вариант узора, убрать полосы и добавить поля.
Связанный метод: Gmagick::cropimage.
Gmagick::rollimageЦиклически сдвинуть изображение
PECL gmagick >= Unknown · gmagick
Gmagick::rollimage(int $x, int $y): GmagickЦиклически сдвинуть изображение. x — смещение по горизонтали в пикселях, y — по вертикали. При проверенном (48,−20) рисунок сдвигается вправо и вверх, а вышедшие за пределы полосы возвращаются с противоположной стороны. Размер 320×200 сохраняется: свободного фона не возникает. Обратный сдвиг (−48,20) возвращает расположение. Это удобно для узора и переноса его шва. Для обычного перемещения фотографии внутри большего холста нужен другой приём; roll переносит край и может разрезать видимый предмет.
Gmagick::rollimage(int $x, int $y): Gmagick| Параметр | Тип и обязательность | Значение |
|---|---|---|
x | int; обязательный | Горизонтальный сдвиг в пикселях. |
y | int; обязательный | Вертикальный сдвиг в пикселях. |
Результат: Gmagick с результатом операции. Проверенные преобразования меняют текущий объект и возвращают его же; для независимого варианта сначала создайте clone.
Ошибка по официальному контракту: GmagickException. Ошибочный PHP-тип может дать TypeError до обработки изображения; при разборе некорректного цвета возможен GmagickPixelException. Не печатайте успешный результат после перехвата ошибки, если файл не получен. Требуется PECL Gmagick; PHP.net помечает нижнюю границу версии как Unknown, поэтому конкретную минимальную версию здесь не придумываем.
Два разных применения: Сдвинуть узор с переносом через противоположный край; Подготовить вариант узора, убрать полосы и добавить поля.
Связанный метод: Gmagick::chopimage.
Gmagick::rotateimageПовернуть растр и заполнить открывшиеся углы
PECL gmagick >= Unknown · gmagick
Gmagick::rotateimage(mixed $color, float $degrees): GmagickПовернуть растр и заполнить открывшиеся углы. color задаёт пиксель фона, degrees — угол в градусах. Сигнатура PHP.net оставляет color как mixed; здесь проверены строка цвета и GmagickPixel. После непрямого угла холст обычно увеличивается: наш 320×200 при 15.0 дал 361×276, при 90.0 — 200×320. На проверенном растре +90 переносит красную левую полосу наверх, то есть поворачивает по часовой стрелке на экране. Для сохранения исходника нужен clone до вызова. Несколько поворотов с промежуточной интерполяцией способны отличаться от одного итогового; угол лучше вычислить заранее.
Gmagick::rotateimage(mixed $color, float $degrees): Gmagick| Параметр | Тип и обязательность | Значение |
|---|---|---|
color | mixed; обязательный | Фон новых участков; здесь строка цвета либо GmagickPixel. |
degrees | float; обязательный | Угол поворота в градусах, дробное число. |
Результат: Gmagick с результатом операции. Проверенные преобразования меняют текущий объект и возвращают его же; для независимого варианта сначала создайте clone.
Ошибка по официальному контракту: GmagickException. Ошибочный PHP-тип может дать TypeError до обработки изображения; при разборе некорректного цвета возможен GmagickPixelException. Не печатайте успешный результат после перехвата ошибки, если файл не получен. Требуется PECL Gmagick; PHP.net помечает нижнюю границу версии как Unknown, поэтому конкретную минимальную версию здесь не придумываем.
Два разных применения: Сравнить поворот на прямой и небольшой угол; Передать сохранённый цвет фона в поворот.
Связанный метод: Gmagick::shearimage.
Gmagick::scaleimageМасштабировать с точными или вычисляемыми сторонами
PECL gmagick >= Unknown · gmagick
Gmagick::scaleimage(int $width, int $height, bool $fit = false): GmagickМасштабировать с точными или вычисляемыми сторонами. width — число столбцов, height — число строк результата. Ноль вместо одной стороны просит вычислить её по пропорциям: (160,0) дало 160×100. fit необязателен, по умолчанию false; при true указанные стороны образуют рамку с сохранением пропорций. На входе 320×200 вызов (160,160,true) дал 160×100, false — 160×160. В проверенном runtime сигнатура содержит именно эти три параметра; дополнительный legacy в свежем upstream C-коде не считается доступным здесь. Оба нуля вызвали GmagickException. У метода нет параметров фильтра и blur; для такого управления переходите к resizeImage.
Gmagick::scaleimage(int $width, int $height, bool $fit = false): Gmagick| Параметр | Тип и обязательность | Значение |
|---|---|---|
width | int; обязательный | Число столбцов результата; 0 вычисляет ширину по другой стороне. |
height | int; обязательный | Число строк результата; 0 вычисляет высоту по другой стороне. |
fit | bool; необязательный, по умолчанию false | Необязательный bool, false по умолчанию; true вписывает с сохранением пропорций. |
Результат: Gmagick с результатом операции. Проверенные преобразования меняют текущий объект и возвращают его же; для независимого варианта сначала создайте clone.
Ошибка по официальному контракту: GmagickException. Ошибочный PHP-тип может дать TypeError до обработки изображения; при разборе некорректного цвета возможен GmagickPixelException. Не печатайте успешный результат после перехвата ошибки, если файл не получен. Требуется PECL Gmagick; PHP.net помечает нижнюю границу версии как Unknown, поэтому конкретную минимальную версию здесь не придумываем.
Два разных применения: Получить размер по ширине, рамке или двум точным сторонам; Удалить полосы и сомкнуть оставшиеся части.
Связанный метод: Gmagick::cropimage.
Gmagick::shearimageНаклонить стороны до параллелограмма
PECL gmagick >= Unknown · gmagick
Gmagick::shearimage(mixed $color, float $xShear, float $yShear): GmagickНаклонить стороны до параллелограмма. color — цвет добавляемого фона, xShear и yShear — углы в градусах. Наклон X сдвигает край вдоль X, угол измеряется относительно Y; наклон Y сдвигает край вдоль Y и измеряется относительно X. Поэтому это два отдельных параметра, а не координаты смещения. Пустые треугольники заполняются указанным фоном. Проверенные варианты (12,0) и (0,10) дали 341×200 и 320×256. Не выводите размер из простой формулы поворота: это другая операция, итог нужно измерить. Метод создаёт наклон, но сам по себе не исправляет произвольную перспективу фотографии.
Gmagick::shearimage(mixed $color, float $xShear, float $yShear): Gmagick| Параметр | Тип и обязательность | Значение |
|---|---|---|
color | mixed; обязательный | Цвет новых участков: строка или GmagickPixel. |
xShear | float; обязательный | Угол сдвига вдоль X, измеряемый относительно Y, в градусах. |
yShear | float; обязательный | Угол сдвига вдоль Y, измеряемый относительно X, в градусах. |
Результат: Gmagick с результатом операции. Проверенные преобразования меняют текущий объект и возвращают его же; для независимого варианта сначала создайте clone.
Ошибка по официальному контракту: GmagickException. Ошибочный PHP-тип может дать TypeError до обработки изображения; при разборе некорректного цвета возможен GmagickPixelException. Не печатайте успешный результат после перехвата ошибки, если файл не получен. Требуется PECL Gmagick; PHP.net помечает нижнюю границу версии как Unknown, поэтому конкретную минимальную версию здесь не придумываем.
Два разных применения: Наклонить стороны баннера по одной оси; Собрать стиль карточки в возвращающую копию функцию.
Связанный метод: Gmagick::rotateimage.
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


