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

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

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

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

Глава 407 · После переменных, объектов и файлов

Gmagick: байты, поток, формат и проверенное сохранение

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

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

Иногда изображение уже получено как содержимое файла или записи: у нас есть строка байтов, а не путь. Прочитаем её непосредственно, сохранив ту же геометрию.

Те же пиксели прочитаны из строки байтов
Те же пиксели прочитаны из строки байтов
$bytes = file_get_contents(__DIR__ . "/product.ppm");
$image = new Gmagick();
$image->readImageBlob($bytes, "product.ppm");
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/from-blob.png");

Blob — бинарная строка с закодированным изображением. Это не имя файла и не base64-текст. file_get_contents возвращает содержимое или false; полный пример проверяет отказ перед вызовом. Второй аргумент readImageBlob задаёт имя изображения, но байты берутся из первого аргумента.

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

Прочитать содержимое изображения из бинарной строкиСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$bytes = file_get_contents(__DIR__.'/product.ppm');
if ($bytes===false) { throw new RuntimeException('Cannot read own input'); }
$image = new Gmagick();
$result = $image->readImageBlob($bytes,'product.ppm');
$errors = ['not_image'=>gmTry(fn()=>(new Gmagick())->readImageBlob('not image bytes'))];
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/from-blob.png');

gmReport('gmagick-read-blob',["__construct", "readimageblob", "getimagewidth", "getimageheight", "setimageformat", "writeimage", "setimagedepth"],["from-blob.png"],
    ['same_object'=>$result===$image,'size'=>$image->getImageWidth()===320&&$image->getImageHeight()===200,'bad_blob_caught'=>$errors['not_image']['class']==='GmagickException'],
    $errors ?? [], []);
echo "from-blob.png 320x200 invalid-blob=GmagickException\n";
Ожидаемый результат
from-blob.png 320x200 invalid-blob=GmagickException

Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.

Точный вывод успешного запуска
from-blob.png 320x200 invalid-blob=GmagickException

Полный пример сохранил 320×200 и поймал GmagickException для строки обычного текста. Чтение всего файла в строку занимает память сверх декодированного растра. Когда уже есть подходящий файловый поток, следующий способ позволяет передать ресурс напрямую. Для входа из недоверенного источника нужны самостоятельные пределы размера и формата.

Прочитать открытый поток и закрыть его владельцем

Файл уже открыт вызывающим кодом: передадим его ресурс в Gmagick и сохраним ясное правило, кто закрывает поток.

Портретный вход через ресурс fopen
Портретный вход через ресурс fopen
$stream = fopen(__DIR__ . "/portrait.ppm", "rb");
$image = new Gmagick();
$image->readImageFile($stream, "portrait.ppm");
fclose($stream);
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/from-stream.png");

fopen создаёт ресурс, rb означает чтение бинарных данных. readImageFile получает этот ресурс, а не строковый путь. fclose освобождает открытый поток. В полном варианте проверяется false от fopen, а finally гарантирует закрытие после попытки чтения.

Прочитать открытый поток и закрыть его владельцем

Прочитать открытый поток и закрыть его владельцемСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$stream = fopen(__DIR__.'/portrait.ppm','rb');
if ($stream===false) { throw new RuntimeException('Cannot open own input'); }
try {
    $image = new Gmagick();
    $result = $image->readImageFile($stream,'portrait.ppm');
    $stillOpen = is_resource($stream);
} finally {
    fclose($stream);
}
$errors = ['wrong_type'=>gmTry(fn()=>(new Gmagick())->readImageFile('portrait.ppm'))];
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/from-stream.png');

gmReport('gmagick-read-stream',["__construct", "readimagefile", "setimageformat", "writeimage", "setimagedepth"],["from-stream.png"],
    ['same_object'=>$result===$image,'stream_remained_open'=>$stillOpen===true,'owner_closed'=>!is_resource($stream),'wrong_type_caught'=>$errors['wrong_type']['class']==='TypeError'],
    $errors ?? [], []);
echo "from-stream.png 200x320 stream-closed=yes string=TypeError\n";
Ожидаемый результат
from-stream.png 200x320 stream-closed=yes string=TypeError

Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.

Точный вывод успешного запуска
from-stream.png 200x320 stream-closed=yes string=TypeError

