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

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

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

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

Глава 413 · После объектов и первых изображений Gmagick

Gmagick: качество файла, глубина и проверка экспорта

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

Измерить реальный JPEG при двух значениях качества

Объём файла влияет на загрузку карточки, но quality не задаёт количество байтов. Сохраним одинаковый вход в JPEG с 35 и 90, заново прочитаем оба файла и покажем их действительные декодированные пиксели. Это честнее, чем показывать исходник с подписью «сжатый».

До JPEG: исходные пиксели шумной карточки
До JPEG: исходные пиксели шумной карточки
Декодированный настоящий JPEG quality 35
Декодированный настоящий JPEG quality 35
Декодированный настоящий JPEG quality 90
Декодированный настоящий JPEG quality 90
$image = new Gmagick(__DIR__ . "/noise.ppm");
$image->setCompressionQuality(35);
$image->setImageFormat("JPEG");
$image->writeImage(__DIR__ . "/preview.jpg");
$saved = new Gmagick(__DIR__ . "/preview.jpg");
echo filesize(__DIR__ . "/preview.jpg");

setCompressionQuality задаёт настройку качества объекта. Метод вызывается после загрузки изображения; пустой Gmagick в этой версии даёт GmagickException. setImageFormat выбирает JPEG, а запись действительно кодирует файл. filesize измеряет уже записанные байты. Для нашего шумного входа диагностическая проба дала 11458 байт при 35 и 42817 при 90; точные текущие измерения лежат в metrics.json каждого запуска.

Измерить реальный JPEG при двух значениях качестваСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/noise.ppm');
$low=clone $source;
$low->setCompressionQuality(35);
$low->setImageFormat('JPEG');
$low->writeImage(__DIR__.'/gm97-export-q35.jpg');
$high=clone $source;
$high->setCompressionQuality(90);
$high->setImageFormat('JPEG');
$high->writeImage(__DIR__.'/gm97-export-q90.jpg');
$savedLow=new Gmagick(__DIR__.'/gm97-export-q35.jpg');
$savedHigh=new Gmagick(__DIR__.'/gm97-export-q90.jpg');
gm97Png($source,'gm97-export-quality-before.png');
gm97Png($savedLow,'gm97-export-quality-low.png');
gm97Png($savedHigh,'gm97-export-quality-high.png');
$errors=['empty_quality'=>gmTry(fn()=>(new Gmagick())->setCompressionQuality(80))];
$sizes=['q35'=>filesize(__DIR__.'/gm97-export-q35.jpg'),'q90'=>filesize(__DIR__.'/gm97-export-q90.jpg')];

