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

Дерево руководства
Глава 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 и сохраним ясное правило, кто закрывает поток.

$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 и покажем его пиксели.


$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(); // JPEGsetImageFormat задаёт формат кодирования, 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 на одной заготовке.


$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 и обработать отказ записи
<?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 = ?): GmagickGmagick::readimageblob(string $imageContents, string $filename = ?): GmagickimageContents — обязательная бинарная строка с содержимым изображения. Необязательный filename — имя изображения; оно не подменяет содержимое и не просит прочитать файл по этому пути. В текущем runtime допустимо отсутствие второго аргумента или null. Возвращается Gmagick. Строка с обычным текстом вызвала GmagickException; base64 перед таким вызовом нужно сначала декодировать.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $imageContents | string; обязательный | Бинарные байты закодированного изображения. |
| $filename | string; необязательный | Имя файла; его конкретная роль объяснена ниже. |
Официальный результат: объект 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 = ?): GmagickGmagick::readimagefile(resource $fp, string $filename = ?): Gmagickfp — ресурс открытого файла; необязательный filename задаёт имя изображения. Метод читает изображение или последовательность из открытого дескриптора и возвращает Gmagick. Строка пути вместо ресурса вызвала TypeError. В примере fopen открывает бинарный поток, readImageFile оставляет его открытым, а finally закрывает через fclose. Рассмотрен обычный локальный файл; произвольная потоковая обёртка требует отдельной проверки поддержки.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $fp | resource; обязательный | Открытый ресурс файла. |
| $filename | string; необязательный | Имя файла; его конкретная роль объяснена ниже. |
Официальный результат: объект 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): GmagickGmagick::setimageformat(string $imageFormat): GmagickimageFormat — обязательная строка имени формата текущего изображения. Возвращается Gmagick. PNG или JPEG задаются до записи; одно переименование расширения файла не является кодированием. Поддержку формата определяет конкретная библиотека и её кодеры. После записи результат перечитывается, чтобы проверить фактический формат.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $imageFormat | string; обязательный | Имя формата текущего изображения. |
Официальный результат: объект 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): GmagickGmagick::write(string $filename, bool $all_frames = false): GmagickЭто официальный alias writeImage. Сигнатура сохраняет filename и необязательный all_frames=false. Самостоятельного описания результата и ошибок на странице alias нет; они следуют операции writeImage. В нашем запуске оба имени вернули тот же объект. Короткое имя не меняет геометрию, формат или необходимость проверить реальный файл. Два применения — одноцветная заготовка и квадратные карточки каталога.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $filename | string; обязательный | Имя файла; его конкретная роль объяснена ниже. |
| $all_frames | bool; необязательный; default false | false — текущее изображение; 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): GmagickGmagick::writeimage(string $filename, bool $all_frames = false): Gmagickfilename — обязательная строка пути; all_frames — необязательный bool, false по умолчанию. false пишет текущее изображение, true обращается к записи всей последовательности. Возвращается Gmagick, не число байтов и не bool. PHP.net описывает null как использование ранее заданного имени, но реальный 2.0.6RC1 отвергает null с TypeError; пустая строка также дала GmagickException. Передавайте непустой явный путь. Примеры здесь работают с одиночными изображениями; запись анимации не объявляется проверенной.
| Параметр | Тип и обязательность | Назначение |
|---|---|---|
| $filename | string; обязательный | Имя файла; его конкретная роль объяснена ниже. |
| $all_frames | bool; необязательный; default false | false — текущее изображение; 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. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