Настоящий вызов оставил поток открытым; его закрыл наш код. Передача строки вместо ресурса дала TypeError. Пример относится к обычному локальному файлу. Для произвольных пользовательских потоковых обёрток не обещаем поддержку без проверки; URI и текстовый буфер не автоматически равны ресурсу, который может использовать библиотека.

Проверить формат по содержимому и повторному чтению

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

PNG собственной карточки
PNG собственной карточки
Реально декодированный JPEG, сохранённый для просмотра
Реально декодированный JPEG, сохранённый для просмотра
$image = new Gmagick(__DIR__ . "/product.ppm");
$image->setImageFormat("JPEG");
$image->writeImage(__DIR__ . "/export-photo.jpg");
$saved = new Gmagick(__DIR__ . "/export-photo.jpg");
echo $saved->getImageFormat(); // JPEG

setImageFormat задаёт формат кодирования, writeImage выполняет запись, новый объект проверяет уже сохранённый файл. Имя с .jpg само по себе не объясняет качество и число байтов. В полном примере filesizes измеряются после записи и помещаются в metrics.json.

Проверить формат по содержимому и повторному чтению

Проверить формат по содержимому и повторному чтениюСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick(__DIR__.'/product.ppm');
$image->setImageFormat('PNG');
$image->setImageDepth(8);
$image->writeImage(__DIR__.'/export-png.png');
$image->setImageFormat('JPEG');
$image->writeImage(__DIR__.'/export-photo.jpg');
$writerFormat = $image->getImageFormat();
$readback = new Gmagick(__DIR__.'/export-photo.jpg');
$readFormat = $readback->getImageFormat();
$readback->setImageFormat('PNG');
$readback->setImageDepth(8);
$readback->writeImage(__DIR__.'/jpeg-view.png');
$files = ['png'=>gmInspect('export-png.png'),'jpeg'=>gmInspect('export-photo.jpg')];

gmReport('gmagick-export-formats',["__construct", "setimageformat", "writeimage", "getimageformat", "setimagedepth"],["export-png.png", "jpeg-view.png"],
    ['jpeg_readback'=>strtoupper($readFormat)==='JPEG','same_geometry'=>$files['png']['width']===$files['jpeg']['width']&&$files['png']['height']===$files['jpeg']['height'],'real_bytes'=>$files['png']['bytes']>0&&$files['jpeg']['bytes']>0],
    $errors ?? [], ['writer_format'=>$writerFormat,'readback_format'=>$readFormat,'files'=>$files]);
echo "export-png.png export-photo.jpg jpeg-view.png geometry=320x200 readback=JPEG\n";
Ожидаемый результат
export-png.png export-photo.jpg jpeg-view.png geometry=320x200 readback=JPEG

Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.

Точный вывод успешного запуска
export-png.png export-photo.jpg jpeg-view.png geometry=320x200 readback=JPEG

У обоих файлов 320×200, но кодеры и представление различаются. JPEG может менять пиксели и обычно применяется к фотографиям; наша карточка с плоскими цветами не доказывает универсального преимущества одного формата. В объекте записи библиотека сообщала JPG, при повторном чтении JPEG; сравнение только с одной строкой без учёта алиасов может ошибиться. jpeg-view.png содержит декодированный настоящий JPEG для просмотра на странице.

Сравнить writeImage и write и обработать отказ записи

После обработки нужно сохранить файл и отличить успешную запись от отказа. Сравним полное имя writeImage с коротким alias write на одной заготовке.

Запись через writeImage
Запись через writeImage
Запись через alias write
Запись через alias write
$image = new Gmagick();
$image->newImage(160,100,"#e5a74a","png");
$image->writeImage(__DIR__ . "/write-direct.png", false);
$image->write(__DIR__ . "/write-alias.png", false);

Оба вызова записывают текущее изображение: false — значение all_frames по умолчанию. Результат метода — тот же Gmagick, а не число записанных байтов. Файлы проверяются отдельно. Для последовательности true выбирает запись всех кадров; одиночные PNG этой главы не проверяют анимацию или PDF.

Сравнить writeImage и write и обработать отказ записи