gmReport('gm97-export-quality',["setcompressionquality", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-export-quality-before.png", "gm97-export-quality-low.png", "gm97-export-quality-high.png"],
    ['both_written'=>$sizes["q35"]>0&&$sizes["q90"]>0,'this_input_size_order'=>$sizes["q35"]<$sizes["q90"],'decoded_pixels_differ'=>$savedLow->getImageSignature()!==$savedHigh->getImageSignature()],
    $errors ?? [], $sizes);
echo "quality: q35-smaller-than-q90 decoded-pixels=different png=3 jpeg=2\n";
Ожидаемый результат
quality: q35-smaller-than-q90 decoded-pixels=different png=3 jpeg=2

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

В полном примере оба JPEG имеют 320×200, размер при 35 меньше, а пиксельные подписи различны. Эти числа не являются обещанием для другого изображения или кодера. Quality90 не означает «90% исходных байтов»; настройки PNG тоже нельзя толковать как JPEG-quality. Упражнение: гарантирует ли quality 100 отсутствие потерь JPEG? Решение: нет. Для точного сохранения пикселей выбирайте подходящий формат без потерь и проверяйте его результат.

Основа маршрута: размер карточки, тон и цвет, очистка пикселей.

Добавить комментарий и удалить его без изменения PNG-пикселей

Перед публикацией требуется удалить служебную пометку. Комментарий — метаданные в файле, а не видимая надпись. Две картинки ниже намеренно выглядят одинаково: правильный результат этой операции измеряется наличием комментария и байтовой подписью.

До strip: PNG с комментарием catalog:owned-97; он не нарисован на изображении
До strip: PNG с комментарием catalog:owned-97; он не нарисован на изображении
После strip: те же пиксели, комментарий удалён
После strip: те же пиксели, комментарий удалён
$image = new Gmagick(__DIR__ . "/product.ppm");
$image->commentImage("catalog:owned-97");
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/with-comment.png");
$image->stripImage();
$image->writeImage(__DIR__ . "/without-comment.png");

commentImage получает строку и добавляет комментарий. stripImage удаляет профили и комментарии у текущего изображения. Здесь PNG записывается дважды; полная программа проверяет, что строка присутствовала в первом файле и исчезла во втором. getImageSignature остался тем же, а hash_file("sha256",...) изменился: пиксели и закодированный файл — разные объекты проверки.

Добавить комментарий и удалить его без изменения PNG-пикселейСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$image=new Gmagick(__DIR__.'/product.ppm');
$before=$image->getImageSignature();
$image->commentImage('catalog:owned-97');
$image->setImageDepth(8);
$image->setImageFormat('PNG');
$image->writeImage(__DIR__.'/gm97-export-metadata-comment.png');
$commented=$image->getImageSignature();
$image->stripImage();
$image->writeImage(__DIR__.'/gm97-export-metadata-strip.png');
$after=$image->getImageSignature();
$commentBytes=file_get_contents(__DIR__.'/gm97-export-metadata-comment.png');
$stripBytes=file_get_contents(__DIR__.'/gm97-export-metadata-strip.png');

gmReport('gm97-export-metadata',["commentimage", "stripimage", "__construct", "getimagesignature", "setimagedepth", "setimageformat", "writeimage"],["gm97-export-metadata-comment.png", "gm97-export-metadata-strip.png"],
    ['pixels_unchanged'=>$before===$commented&&$commented===$after,'comment_written'=>str_contains($commentBytes,"catalog:owned-97"),'comment_removed'=>!str_contains($stripBytes,"catalog:owned-97"),'file_bytes_differ'=>hash("sha256",$commentBytes)!==hash("sha256",$stripBytes)],
    $errors ?? [], []);
echo "metadata: comment=removed pixel-signature=same file-sha256=different png=2\n";
Ожидаемый результат
metadata: comment=removed pixel-signature=same file-sha256=different png=2

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Наш собственный PPM не содержит ICC/EXIF, поэтому этот пример доказывает удаление комментария и неизменность его пикселей. Удаление цветового ICC-профиля может изменить интерпретацию цвета просмотрщиком; strip не является преобразованием в нужное цветовое пространство. Перезапись JPEG дополнительно кодирует его заново, поэтому результат этого PNG-примера нельзя переносить на JPEG как обещание отсутствия потерь. Упражнение: commentImage делает водяной знак? Решение: нет, пиксельная надпись потребовала бы рисования.

Основа маршрута: размер карточки, тон и цвет, очистка пикселей.

Отличить глубину данных от размера в пикселях

Два файла 320×200 могут иметь разную точность тонов. Глубина — число бит на компонент, а не ширина, высота или размер файла. Сначала gamma 1.4 создаёт значения с более высокой точностью, затем сравним версии 8 и 16 бит. Превью на странице приведены к 8 бит и не служат измерителем глубины.

Исходник после gamma 1.4; на странице показано 8-битное превью
Исходник после gamma 1.4; на странице показано 8-битное превью
Сохранённый PNG8:320×200, глубина 8
Сохранённый PNG8:320×200, глубина 8
8-битное превью настоящего PNG16; точную глубину проверяем в файле, не глазами
8-битное превью настоящего PNG16; точную глубину проверяем в файле, не глазами
$image = new Gmagick(__DIR__ . "/tone.ppm");
$image->gammaImage(1.4);
$image->setImageDepth(16);
echo $image->getImageDepth();
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/archive16.png");

setImageDepth задаёт глубину состояния, getImageDepth читает фактическую глубину. PNG16 сохраняет больше промежуточных значений после вычисления; снижение до 8 округляет значения и меняет пиксельную подпись. Увеличение 8→16 не возвращает уже потерянную информацию. Полная программа проверяет ещё байт глубины в IHDR настоящего PNG: это проверка формата, а не предположение по расширению.

Отличить глубину данных от размера в пикселяхСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$source->gammaImage(1.4);
$eight=clone $source;
$eight->setImageDepth(8);
$depth8=$eight->getImageDepth();
$eight->setImageFormat('PNG');
$eight->writeImage(__DIR__.'/gm97-export-depth8.png');
$sixteen=clone $source;
$sixteen->setImageDepth(16);
$depth16=$sixteen->getImageDepth();
$sixteen->setImageFormat('PNG');
$sixteen->writeImage(__DIR__.'/gm97-export-depth16-native.png');
$requested32=clone $source;
$requested32->setImageDepth(32);
$depth32=$requested32->getImageDepth();
gm97Png($source,'gm97-export-depth-before.png');
gm97Png($sixteen,'gm97-export-depth16-view.png');
$ihdr8=ord(file_get_contents(__DIR__.'/gm97-export-depth8.png')[24]);
$ihdr16=ord(file_get_contents(__DIR__.'/gm97-export-depth16-native.png')[24]);

gmReport('gm97-export-depth',["setimagedepth", "getimagedepth", "gammaimage", "__construct", "getimagesignature", "setimageformat", "writeimage"],["gm97-export-depth-before.png", "gm97-export-depth8.png", "gm97-export-depth16-view.png"],
    ['depth8'=>$depth8===8&&$ihdr8===8,'depth16'=>$depth16===16&&$ihdr16===16,'q16_limit'=>Gmagick::QUANTUM_DEPTH===16&&$depth32===16,'quantization_changes'=>$eight->getImageSignature()!==$sixteen->getImageSignature()],
    $errors ?? [], ['depth8'=>$depth8,'depth16'=>$depth16,'requested32_actual'=>$depth32,'ihdr8'=>$ihdr8,'ihdr16'=>$ihdr16]);
echo "depth: requested8=8 requested16=16 requested32=16-in-Q16 png-preview=3\n";
Ожидаемый результат
depth: requested8=8 requested16=16 requested32=16-in-Q16 png-preview=3

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Для нашей Q16-сборки запрос 8 дал 8, запрос 16 дал 16, запрос 32 остался 16; в PHP.net перечислены 8,16,32, но возможности ограничены сборкой и кодером. Одноцветное изображение может требовать меньше значащих бит, поэтому getImageDepth не следует объявлять обещанным размером контейнера. После запуска настоящий PNG16 появится рядом с программой. Упражнение: станет ли файл 320×200 «вдвое шире» при 16 бит? Решение: нет, геометрия остаётся 320×200.

Основа маршрута: размер карточки, тон и цвет, очистка пикселей.

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

Завершим рабочий шаг каталога: уберём внутреннюю пометку, выберем 8 бит и JPEG quality 85, запишем файл и сформируем манифест. Проверяем уже сохранённое изображение; подготовка объекта сама по себе ещё не означает появления правильного файла.

До экспорта: собственный рисунок каталога
До экспорта: собственный рисунок каталога
После: пиксели реального JPEG quality 85, комментарий удалён до кодирования
После: пиксели реального JPEG quality 85, комментарий удалён до кодирования
$image = new Gmagick(__DIR__ . "/product.ppm");
$image->commentImage("internal:catalog-preview");
$image->stripImage();
$image->setImageDepth(8);
$image->setCompressionQuality(85);
$image->setImageFormat("JPEG");
$image->writeImage(__DIR__ . "/public.jpg");

Порядок читается сверху вниз: подготовить метаданные, выбрать точность и качество, затем кодировать. Полная программа заново открывает JPEG и записывает в JSON ширину, высоту, глубину, число байтов, SHA256 файла и пиксельную подпись. Это продолжение уже изученного сохранения; массив хранит именованные значения, json_encode превращает его в текст манифеста.

Подготовить карточку к публикации с явными параметрамиСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/product.ppm');
$output=clone $source;
$output->commentImage('internal:catalog-preview');
$signature=$output->getImageSignature();
$output->stripImage();
$strippedSignature=$output->getImageSignature();
$output->setImageDepth(8);
$beforeEncodingDepth=$output->getImageDepth();
$output->setCompressionQuality(85);
$output->setImageFormat('JPEG');
$output->writeImage(__DIR__.'/gm97-export-public.jpg');
$saved=new Gmagick(__DIR__.'/gm97-export-public.jpg');
gm97Png($source,'gm97-export-publish-before.png');
gm97Png($saved,'gm97-export-publish-after.png');
$manifest=['file'=>'gm97-export-public.jpg','width'=>$saved->getImageWidth(),'height'=>$saved->getImageHeight(),'depth'=>$saved->getImageDepth(),'bytes'=>filesize(__DIR__.'/gm97-export-public.jpg'),'sha256'=>hash_file('sha256',__DIR__.'/gm97-export-public.jpg'),'pixel_signature'=>$saved->getImageSignature()];
file_put_contents(__DIR__.'/gm97-export-public.json',json_encode($manifest,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR)."\n");

gmReport('gm97-export-publish',["commentimage", "stripimage", "setimagedepth", "getimagedepth", "setcompressionquality", "getimagewidth", "getimageheight", "__construct", "getimagesignature", "setimageformat", "writeimage"],["gm97-export-publish-before.png", "gm97-export-publish-after.png"],
    ['strip_preserves_pixels'=>$signature===$strippedSignature,'depth8_before_encoding'=>$beforeEncodingDepth===8,'saved_geometry'=>$manifest["width"]===320&&$manifest["height"]===200,'comment_absent'=>!str_contains(file_get_contents(__DIR__."/gm97-export-public.jpg"),"internal:catalog-preview"),'jpeg_changes_pixels'=>$saved->getImageSignature()!==$source->getImageSignature()],
    $errors ?? [], $manifest);
echo "publish: JPEG320x200 quality85 comment=absent manifest=written png=2\n";
Ожидаемый результат
publish: JPEG320x200 quality85 comment=absent manifest=written png=2

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Получаются JPEG320×200, два PNG для сравнения и JSON. Комментарий отсутствует; JPEG изменил пиксели, хотя размеры остались прежними. Так можно обнаружить не тот файл или неполную запись до публикации. Упражнение: какую подпись использовать для проверки скачанного архива? Решение: SHA256 точных байтов архива/файла; подпись пикселей относится к декодированному изображению. Загрузка на сервер и атомарная замена набора здесь не выполняются: это отдельный слой приложения.

Основа маршрута: размер карточки, тон и цвет, очистка пикселей.

Проверить две одинаково выглядящие версии файла

В каталоге бывает две ревизии файла с одинаковым изображением и разными служебными данными. Сравним их осмысленно: совпадают ли пиксели, совпадают ли все байты, сохранена ли нужная глубина? Это три разных вопроса, для них нельзя использовать один признак.

Версия A: комментарий revision:A, пиксели PNG8
Версия A: комментарий revision:A, пиксели PNG8
Версия B: комментарий revision:B, те же пиксели PNG8
Версия B: комментарий revision:B, те же пиксели PNG8
$image = new Gmagick(__DIR__ . "/tone.ppm");
$pixels = $image->getImageSignature();
$image->commentImage("revision:A");
$image->setImageFormat("PNG");
$image->writeImage(__DIR__ . "/revision.png");
$fileHash = hash_file("sha256", __DIR__ . "/revision.png");

getImageSignature возвращает SHA-256 пиксельного потока; hash_file читает байты файла с метаданными и кодированием. В полной программе комментарий A заменяется на B через stripImage и commentImage. Итоговые PNG визуально и по пиксельной подписи совпадают, однако их байтовые SHA256 различаются. Отдельно сохраняем в памяти 16-битную рабочую версию и 8-битную веб-версию, читаем getImageDepth и проверяем потерю точности при уменьшении глубины.

Проверить две одинаково выглядящие версии файлаСамостоятельный пример
<?php
declare(strict_types=1);
require __DIR__.'/gm97-color-fixture.php';
gmRestore();
$source=new Gmagick(__DIR__.'/tone.ppm');
$source->gammaImage(1.4);
$archive=clone $source;
$archive->setImageDepth(16);
$archiveDepth=$archive->getImageDepth();
$web=clone $source;
$web->setImageDepth(8);
$webDepth=$web->getImageDepth();
$signature=$web->getImageSignature();
$web->commentImage('revision:A');
$web->setImageFormat('PNG');
$web->writeImage(__DIR__.'/gm97-export-identity-a.png');
$web->stripImage();
$web->commentImage('revision:B');
$web->writeImage(__DIR__.'/gm97-export-identity-b.png');
$samePixels=$web->getImageSignature()===$signature;
$sameFiles=hash_file('sha256',__DIR__.'/gm97-export-identity-a.png')===hash_file('sha256',__DIR__.'/gm97-export-identity-b.png');
$summary=['archive_depth'=>$archiveDepth,'web_depth'=>$webDepth,'same_pixels'=>$samePixels,'same_encoded_files'=>$sameFiles,'archive_vs_web_pixels_differ'=>$archive->getImageSignature()!==$web->getImageSignature()];
file_put_contents(__DIR__.'/gm97-export-identity.json',json_encode($summary,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR)."\n");

gmReport('gm97-export-identity',["gammaimage", "setimagedepth", "getimagedepth", "getimagesignature", "commentimage", "stripimage", "__construct", "setimageformat", "writeimage"],["gm97-export-identity-a.png", "gm97-export-identity-b.png"],
    ['same_pixels'=>$samePixels,'different_files'=>!$sameFiles,'depth_policy'=>$archiveDepth===16&&$webDepth===8,'precision_changes_pixels'=>$summary["archive_vs_web_pixels_differ"]],
    $errors ?? [], $summary);
echo "identity: visual-pixels=same encoded-files=different depths=16,8 png=2\n";
Ожидаемый результат
identity: visual-pixels=same encoded-files=different depths=16,8 png=2

Скачайте и распакуйте example.php, gm97-color-fixture.php и четыре файла .ppm.b64 в одну папку. Запуск: php example.php. Помощник восстанавливает собственные входы, проверяет их SHA256 и записывает metrics.json. Основные методы обработки видны в программе; gm97Png сохраняет копию как PNG8 для просмотра. Источники не перезаписываются. Среда: PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Ожидаемый отчёт: одинаковые пиксели PNG8, разные файлы, глубины 16 и 8. Подпись не подтверждает авторство, качество или похожесть двух разных изображений и не заменяет доверенную поставку. Упражнение: изменились только метаданные, можно ли назвать файлы байтово идентичными? Решение: нет. Для воспроизводимого выпуска фиксируйте исходник, порядок операций, версии библиотеки и оба вида проверки по их назначению.

Основа маршрута: размер карточки, тон и цвет, очистка пикселей.

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

php Gmagick save jpeg quality. Разработчик не находит в описании PHP Gmagick способ управлять качеством JPEG при сохранении. Текущая официальная страница уже описывает setCompressionQuality. Мы вызываем его после загрузки изображения, действительно сохраняем JPEG35 и90, измеряем байты и показываем декодированные результаты. Историческое отсутствие документации не выдаём за текущую проблему.

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

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

Gmagick::commentimageДобавить текстовую метаинформацию

PECL gmagick >= Unknown · gmagick

Gmagick::commentimage(string $comment): Gmagick
Gmagick::commentimage(string $comment): Gmagick

Обязательная строка comment добавляет комментарий к изображению; результат — Gmagick. Комментарий не является видимой надписью или водяным знаком. Его фактическое сохранение зависит от формата; здесь проверены настоящие PNG. Меняется байтовая идентичность файла, но не подпись пикселей. Для замены комментария в демонстрации ревизий сначала удаляем метаданные stripImage, затем добавляем новую строку. Не используйте комментарий как доказательство авторства или защиту изображения.

ПараметрКонтракт PHP.netНазначение
$commentstring; обязательныйСтрока комментария в метаданных.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Добавить комментарий и удалить его без изменения PNG-пикселей; Проверить две одинаково выглядящие версии файла.

Gmagick::getimagedepthПрочитать фактическую глубину изображения

PECL gmagick >= Unknown · gmagick

Gmagick::getimagedepth(): int
Gmagick::getimagedepth(): int

Аргументов нет. Возвращается int — фактическая глубина изображения. Это не ширина, не число цветов и не объём в байтах. У конкретных пикселей может быть меньше значащих бит, чем ожидается от запрошенного контейнера; фактический PNG проверяем также по IHDR и повторному чтению. Два сценария различают 8-битную веб-версию и 16-битный рабочий вариант. Возможности определяют сборка Q16 и кодер; функция не выдаёт гарантию поддержки 32 бит.

Параметров нет: вызов записывается с пустыми скобками.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

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

Gmagick::getimagesignatureПолучить SHA-256 пиксельного потока

PECL gmagick >= Unknown · gmagick

Gmagick::getimagesignature(): string
Gmagick::getimagesignature(): string

Аргументов нет. Возвращается string с SHA-256 для пиксельного потока. В Return Values PHP.net написано «hash of the file», но описание, текущий C и реальная пара PNG с комментариями показывают другое назначение: комментарии изменились, подпись пикселей совпала, файловые SHA256 различны. Для точных байтов используется hash_file("sha256",path). Подпись пикселей не является перцептивной мерой похожести, оценкой качества или подтверждением авторства. Сравнения в уроке сделаны в одном фиксированном runtime; между разными рендерерами и преобразованиями цвета нужен свой контракт.

Параметров нет: вызов записывается с пустыми скобками.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Добавить комментарий и удалить его без изменения PNG-пикселей; Проверить две одинаково выглядящие версии файла.

Gmagick::setCompressionQualityЗадать качество кодирования объекта

PECL Gmagick · gmagick

Gmagick::setCompressionQuality(int $quality): Gmagick
Gmagick::setCompressionQuality(int $quality): Gmagick

Обязательный int quality задаёт значение качества по умолчанию для объекта; PHP.net указывает стандартное значение GraphicsMagick 75. Метод возвращает Gmagick. Реальная пара 35/90 влияет на JPEG после загрузки изображения; на этом входе 35 дал меньше байтов, но другие пиксели. Проверка пустого объекта в Gmagick вызывает GmagickException, хотя низкоуровневый Wand setter задаёт поле image_info. Используйте метод после загрузки или создания изображения. Quality не равен проценту байтов; у разных форматов смысл настройки может различаться. JPEG quality 100 не тождественен формату без потерь. Диапазон для пользовательского ввода задавайте в своём приложении.

ПараметрКонтракт PHP.netНазначение
$qualityint; обязательныйНастройка качества кодирования объекта.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: точная версия не указана. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Измерить реальный JPEG при двух значениях качества; Подготовить карточку к публикации с явными параметрами.

Gmagick::setimagedepthВыбрать точность компонентов

PECL gmagick >= Unknown · gmagick

Gmagick::setimagedepth(int $depth): Gmagick
Gmagick::setimagedepth(int $depth): Gmagick

Обязательный int depth — глубина в битах; PHP.net перечисляет 8, 16, 32. Возвращается Gmagick. В проверенной Q16-сборке запросы 8/16 дали 8/16, а запрос 32 сохранил 16. После gamma исходные значения имеют 16-битную точность; снижение до 8 меняет их подпись из-за округления. Повышение глубины не восстанавливает потерянную информацию. Геометрия 320×200 не изменяется; размер файла из этого числа не вычисляется. PNG16 сохранён как настоящий дополнительный файл, для страницы сделан отдельный просмотр в PNG8.

ПараметрКонтракт PHP.netНазначение
$depthint; обязательныйГлубина компонентов в битах.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

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

Gmagick::stripimageУдалить профили и комментарии

PECL gmagick >= Unknown · gmagick

Gmagick::stripimage(): Gmagick
Gmagick::stripimage(): Gmagick

Аргументов нет. Метод удаляет все профили и комментарии текущего изображения, возвращает Gmagick. Наш PNG-пример показывает удаление добавленного комментария при неизменной подписи пикселей; байты файла меняются. Собственные PPM не имеют ICC/EXIF, поэтому удаление реальных фотопрофилей не объявляется проверенным. Удаление ICC может изменить интерпретацию цвета просмотрщиком; это не преобразование цветов. Повторная запись JPEG дополнительно кодирует пиксели, поэтому не обещает сохранение качества.

Параметров нет: вызов записывается с пустыми скобками.

Официальная ошибка обработки — GmagickException. Ошибки количества или типа аргументов в PHP могут быть ArgumentCountError или TypeError; они не являются результатом фильтра. Для независимого варианта используйте clone, а для сохранения результата — явную запись файла.

Версия в PHP.net: PECL gmagick >= Unknown. Unknown не задаёт проверенную минимальную версию. Фактические различия выше относятся к PHP 8.3.6, Gmagick 2.0.6RC1, GraphicsMagick 1.3.42 Q16.

Два применения: Добавить комментарий и удалить его без изменения PNG-пикселей; Подготовить карточку к публикации с явными параметрами.

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

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

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

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

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