Сравнить writeImage и write и обработать отказ записиСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$image = new Gmagick();
$image->newImage(160,100,'#e5a74a','png');
$image->setImageDepth(8);
$direct = $image->writeImage(__DIR__.'/write-direct.png',false);
$alias = $image->write(__DIR__.'/write-alias.png',false);
$errors = [
    'null_filename'=>gmTry(fn()=>$image->writeImage(null)),
    'bad_directory'=>gmTry(fn()=>$image->writeImage(__DIR__.'/missing-dir/output.png')),
];

gmReport('gmagick-write-alias',["__construct", "newimage", "writeimage", "write", "setimagedepth"],["write-direct.png", "write-alias.png"],
    ['direct_same_object'=>$direct===$image,'alias_same_object'=>$alias===$image,'null_rejected'=>$errors['null_filename']['class']==='TypeError','bad_directory_caught'=>$errors['bad_directory']['class']==='GmagickException'],
    $errors ?? [], []);
echo "write-direct.png write-alias.png 160x100 rejected=null,directory\n";
Ожидаемый результат
write-direct.png write-alias.png 160x100 rejected=null,directory

Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.

Точный вывод успешного запуска
write-direct.png write-alias.png 160x100 rejected=null,directory

Полная программа ловит два разных отказа. null вместо имени вызывает TypeError в проверенной версии, хотя текст PHP.net описывает резервное имя; отсутствующая выходная папка приводит к GmagickException. Отдельная проба отвергла и пустую строку. Рабочий код передаёт заранее выбранный непустой путь и не утверждает, что наличие объекта означает успешную запись.

Собрать четыре превью из двух способов чтения

Соберём законченный шаг каталога: два входа, для каждого миниатюра целиком и квадратная карточка, рядом манифест с реальными именами, размерами, байтами и SHA256.

Альбомный товар целиком
Альбомный товар целиком
Портретный товар целиком
Портретный товар целиком
Квадратная карточка альбомного товара
Квадратная карточка альбомного товара
Квадратная карточка портретного товара
Квадратная карточка портретного товара
$fit = clone $source;
$fit->thumbnailImage(160,160,true);
$fit->setImageFormat("PNG");
$fit->writeImage(__DIR__ . "/product-fit.png");
$square = clone $source;
$square->cropThumbnailImage(120,120);
$square->setImageFormat("PNG");
$square->write(__DIR__ . "/product-square.png");

У каждого результата своя копия исходника. Сначала задаётся геометрия, затем формат, затем конкретное имя файла. Полная программа повторяет этот маршрут для альбомного и портретного товара; один прочитан из байтов, второй из потока. Это второй самостоятельный сценарий обоих способов ввода.

Собрать четыре превью из двух способов чтения

Собрать четыре превью из двух способов чтенияСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__ . '/gm-fixture.php';
gmRestore();
$landscape = new Gmagick();
$landscape->readImageBlob((string)file_get_contents(__DIR__.'/product.ppm'),'product.ppm');
$stream = fopen(__DIR__.'/portrait.ppm','rb');
if ($stream===false) { throw new RuntimeException('Cannot open own input'); }
try {
    $portrait = new Gmagick();
    $portrait->readImageFile($stream,'portrait.ppm');
} finally {
    fclose($stream);
}
$manifest = [];
foreach (['landscape'=>$landscape,'portrait'=>$portrait] as $key=>$source) {
    $fit = clone $source;
    $fit->thumbnailImage(160,160,true);
    $fit->setImageFormat('PNG');
$fit->setImageDepth(8);
    $fitName = $key.'-fit.png';
    $fit->writeImage(__DIR__.'/'.$fitName);
    $square = clone $source;
    $square->cropThumbnailImage(120,120);
    $square->setImageFormat('PNG');
$square->setImageDepth(8);
    $squareName = $key.'-square.png';
    $square->write(__DIR__.'/'.$squareName);
    $manifest[$key] = ['fit'=>gmInspect($fitName),'square'=>gmInspect($squareName)];
}
file_put_contents(__DIR__.'/catalog.json',json_encode($manifest,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR)."\n");

gmReport('gmagick-catalog-export',["__construct", "readimageblob", "readimagefile", "thumbnailimage", "cropthumbnailimage", "setimageformat", "writeimage", "write", "getimagewidth", "getimageheight", "setimagedepth"],["landscape-fit.png", "portrait-fit.png", "landscape-square.png", "portrait-square.png"],
    ['two_inputs'=>count($manifest)===2,'fit_geometry'=>$manifest['landscape']['fit']['width']===160&&$manifest['portrait']['fit']['height']===160,'squares'=>$manifest['landscape']['square']['width']===120&&$manifest['portrait']['square']['height']===120,'original_geometry'=>$landscape->getImageWidth()===320&&$portrait->getImageHeight()===320],
    $errors ?? [], $manifest);
echo "catalog.json outputs=4 fit=160x100,100x160 square=120x120\n";
Ожидаемый результат
catalog.json outputs=4 fit=160x100,100x160 square=120x120

Распакуйте example.php, gm-fixture.php и два файла .ppm.b64 рядом; php example.php восстановит собственные входы. Проверено: PHP 8.3.6 / Gmagick 2.0.6RC1 / GraphicsMagick 1.3.42 Q16. PNG показывают настоящий результат; metrics.json содержит версии, размеры, хеши, проверки и ошибки.

Точный вывод успешного запуска
catalog.json outputs=4 fit=160x100,100x160 square=120x120

Получаются четыре настоящих PNG и catalog.json. Манифест связывает имена с размерами и контрольными суммами, позволяя проверить, что сохранён именно заявленный результат; SHA256 не подтверждает авторство. Обработка здесь локальная и однокадровая. В рабочем сервисе добавьте политику форматов, числа кадров, геометрии, допустимых путей и публикации готового набора; загрузка формы и атомарная замена набора в этот пример не входят.

Упражнение: почему после resize нельзя вычислить размер JPEG только из 160×100? Ответ: геометрия не задаёт число закодированных байтов, их измеряют после записи. Упражнение: кто закрывает ресурс в readImageFile? Ответ: в нашем проверенном маршруте вызывающий код через finally. Упражнение: почему отказываемся от null в writeImage? Ответ: он вызывает TypeError в указанной версии; фактический контракт вызова проверяется вместе с документацией.

В каждом архиве gm-fixture.php восстанавливает два собственных входа и записывает компактный metrics.json. Он проверяет неизменность файлов, геометрию и объявленные условия; при ложной проверке бросает исключение и не позволяет напечатать строку успеха. Основные чтения, преобразования и writeImage/write остаются непосредственно в программах. Сводные изображения не подменяют настоящие файлы результатов.

Из реальных вопросов разработчиков

Output each individual animated GIF frame as visually intended: Отдельный кадр анимации может содержать только изменение, а не полное видимое изображение. Явно ограничиваем проверенные примеры собственными одиночными PNG; all_frames объясняем как параметр записи последовательности, без обещания правильной композиции кадров.

Image filesize after resizing with Imagick and Gmagick: Одинаковые стороны после resize дают существенно разные размеры файлов у двух библиотек. Перечитываем настоящий JPEG, измеряем реальные байты и отделяем кодер, формат и качество от геометрии; не обещаем одинаковый размер по одним сторонам.

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

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

Gmagick::readimageblobПрочитать закодированное изображение из строки байтов

PECL gmagick >= Unknown · gmagick

Gmagick::readimageblob(string $imageContents, string $filename = ?): Gmagick
Gmagick::readimageblob(string $imageContents, string $filename = ?): Gmagick

imageContents — обязательная бинарная строка с содержимым изображения. Необязательный filename — имя изображения; оно не подменяет содержимое и не просит прочитать файл по этому пути. В текущем runtime допустимо отсутствие второго аргумента или null. Возвращается Gmagick. Строка с обычным текстом вызвала GmagickException; base64 перед таким вызовом нужно сначала декодировать.

ПараметрТип и обязательностьНазначение
$imageContentsstring; обязательныйБинарные байты закодированного изображения.
$filenamestring; необязательныйИмя файла; его конкретная роль объяснена ниже.

Официальный результат: объект Gmagick. Методы обработки изменяют состояние объекта; для независимого результата используйте clone.

Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.

Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.

Два различных применения: Прочитать содержимое изображения из бинарной строки; Собрать четыре превью из двух способов чтения. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.

Gmagick::readimagefileПрочитать изображение из открытого потока

PECL gmagick >= Unknown · gmagick

Gmagick::readimagefile(resource $fp, string $filename = ?): Gmagick
Gmagick::readimagefile(resource $fp, string $filename = ?): Gmagick

fp — ресурс открытого файла; необязательный filename задаёт имя изображения. Метод читает изображение или последовательность из открытого дескриптора и возвращает Gmagick. Строка пути вместо ресурса вызвала TypeError. В примере fopen открывает бинарный поток, readImageFile оставляет его открытым, а finally закрывает через fclose. Рассмотрен обычный локальный файл; произвольная потоковая обёртка требует отдельной проверки поддержки.

ПараметрТип и обязательностьНазначение
$fpresource; обязательныйОткрытый ресурс файла.
$filenamestring; необязательныйИмя файла; его конкретная роль объяснена ниже.

Официальный результат: объект Gmagick. Методы обработки изменяют состояние объекта; для независимого результата используйте clone.

Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.

Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.

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

Gmagick::setimageformatВыбрать формат будущей записи

PECL gmagick >= Unknown · gmagick

Gmagick::setimageformat(string $imageFormat): Gmagick
Gmagick::setimageformat(string $imageFormat): Gmagick

imageFormat — обязательная строка имени формата текущего изображения. Возвращается Gmagick. PNG или JPEG задаются до записи; одно переименование расширения файла не является кодированием. Поддержку формата определяет конкретная библиотека и её кодеры. После записи результат перечитывается, чтобы проверить фактический формат.

ПараметрТип и обязательностьНазначение
$imageFormatstring; обязательныйИмя формата текущего изображения.

Официальный результат: объект Gmagick. Методы обработки изменяют состояние объекта; для независимого результата используйте clone.

Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.

Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.

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

Gmagick::writeИспользовать краткое имя записи

PECL gmagick >= Unknown · gmagick

Gmagick::write(string $filename, bool $all_frames = false): Gmagick
Gmagick::write(string $filename, bool $all_frames = false): Gmagick

Это официальный alias writeImage. Сигнатура сохраняет filename и необязательный all_frames=false. Самостоятельного описания результата и ошибок на странице alias нет; они следуют операции writeImage. В нашем запуске оба имени вернули тот же объект. Короткое имя не меняет геометрию, формат или необходимость проверить реальный файл. Два применения — одноцветная заготовка и квадратные карточки каталога.

ПараметрТип и обязательностьНазначение
$filenamestring; обязательныйИмя файла; его конкретная роль объяснена ниже.
$all_framesbool; необязательный; default falsefalse — текущее изображение; true — последовательность.

Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.

Два различных применения: Сравнить writeImage и write и обработать отказ записи; Собрать четыре превью из двух способов чтения. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.

Gmagick::writeimageЗаписать изображение по явному выходному пути

PECL gmagick >= Unknown · gmagick

Gmagick::writeimage(string $filename, bool $all_frames = false): Gmagick
Gmagick::writeimage(string $filename, bool $all_frames = false): Gmagick

filename — обязательная строка пути; all_frames — необязательный bool, false по умолчанию. false пишет текущее изображение, true обращается к записи всей последовательности. Возвращается Gmagick, не число байтов и не bool. PHP.net описывает null как использование ранее заданного имени, но реальный 2.0.6RC1 отвергает null с TypeError; пустая строка также дала GmagickException. Передавайте непустой явный путь. Примеры здесь работают с одиночными изображениями; запись анимации не объявляется проверенной.

ПараметрТип и обязательностьНазначение
$filenamestring; обязательныйИмя файла; его конкретная роль объяснена ниже.
$all_framesbool; необязательный; default falsefalse — текущее изображение; true — последовательность.

Официальный результат: объект Gmagick. Методы обработки изменяют состояние объекта; для независимого результата используйте clone.

Официальная отметка версии: PECL gmagick >= Unknown. Значение Unknown в каталоге PHP.net не задаёт точную минимальную версию. Проверенная среда этой главы — PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16; её нельзя автоматически переносить на Windows PHP 8.5 или другой выпуск расширения.

Документированная ошибка — GmagickException. Ошибка типа аргумента может произойти раньше и дать TypeError; её не следует смешивать с отказом декодера или файловой системы. Конкретные обработанные случаи отмечены в примерах.

Два различных применения: Сравнить writeImage и write и обработать отказ записи; Собрать четыре превью из двух способов чтения. В этих разделах есть полный скачиваемый код, настоящий результат и точный вывод.

Источники и обсуждения

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

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

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

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