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

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

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

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

Глава 368 · После объектов, пикселей и файлов

Imagick: запрос декодеру, метка и преобразование цвета

Получить серый PNG каталога, увидеть реальное YCbCr-чтение JPEG и не перепутать настройки объекта с преобразованием цвета.

Получить полезную серую версию и увидеть отличие

Нужны цветная карточка каталога и отдельная серая версия для макета. Обычный JPEG открывается в sRGB, а просьба «сделать GRAY» через похожий setter не обязательно пересчитывает его цвета. Получим самостоятельный first-gray.png, сохранив исходный JPEG; затем разберём, где настройка чтения, где обозначение изображения и где настоящая обработка чисел.

Надписи RGB и «Q16 внутри, PNG8 на диске» унаследованы от собственного исходного рисунка и остаются пикселями внутри JPEG. Это не автоматические метаданные текущего JPEG или PNG просмотра. Q16 означает внутренний 16-битный диапазон компоненты проверенной сборки, PNG8 в старой надписи — 8 бит на компоненту, а не индексированный PNG. Фактический формат определяют байты файла и его повторное чтение.

Фактическое обычное декодирование собственного JPEG 400×320 в первом PHP-коде
Фактическое обычное декодирование собственного JPEG 400×320 в первом PHP-коде
Только первый код: цветной JPEG-просмотр и самостоятельный серый PNG
Только первый код: цветной JPEG-просмотр и самостоятельный серый PNG
Понятие до схемыЗначение в этих примерах
RGB / RGBA / alphaRGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Отдельный собственный PNG имеет отверстия и полупрозрачные края.
Цветовое пространствоПравило, по которому числа компонент означают цвет. Здесь sRGB — обычное нелинейное представление; RGB означает линейное. Одинаковые числа с разными правилами могут дать разный вид.
YCbCr / GRAYYCbCr — яркостная Y и цветоразностные Cb/Cr, не RGB-фото. GRAY — одна серая интенсивность. Декодер читает формат файла и получает значения компонент.
GammaМетаданные передачи яркости в этой пробе: при назначении линейного RGB поле gamma стало 1.0. sRGB использует составное правило передачи, а не одну универсальную степень 2.2. Это поле не является силой эффекта и не заменяет преобразование значений.
Две настройкиgetColorspace/setColorspace относятся к запросу этого объекта для будущего чтения. getImageColorspace/setImageColorspace относятся к текущему изображению. Global здесь не означает всё приложение.
Изменение значенийtransformImageColorspace пересчитывает существующие данные. Это уже изученный метод; новая глава не переносит его карточку и не подменяет им три изучаемых контракта.
Числа в диагностикеКомпоненты экспортируются как нормированные числа от 0 до 1 через PIXEL_DOUBLE. В YCbCr-пробе они означают Y/Cb/Cr. Целые коды COLORSPACE_* — выбор пространства, а не значение пикселя.
Файл и просмотрИсточник — готовый JPEG, который здесь не перекодируем. Восемь составных изображений и дополнительные PNG показывают реальные результаты PHP. Белый фон просмотра RGBA не означает, что прозрачность удалена из самостоятельного файла.
Запрос объекта → конкретный декодер → текущая метка и значения → явное преобразование → PNG
Запрос объекта → конкретный декодер → текущая метка и значения → явное преобразование → PNG

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$reader = new Imagick();
$space = $reader->getColorspace();
echo $space;

new Imagick() создаёт отдельный объект без изображений. В проверенной сборке свежий объект сообщает 0, COLORSPACE_UNDEFINED: явный запрос не задан. Это нормальный целый код, не ошибка. После чтения JPEG getImageColorspace может вернуть sRGB, хотя getColorspace всё ещё 0. Метод чтения текущего изображения объяснён в работе с пикселями.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

Для полезной серой версии после загрузки:

$gray = clone $source;
$gray->transformImageColorspace(Imagick::COLORSPACE_GRAY);

Перед полной программой: <?php открывает PHP; declare(strict_types=1) включает строгие типы, require подключает открытый helper из папки __DIR__. restoreColorspaceInputs восстанавливает JPEG и PNG из Base64 и проверяет SHA. new Imagick(путь) читает файл в новый объект. saveColorspacePNG записывает копию в PNG с 8 битами на компоненту; saveColorspaceComparison размещает полные панели без уменьшения. Имя без -> вызывает подключённую функцию helper. Квадратные скобки [$source, $gray] создают массив — упорядоченный список двух изображений; запятая разделяет элементы, порядок задаёт левую и правую панели. В helper нет трёх целевых методов и скрытого преобразования пространства. В первом коде серое преобразование показано явно; true не заменяет проверку writeImage.

Сохранить отдельный серый PNG каталога

Первый PNG показывает исходный цветной каталог и самостоятельный first-gray.png. Число 0 — настройка читателя без явного запроса пространства, 23 — sRGB текущего JPEG, 3 — GRAY результата. Значения не обозначают качество. Цветной исходник сохранён отдельно и не перезаписан.

Сохранить отдельный серый PNG каталогаПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$requested = $source->getColorspace();
$gray = clone $source;
if (!$gray->transformImageColorspace(Imagick::COLORSPACE_GRAY)) { throw new RuntimeException('Gray conversion failed'); }
saveColorspacePNG($source, 'source-preview8.png');
saveColorspacePNG($gray, 'first-gray.png');
saveColorspaceComparison([$source, $gray], 'colorspace-first.png');
echo "colorspace-first.png\nsource-preview8.png\nfirst-gray.png\n";
printf("reader-setting=%d image=%d gray=%d\n", $requested, $source->getImageColorspace(), $gray->getImageColorspace());

Первый PNG показывает исходный цветной каталог и самостоятельный first-gray.png. Число 0 — настройка читателя без явного запроса пространства, 23 — sRGB текущего JPEG, 3 — GRAY результата. Значения не обозначают качество. Цветной исходник сохранён отдельно и не перезаписан. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-first.png
source-preview8.png
first-gray.png
reader-setting=0 image=23 gray=3

Отделить момент настройки от момента преобразования

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$reader = new Imagick();
$ok = $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/source.jpg');

YCbCr хранит яркостную компоненту Y и две цветоразностные Cb/Cr; эти три значения нельзя читать как красный, зелёный и синий. __DIR__ — папка программы, . соединяет строки пути, кавычки выделяют текст. Устанавливаем запрос до чтения: JPEG-декодер этой сборки его использует. После загрузки для обычного просмотра явно вызываем transformImageColorspace(SRGB). Другие декодеры могут не использовать эту настройку: наш PNG-контроль остался sRGB.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

Три действия имеют разный момент применения. Меняем запрос уже загруженного объекта — числовая проверка должна остаться точной. Преобразуем копию в GRAY — получаем серый результат. Настраиваем свежий JPEG-читатель до загрузки — получаем YCbCr и явно возвращаемся в sRGB перед просмотром.

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

Разделить настройку после чтения, преобразование и путь декодера

Вторая панель точна исходнику: запрос чтения изменён после чтения, но текущий растр остаётся sRGB. Третья получена настоящим преобразованием. Четвёртая прошла отдельный путь JPEG → YCbCr → sRGB; она близка обычному чтению, но точного равенства всех пикселей не обещаем.

Разделить настройку после чтения, преобразование и путь декодераПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$configured = clone $source; $before = colorspaceRawHash($configured);
$configured->setColorspace(Imagick::COLORSPACE_YCBCR);
$rawSame = $before === colorspaceRawHash($configured);
$gray = clone $source; $gray->transformImageColorspace(Imagick::COLORSPACE_GRAY);
$reader = new Imagick(); $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/source.jpg');
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($configured, 'global-after-read.png');
saveColorspacePNG($gray, 'control-gray.png');
saveColorspacePNG($reader, 'control-reader-back.png');
saveColorspaceComparison([$source, $configured, $gray, $reader], 'colorspace-controls.png');
echo "colorspace-controls.png\nglobal-after-read.png\ncontrol-gray.png\ncontrol-reader-back.png\n";
printf("after-read raw-same=%d global=%d image=%d\n", (int)$rawSame, $configured->getColorspace(), $configured->getImageColorspace());

Вторая панель точна исходнику: запрос чтения изменён после чтения, но текущий растр остаётся sRGB. Третья получена настоящим преобразованием. Четвёртая прошла отдельный путь JPEG → YCbCr → sRGB; она близка обычному чтению, но точного равенства всех пикселей не обещаем. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-controls.png
global-after-read.png
control-gray.png
control-reader-back.png
after-read raw-same=1 global=27 image=23

Прочитать настройку объекта и проверить независимость копии

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$reader = new Imagick();
$space = $reader->getColorspace();
echo $space;

new Imagick() создаёт отдельный объект без изображений. В проверенной сборке свежий объект сообщает 0, COLORSPACE_UNDEFINED: явный запрос не задан. Это нормальный целый код, не ошибка. После чтения JPEG getImageColorspace может вернуть sRGB, хотя getColorspace всё ещё 0. Метод чтения текущего изображения объяснён в работе с пикселями.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

Запрос, фактическое пространство изображения и независимая копия — разные поля
Запрос, фактическое пространство изображения и независимая копия — разные поля

Прочитать запрос читателя до и после загрузки JPEG

Getter сообщает настройку этого объекта: сначала 0, затем 27. После преобразования текущего изображения в sRGB настройка будущего чтения по-прежнему 27. Следовательно getColorspace не заменяет getImageColorspace.

Прочитать запрос читателя до и после загрузки JPEGПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick(); $initial = $reader->getColorspace();
$reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$configured = $reader->getColorspace();
$reader->readImage(__DIR__ . '/source.jpg'); $decodedSpace = $reader->getImageColorspace();
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($reader, 'get-reader-back.png');
saveColorspaceComparison([$source, $reader], 'colorspace-get.png');
echo "colorspace-get.png\nget-reader-back.png\n";
printf("initial=%d configured=%d decoded=%d displayed=%d retained-setting=%d\n", $initial, $configured, $decodedSpace, $reader->getImageColorspace(), $reader->getColorspace());

Getter сообщает настройку этого объекта: сначала 0, затем 27. После преобразования текущего изображения в sRGB настройка будущего чтения по-прежнему 27. Следовательно getColorspace не заменяет getImageColorspace. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-get.png
get-reader-back.png
initial=0 configured=27 decoded=27 displayed=23 retained-setting=27

Вторая задача — не дать перенастройке рабочего объекта незаметно затронуть другого читателя. Клонируем объект, очищаем копию, явно выбираем sRGB и читаем исходный JPEG снова. Сам clone не объявляем способом создать чистое состояние: нужную настройку устанавливаем открыто.

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

Копия очищена и явно перенастроена перед новым чтением. Исходный объект сохранил запрос YCbCr; его изображение преобразовано отдельно. Последняя панель соответствует обычному sRGB-чтению. Изменение копии не является настройкой всего приложения.

Проверить независимые настройки исходного и скопированного читателяПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick(); $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/source.jpg');
$copy = clone $reader; $copy->clear(); $copy->setColorspace(Imagick::COLORSPACE_SRGB);
$copy->readImage(__DIR__ . '/source.jpg');
$parentSetting = $reader->getColorspace(); $copySetting = $copy->getColorspace();
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($reader, 'cloned-reader-back.png'); saveColorspacePNG($copy, 'cloned-default.png');
saveColorspaceComparison([$source, $reader, $copy], 'colorspace-reader-copy.png');
echo "colorspace-reader-copy.png\ncloned-reader-back.png\ncloned-default.png\n";
printf("parent-setting=%d copy-setting=%d parent-image=%d copy-image=%d\n", $parentSetting, $copySetting, $reader->getImageColorspace(), $copy->getImageColorspace());

Копия очищена и явно перенастроена перед новым чтением. Исходный объект сохранил запрос YCbCr; его изображение преобразовано отдельно. Последняя панель соответствует обычному sRGB-чтению. Изменение копии не является настройкой всего приложения. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-reader-copy.png
cloned-reader-back.png
cloned-default.png
parent-setting=27 copy-setting=23 parent-image=23 copy-image=23

Использовать реальный JPEG-потребитель и проверить PNG-границу

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$reader = new Imagick();
$ok = $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/source.jpg');

YCbCr хранит яркостную компоненту Y и две цветоразностные Cb/Cr; эти три значения нельзя читать как красный, зелёный и синий. __DIR__ — папка программы, . соединяет строки пути, кавычки выделяют текст. Устанавливаем запрос до чтения: JPEG-декодер этой сборки его использует. После загрузки для обычного просмотра явно вызываем transformImageColorspace(SRGB). Другие декодеры могут не использовать эту настройку: наш PNG-контроль остался sRGB.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

Числа Y/Cb/Cr до преобразования и реальные sRGB/GRAY результаты после него
Числа Y/Cb/Cr до преобразования и реальные sRGB/GRAY результаты после него

Запросить YCbCr до чтения и вернуть полезный sRGB/GRAY результат

До отображения снимаем числовую пробу Y/Cb/Cr в точке (80,88), затем явно преобразуем изображение в sRGB. Эти три числа не являются RGB-цветом. Отдельная серая производная нужна для макета без цвета; исходный JPEG не перекодируется.

Запросить YCbCr до чтения и вернуть полезный sRGB/GRAY результатПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick();
if (!$reader->setColorspace(Imagick::COLORSPACE_YCBCR)) { throw new RuntimeException('Reader setting failed'); }
$reader->readImage(__DIR__ . '/source.jpg');
$triplet = $reader->exportImagePixels(80, 88, 1, 1, 'RGB', Imagick::PIXEL_DOUBLE);
$decodedSpace = $reader->getImageColorspace();
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$gray = clone $reader; $gray->transformImageColorspace(Imagick::COLORSPACE_GRAY);
saveColorspacePNG($reader, 'requested-back.png'); saveColorspacePNG($gray, 'requested-gray.png');
saveColorspaceComparison([$source, $reader, $gray], 'colorspace-requested-reader.png');
echo "colorspace-requested-reader.png\nrequested-back.png\nrequested-gray.png\n";
printf("decoded=%d Y=%.6f Cb=%.6f Cr=%.6f; displayed=%d\n", $decodedSpace, $triplet[0], $triplet[1], $triplet[2], $reader->getImageColorspace());

До отображения снимаем числовую пробу Y/Cb/Cr в точке (80,88), затем явно преобразуем изображение в sRGB. Эти три числа не являются RGB-цветом. Отдельная серая производная нужна для макета без цвета; исходный JPEG не перекодируется. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-requested-reader.png
requested-back.png
requested-gray.png
decoded=27 Y=0.960784 Cb=0.427451 Cr=0.556863; displayed=23

В exportImagePixels координаты 80/88 задают левую верхнюю точку одного пикселя, следующие 1/1 — ширину и высоту. Строка RGB задаёт позиции компонент при экспорте; поскольку изображение помечено YCbCr, эти позиции содержат Y/Cb/Cr. PIXEL_DOUBLE выбирает нормированный числовой вывод, не перевод цвета. Затем transformImageColorspace(SRGB) меняет смысл и значения согласованно. Между двумя путями JPEG-декодирования возможна небольшая разница: не обещаем побайтного совпадения.

Во второй задаче читаем PNG тем же запросом. Если декодер его не использует, setter всё равно мог вернуть true. Проверяем текущую метку и исходные значения; alpha сравниваем отдельно. colorspacePreview явно накладывает RGBA поверх непрозрачного белого фона через OVER: A=0 показывает фон, A=1 закрывает его, промежуточная alpha смешивает. Самостоятельный png-gray.png остаётся прозрачным.

Проверить границу JPEG-настройки на PNG-наклейке

Запрос YCbCr остался настройкой, но PNG прочитан как sRGB с исходной RGBA. После настоящего преобразования серые значения изменились, alpha сохранилась. Белая подложка есть только в картинке просмотра; png-gray.png хранит прозрачность.

Проверить границу JPEG-настройки на PNG-наклейкеПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick(); $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/product.png');
$same = colorspaceRawHash($reader) === colorspaceRawHash($product);
$pngSpace = $reader->getImageColorspace();
$gray = clone $reader; $gray->transformImageColorspace(Imagick::COLORSPACE_GRAY);
$white = colorspacePreview($reader, 'white'); $grayWhite = colorspacePreview($gray, 'white');
saveColorspacePNG($reader, 'png-unchanged.png', true); saveColorspacePNG($gray, 'png-gray.png', true);
saveColorspacePNG($grayWhite, 'png-gray-white.png');
saveColorspaceComparison([$source, $white, $grayWhite], 'colorspace-png-boundary.png');
echo "colorspace-png-boundary.png\npng-unchanged.png\npng-gray.png\npng-gray-white.png\n";
printf("requested=%d PNG-image=%d raw-same=%d alpha-retained=%d\n", $reader->getColorspace(), $pngSpace, (int)$same, (int)($reader->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)===$gray->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)));

Запрос YCbCr остался настройкой, но PNG прочитан как sRGB с исходной RGBA. После настоящего преобразования серые значения изменились, alpha сохранилась. Белая подложка есть только в картинке просмотра; png-gray.png хранит прозрачность. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-png-boundary.png
png-unchanged.png
png-gray.png
png-gray-white.png
requested=27 PNG-image=23 raw-same=1 alpha-retained=1

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

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$ok = $image->setImageColorspace(Imagick::COLORSPACE_SRGB);

$image уже содержит данные, смысл которых нам известен. Метод возвращает bool true при успехе, а не новую картинку. Если это заведомо sRGB-числа с ошибочной меткой, назначение исправляет обозначение. Для реального изменения существующего цвета используем transformImageColorspace, см. преобразование цветового пространства. Не назначайте SRGB чужому CMYK-файлу ради прохождения проверки формата.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

Известные числа с неверной меткой и точное исправление только заведомой ошибки
Известные числа с неверной меткой и точное исправление только заведомой ошибки

Показать цену ошибочного назначения линейного RGB обычному sRGB

setImageColorspace(RGB) сохранил числа этой RGB-пробы, но объявил их линейными. Следующее реальное преобразование в sRGB сделало картинку светлее. Это диагностический контрпример: менять метку известного sRGB ради слова RGB не нужно.

Показать цену ошибочного назначения линейного RGB обычному sRGBПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$tagged = clone $source; $before = colorspaceRawHash($tagged);
if (!$tagged->setImageColorspace(Imagick::COLORSPACE_RGB)) { throw new RuntimeException('Image tag failed'); }
$same = $before === colorspaceRawHash($tagged); $tagSpace = $tagged->getImageColorspace();
$displayed = clone $tagged; $displayed->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($displayed, 'tag-linear-preview.png');
saveColorspaceComparison([$source, $displayed], 'colorspace-tag-consequence.png');
echo "colorspace-tag-consequence.png\ntag-linear-preview.png\n";
printf("tag=%d numeric-same=%d gamma=%.1f; converted=%d\n", $tagSpace, (int)$same, $tagged->getImageGamma(), $displayed->getImageColorspace());

setImageColorspace(RGB) сохранил числа этой RGB-пробы, но объявил их линейными. Следующее реальное преобразование в sRGB сделало картинку светлее. Это диагностический контрпример: менять метку известного sRGB ради слова RGB не нужно. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-tag-consequence.png
tag-linear-preview.png
tag=21 numeric-same=1 gamma=1.0; converted=23

Следующая практика имеет другое основание: мы сами назначили собственному sRGB-входу неправильную метку RGB. Поэтому известен правильный смысл исходных чисел. Простое возвращение SRGB точно восстанавливает исходное RGBA; преобразование ошибочно объявленных линейных чисел меняет цвет. Для неизвестного файла это основание отсутствует: нельзя угадывать метку только по тому, что новая картинка кажется приятнее.

Исправить только заведомо ошибочную метку собственного RGBA-входа

Мы сами испортили только обозначение собственного sRGB-источника, поэтому можем вернуть правильную метку без преобразования чисел. tag-repaired.png полностью равен входной наклейке по декодированным значениям RGBA; одинаковые PNG-байты не обещаем. Это решение для известного происхождения, а не угадывание пространства чужого CMYK/ICC-файла.

Исправить только заведомо ошибочную метку собственного RGBA-входаПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$mislabeled = clone $product;
$mislabeled->setImageColorspace(Imagick::COLORSPACE_RGB);
$wrong = clone $mislabeled; $wrong->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$repaired = clone $mislabeled;
if (!$repaired->setImageColorspace(Imagick::COLORSPACE_SRGB)) { throw new RuntimeException('Known tag repair failed'); }
$exact = colorspaceRawHash($repaired) === colorspaceRawHash($product);
$white = colorspacePreview($product, 'white'); $wrongWhite = colorspacePreview($wrong, 'white'); $repairedWhite = colorspacePreview($repaired, 'white');
saveColorspacePNG($wrong, 'tag-wrong.png', true); saveColorspacePNG($repaired, 'tag-repaired.png', true);
saveColorspacePNG($wrongWhite, 'tag-wrong-white.png'); saveColorspacePNG($repairedWhite, 'tag-repaired-white.png');
saveColorspaceComparison([$source, $wrongWhite, $repairedWhite], 'colorspace-known-tag-repair.png');
echo "colorspace-known-tag-repair.png\ntag-wrong.png\ntag-repaired.png\ntag-wrong-white.png\ntag-repaired-white.png\n";
printf("known-sRGB repair-exact=%d alpha-exact=%d repaired-space=%d\n", (int)$exact, (int)($product->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)===$repaired->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)), $repaired->getImageColorspace());

Мы сами испортили только обозначение собственного sRGB-источника, поэтому можем вернуть правильную метку без преобразования чисел. tag-repaired.png полностью равен входной наклейке по декодированным значениям RGBA; одинаковые PNG-байты не обещаем. Это решение для известного происхождения, а не угадывание пространства чужого CMYK/ICC-файла. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-known-tag-repair.png
tag-wrong.png
tag-repaired.png
tag-wrong-white.png
tag-repaired-white.png
known-sRGB repair-exact=1 alpha-exact=1 repaired-space=23

Проверить интерпретацию, файл, alpha и ошибки отдельно

ПроблемаДействие и граница
Попросили GRAY, картинка цветнаяПроверьте какой setter вызван и когда. Для существующих пикселей нужен явный transformImageColorspace, а не только настройка будущего чтения.
getColorspace даёт 0У свежего читателя это UNDEFINED, нормальный int. Текущее изображение JPEG может при этом быть sRGB. Сравнивайте именованные константы, не bool.
true, но PNG не стал YCbCrСтатус подтверждает сохранение запроса. Конкретный декодер может его не использовать. Здесь JPEG использовал, PNG-наклейка осталась sRGB.
После RGB стало светлееЛинейный RGB и sRGB означают разное. Назначение метки не пересчитало числа, но дальнейшее преобразование или запись учитывает её.
Нужно сохранить alphaВыбирайте самостоятельный RGBA PNG; просмотр на белом — отдельная композиция. Наши известные операции проверены по alpha, но нельзя переносить это на любые каналы и пространства.
GRAY и RGB PNGСерые значения могут храниться в RGB/RGBA PNG. Тип хранения в этой главе выбран явно: RGB type 2 и RGBA type 6, по 8 бит на компоненту.
Два окружения дают разный видЗафиксируйте версии, исходный файл, настройки чтения и пространство. Независимые JPEG-декодеры могут давать слегка разные пиксели; здесь все изображения получены PHP/Imagick.
CMYK, ICC, PDF/EPS или печатьТребуется отдельный разбор профилей и декодеров. Используемое преобразование может удалить ICC/ICM-профили; эта глава не обещает управление цветом по профилям или точность печати.
Отказ чтения или записиПроверяйте статус и ImagickException отдельно; неверный PHP-тип может дать TypeError. Для внешнего ввода разрешайте только ожидаемые именованные пространства. Случайный код не является проверенной настройкой.

Сначала проверяем числа живого объекта, затем сохранённый PNG. Кодировщик может использовать метку при записи; сохранение не является нейтральным способом узнать, что делал setter. Полные исходники входов и helper переносимы, а сравнительные PNG нужны для обучения, не для доказательства ICC-точности.

Открытый helper: восстановление, запись и просмотр
<?php
declare(strict_types=1);
function restoreColorspaceInputs(): void {
    $hashes = ['source.jpg' => 'c700ed2600bfeb065decacabf62e4151f0ce80e7684969826b98dbe087984b9d', 'product.png' => 'f51e5780445e0f5130a7f23112b2a00618035afd5545b8e3042c7ccff09b617c'];
    foreach ($hashes as $name => $hash) {
        $text = file_get_contents(__DIR__ . '/' . $name . '.b64');
        if ($text === false) { throw new RuntimeException('Cannot read ' . $name); }
        $bytes = base64_decode($text, true);
        if ($bytes === false || hash('sha256', $bytes) !== $hash) { throw new RuntimeException('Unexpected input ' . $name); }
        if (file_put_contents(__DIR__ . '/' . $name, $bytes) === false) { throw new RuntimeException('Cannot restore ' . $name); }
    }
}
function saveColorspacePNG(Imagick $image, string $filename, bool $alpha=false): void {
    $copy = clone $image;
    $copy->setImageFormat('png'); $copy->setImageDepth(8);
    $copy->setOption('png:color-type', $alpha ? '6' : '2');
    if (!$copy->writeImage(__DIR__ . '/' . $filename)) { throw new RuntimeException('Cannot save ' . $filename); }
}
function colorspacePreview(Imagick $image, string $background): Imagick {
    $preview = new Imagick(); $preview->newImage($image->getImageWidth(), $image->getImageHeight(), $background);
    $preview->compositeImage($image, Imagick::COMPOSITE_OVER, 0, 0); return $preview;
}
function saveColorspaceComparison(array $panels, string $filename): void {
    $width = 0; $height = 0;
    foreach ($panels as $panel) { $width += $panel->getImageWidth(); $height = max($height, $panel->getImageHeight()); }
    $canvas = new Imagick(); $canvas->newImage($width, $height, 'white'); $x = 0;
    foreach ($panels as $panel) { $canvas->compositeImage($panel, Imagick::COMPOSITE_OVER, $x, intdiv($height-$panel->getImageHeight(),2)); $x += $panel->getImageWidth(); }
    saveColorspacePNG($canvas, $filename);
}
function colorspaceRawHash(Imagick $image): string {
    return hash('sha256', json_encode($image->exportImagePixels(0, 0, $image->getImageWidth(), $image->getImageHeight(), 'RGBA', Imagick::PIXEL_DOUBLE), JSON_THROW_ON_ERROR));
}
Прочитанная реальная проблемаПрименение и предел
SO 10739822Автор устанавливает пространство GRAY через setImageColorspace или setColorspace, но не получает ожидаемого изменения изображения. Нужно различить настройку чтения, свойства текущего изображения и настоящее преобразование его компонент.
SO 29932985Пользователь пытается подготовить фотографию для API торговой площадки. Простая смена обозначения пространства приводит к принятию файла, но нарушает цвет. Это реальная причина не подменять преобразование назначением метки.
SO 29296779В цепочке получения JPEG из PDF одновременно решаются фон и CMYK. Добавленная установка пространства снова меняет вид фона. Наш материал отделяет эти обязанности; сам PDF/Ghostscript не объявляется проверенным в этом пакете.
SO 29781436После изменения размеров RGBA с равными R/G/B сохраняется иначе, чем ожидает следующая программа. Читателю важно отличать равенство цветовых значений, цветовое пространство и тип хранения PNG.
SO 46677988При переносе приложения меняется результат тонирования. Для диагностики нужны версии, известное исходное пространство и различие линейного RGB и sRGB, а не случайный подбор setter.
SO 79344163В вопросе 2025 года получение JPEG из EPS приводит к неверным цветам, а разные попытки затрагивают и размеры холста. Это показывает необходимость разобрать вход, декодер и профили отдельно. EPS/ICC/Ghostscript этим runtime-пакетом не проверяются.

Выбрать нужный уровень настройки по своей задаче

Читать запрос → getColorspace; настроить будущий декодер → setColorspace; назначить известный смысл → setImageColorspace; пересчитать данные → отдельный transform
Читать запрос → getColorspace; настроить будущий декодер → setColorspace; назначить известный смысл → setImageColorspace; пересчитать данные → отдельный transform

Упражнение: нужен серый PNG-эскиз и исходный цветной файл. Решение — открыть JPEG обычным читателем, клонировать изображение, явно преобразовать копию в GRAY и записать в новый PNG. Если требуется известная настройка следующего чтения, проверьте её getColorspace; проверку текущего изображения выполните отдельным getImageColorspace. Не заменяйте эти два вопроса одним числом.

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

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

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

Imagick::getColorspaceЧитает код настройки цветового пространства у этого объекта Imagick для будущего чтения.

PECL imagick 3 · imagick

Imagick::getColorspace(): int

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$reader = new Imagick();
$space = $reader->getColorspace();
echo $space;

new Imagick() создаёт отдельный объект без изображений. В проверенной сборке свежий объект сообщает 0, COLORSPACE_UNDEFINED: явный запрос не задан. Это нормальный целый код, не ошибка. После чтения JPEG getImageColorspace может вернуть sRGB, хотя getColorspace всё ещё 0. Метод чтения текущего изображения объяснён в работе с пикселями.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

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

Imagick::getColorspace(): int
ПараметрСмысл
Нет аргументовПустые скобки (). Возвращает int для сравнения с COLORSPACE_*. Это не цветовой анализ текущего изображения и не bool-статус.

Gets the global colorspace value. [imagick.method.available.0x657] Доступность: PECL imagick 3. Возврат: Returns an integer which can be compared against COLORSPACE constants . В этих трёх XML нет исходных примеров и таблиц изменений; отсутствие примера не заменяем вымышленным официальным кодом. Весь XML сохранён ниже.

Официальная сущность imagick.method.available.0x657 означает: метод доступен, когда Imagick собран с ImageMagick 6.5.7 или новее. Global в описании — настройка именно этого объекта Imagick для будущих операций, а не всех объектов и не всего PHP-приложения. В проверенной Imagick 3.8.1 оба метода работают до загрузки изображения. Getter возвращает int из настройки; setter присваивает её и возвращает bool. Для текущего изображения существует отдельный getImageColorspace.

Getter не читает файл, не преобразует пиксели и не определяет, какой путь фактически выбрал декодер. У свежего объекта пробы вернулся COLORSPACE_UNDEFINED (0), после запроса YCbCr — 27. У произвольного созданного другим кодом объекта значение не обязано совпадать с этим начальным контролем. Параметров и раздела ошибок в официальном XML нет; лишние аргументы и неверные PHP-типы не являются частью поддерживаемой записи.

Проверено в PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Не выводим из true успешную запись PNG или правильность цветопередачи. writeImage — отдельная операция. У преобразования цвета и кодировщика могут быть собственные правила: сначала снимаем числовые значения живого изображения, затем отдельно проверяем записанные PNG. RGB в этом уроке — линейный, sRGB — нелинейная передача; это не взаимозаменяемые надписи. Alpha описывает прозрачность, а не пространство цвета. Наши RGB↔sRGB метки и преобразование RGBA→GRAY проверены с сохранением alpha; ICC-профили, CMYK, PDF/EPS и печать не сертифицируются этими программами.

Весь официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getcolorspace">
 <refnamediv>
  <refname>Imagick::getColorspace</refname>
  <refpurpose>Gets the colorspace</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>int</type><methodname>Imagick::getColorspace</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Gets the global colorspace value.
   &imagick.method.available.0x657;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  &no.function.parameters;
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns an integer which can be compared against <link linkend="imagick.constants.colorspace">COLORSPACE constants</link>.
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Прочитать запрос читателя до и после загрузки JPEG

Getter сообщает настройку этого объекта: сначала 0, затем 27. После преобразования текущего изображения в sRGB настройка будущего чтения по-прежнему 27. Следовательно getColorspace не заменяет getImageColorspace.

Прочитать запрос читателя до и после загрузки JPEGПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick(); $initial = $reader->getColorspace();
$reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$configured = $reader->getColorspace();
$reader->readImage(__DIR__ . '/source.jpg'); $decodedSpace = $reader->getImageColorspace();
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($reader, 'get-reader-back.png');
saveColorspaceComparison([$source, $reader], 'colorspace-get.png');
echo "colorspace-get.png\nget-reader-back.png\n";
printf("initial=%d configured=%d decoded=%d displayed=%d retained-setting=%d\n", $initial, $configured, $decodedSpace, $reader->getImageColorspace(), $reader->getColorspace());

Getter сообщает настройку этого объекта: сначала 0, затем 27. После преобразования текущего изображения в sRGB настройка будущего чтения по-прежнему 27. Следовательно getColorspace не заменяет getImageColorspace. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-get.png
get-reader-back.png
initial=0 configured=27 decoded=27 displayed=23 retained-setting=27

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

Копия очищена и явно перенастроена перед новым чтением. Исходный объект сохранил запрос YCbCr; его изображение преобразовано отдельно. Последняя панель соответствует обычному sRGB-чтению. Изменение копии не является настройкой всего приложения.

Проверить независимые настройки исходного и скопированного читателяПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick(); $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/source.jpg');
$copy = clone $reader; $copy->clear(); $copy->setColorspace(Imagick::COLORSPACE_SRGB);
$copy->readImage(__DIR__ . '/source.jpg');
$parentSetting = $reader->getColorspace(); $copySetting = $copy->getColorspace();
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($reader, 'cloned-reader-back.png'); saveColorspacePNG($copy, 'cloned-default.png');
saveColorspaceComparison([$source, $reader, $copy], 'colorspace-reader-copy.png');
echo "colorspace-reader-copy.png\ncloned-reader-back.png\ncloned-default.png\n";
printf("parent-setting=%d copy-setting=%d parent-image=%d copy-image=%d\n", $parentSetting, $copySetting, $reader->getImageColorspace(), $copy->getImageColorspace());

Копия очищена и явно перенастроена перед новым чтением. Исходный объект сохранил запрос YCbCr; его изображение преобразовано отдельно. Последняя панель соответствует обычному sRGB-чтению. Изменение копии не является настройкой всего приложения. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-reader-copy.png
cloned-reader-back.png
cloned-default.png
parent-setting=27 copy-setting=23 parent-image=23 copy-image=23
Imagick::setColorspaceЗадаёт настройку этого объекта, которую конкретный декодер может использовать при следующем чтении.

PECL imagick 3 · imagick

Imagick::setColorspace(int $COLORSPACE): bool

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$reader = new Imagick();
$ok = $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/source.jpg');

YCbCr хранит яркостную компоненту Y и две цветоразностные Cb/Cr; эти три значения нельзя читать как красный, зелёный и синий. __DIR__ — папка программы, . соединяет строки пути, кавычки выделяют текст. Устанавливаем запрос до чтения: JPEG-декодер этой сборки его использует. После загрузки для обычного просмотра явно вызываем transformImageColorspace(SRGB). Другие декодеры могут не использовать эту настройку: наш PNG-контроль остался sRGB.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

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

Imagick::setColorspace(int $COLORSPACE): bool
ПараметрСмысл
$COLORSPACEОбязательный int: именованная константа COLORSPACE_*. В текущей Reflection имя аргумента colorspace; официальный вариант $COLORSPACE сохранён. Примеры позиционные. Это код выбора, а не сила эффекта, процент или значение компоненты.

Sets the global colorspace value for the object. [imagick.method.available.0x657] Доступность: PECL imagick 3. Возврат: Returns true on success. В этих трёх XML нет исходных примеров и таблиц изменений; отсутствие примера не заменяем вымышленным официальным кодом. Весь XML сохранён ниже.

Официальная сущность imagick.method.available.0x657 означает: метод доступен, когда Imagick собран с ImageMagick 6.5.7 или новее. Global в описании — настройка именно этого объекта Imagick для будущих операций, а не всех объектов и не всего PHP-приложения. В проверенной Imagick 3.8.1 оба метода работают до загрузки изображения. Getter возвращает int из настройки; setter присваивает её и возвращает bool. Для текущего изображения существует отдельный getImageColorspace.

Официальный XML перечисляет ImagickException. При этом проверенная PHP-реализация данного метода прямо возвращает bool внутреннего вызова и не преобразует false в исключение. Сам внутренний вызов сохраняет код без проверки разрешённого списка. Поэтому проверяем возвращённый статус и используем известные именованные константы; разрешённый список для внешнего ввода — политика приложения. Ошибка последующего readImage является отдельной ошибкой чтения. Смена запроса после readImage не перерабатывает уже прочитанный JPEG.

Проверено в PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Не выводим из true успешную запись PNG или правильность цветопередачи. writeImage — отдельная операция. У преобразования цвета и кодировщика могут быть собственные правила: сначала снимаем числовые значения живого изображения, затем отдельно проверяем записанные PNG. RGB в этом уроке — линейный, sRGB — нелинейная передача; это не взаимозаменяемые надписи. Alpha описывает прозрачность, а не пространство цвета. Наши RGB↔sRGB метки и преобразование RGBA→GRAY проверены с сохранением alpha; ICC-профили, CMYK, PDF/EPS и печать не сертифицируются этими программами.

Весь официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setcolorspace">
 <refnamediv>
  <refname>Imagick::setColorspace</refname>
  <refpurpose>Set colorspace</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setColorspace</methodname>
   <methodparam><type>int</type><parameter>COLORSPACE</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the global colorspace value for the object.
   &imagick.method.available.0x657;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>COLORSPACE</parameter></term>
     <listitem>
      <para>
       One of the <link linkend="imagick.constants.colorspace">COLORSPACE constants</link>
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Запросить YCbCr до чтения и вернуть полезный sRGB/GRAY результат

До отображения снимаем числовую пробу Y/Cb/Cr в точке (80,88), затем явно преобразуем изображение в sRGB. Эти три числа не являются RGB-цветом. Отдельная серая производная нужна для макета без цвета; исходный JPEG не перекодируется.

Запросить YCbCr до чтения и вернуть полезный sRGB/GRAY результатПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick();
if (!$reader->setColorspace(Imagick::COLORSPACE_YCBCR)) { throw new RuntimeException('Reader setting failed'); }
$reader->readImage(__DIR__ . '/source.jpg');
$triplet = $reader->exportImagePixels(80, 88, 1, 1, 'RGB', Imagick::PIXEL_DOUBLE);
$decodedSpace = $reader->getImageColorspace();
$reader->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$gray = clone $reader; $gray->transformImageColorspace(Imagick::COLORSPACE_GRAY);
saveColorspacePNG($reader, 'requested-back.png'); saveColorspacePNG($gray, 'requested-gray.png');
saveColorspaceComparison([$source, $reader, $gray], 'colorspace-requested-reader.png');
echo "colorspace-requested-reader.png\nrequested-back.png\nrequested-gray.png\n";
printf("decoded=%d Y=%.6f Cb=%.6f Cr=%.6f; displayed=%d\n", $decodedSpace, $triplet[0], $triplet[1], $triplet[2], $reader->getImageColorspace());

До отображения снимаем числовую пробу Y/Cb/Cr в точке (80,88), затем явно преобразуем изображение в sRGB. Эти три числа не являются RGB-цветом. Отдельная серая производная нужна для макета без цвета; исходный JPEG не перекодируется. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-requested-reader.png
requested-back.png
requested-gray.png
decoded=27 Y=0.960784 Cb=0.427451 Cr=0.556863; displayed=23

Проверить границу JPEG-настройки на PNG-наклейке

Запрос YCbCr остался настройкой, но PNG прочитан как sRGB с исходной RGBA. После настоящего преобразования серые значения изменились, alpha сохранилась. Белая подложка есть только в картинке просмотра; png-gray.png хранит прозрачность.

Проверить границу JPEG-настройки на PNG-наклейкеПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$reader = new Imagick(); $reader->setColorspace(Imagick::COLORSPACE_YCBCR);
$reader->readImage(__DIR__ . '/product.png');
$same = colorspaceRawHash($reader) === colorspaceRawHash($product);
$pngSpace = $reader->getImageColorspace();
$gray = clone $reader; $gray->transformImageColorspace(Imagick::COLORSPACE_GRAY);
$white = colorspacePreview($reader, 'white'); $grayWhite = colorspacePreview($gray, 'white');
saveColorspacePNG($reader, 'png-unchanged.png', true); saveColorspacePNG($gray, 'png-gray.png', true);
saveColorspacePNG($grayWhite, 'png-gray-white.png');
saveColorspaceComparison([$source, $white, $grayWhite], 'colorspace-png-boundary.png');
echo "colorspace-png-boundary.png\npng-unchanged.png\npng-gray.png\npng-gray-white.png\n";
printf("requested=%d PNG-image=%d raw-same=%d alpha-retained=%d\n", $reader->getColorspace(), $pngSpace, (int)$same, (int)($reader->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)===$gray->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)));

Запрос YCbCr остался настройкой, но PNG прочитан как sRGB с исходной RGBA. После настоящего преобразования серые значения изменились, alpha сохранилась. Белая подложка есть только в картинке просмотра; png-gray.png хранит прозрачность. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-png-boundary.png
png-unchanged.png
png-gray.png
png-gray-white.png
requested=27 PNG-image=23 raw-same=1 alpha-retained=1
Imagick::setImageColorspaceНазначает интерпретацию компонент текущему изображению; не заменяет преобразование существующего изображения.

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageColorspace(int $colorspace): bool

Самая маленькая запись

RGB — красная, зелёная и синяя компоненты пикселя; RGBA добавляет alpha, где 0 — прозрачный, 1 — непрозрачный. Цветовое пространство задаёт смысл чисел. $reader — имя переменной; $ начинает имя, = присваивает результат, -> вызывает метод объекта, () содержит аргументы, ; завершает инструкцию. Imagick:: выбирает именованную константу класса. Константа — целый код выбора, не цвет и не процент.

$ok = $image->setImageColorspace(Imagick::COLORSPACE_SRGB);

$image уже содержит данные, смысл которых нам известен. Метод возвращает bool true при успехе, а не новую картинку. Если это заведомо sRGB-числа с ошибочной меткой, назначение исправляет обозначение. Для реального изменения существующего цвета используем transformImageColorspace, см. преобразование цветового пространства. Не назначайте SRGB чужому CMYK-файлу ради прохождения проверки формата.

clone создаёт независимую рабочую копию; clear освобождает изображения объекта. Перед повторным чтением в примере копия явно перенастроена. if проверяет условие, ! отрицает, throw new RuntimeException останавливает программу при отказе. echo выводит текст, "\n" — новая строка; printf подставляет %d как int, %.6f как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

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

Imagick::setImageColorspace(int $colorspace): bool
ПараметрСмысл
$colorspaceОбязательный int, именованная константа COLORSPACE_*. Для известного sRGB используем SRGB; RGB в этой сборке обозначает линейный RGB. Назначение неправильной метки не исправляет числа.

Sets the image colorspace. This method should be used when creating new images. To change the colorspace of an existing image, you should use Imagick::transformImageColorspace . Доступность: PECL imagick 2, PECL imagick 3. Возврат: Returns true on success. В этих трёх XML нет исходных примеров и таблиц изменений; отсутствие примера не заменяем вымышленным официальным кодом. Весь XML сохранён ниже.

Официальная рекомендация: применять при создании новых изображений, а для изменения существующего использовать transformImageColorspace. В этой сборке назначение RGB вместо sRGB сохранило числовые RGB/RGBA, изменив интерпретацию и gamma — метаданные передачи яркости. Поле gamma=1.0 сопровождает линейный RGB; sRGB имеет составное правило передачи, а не одну универсальную степень 2.2. Это ограниченный факт: для других пространств библиотека также синхронизирует каналы, меняет тип и цветовые метаданные. Универсального обещания неизменности пикселей для GRAY/CMYK нет. Пустой объект в проверке даёт ImagickException; отказ внутреннего вызова также преобразуется PHP-обёрткой в это исключение. Неизвестный int не проверяется как разрешённая константа за приложение.

Проверено в PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16. Не выводим из true успешную запись PNG или правильность цветопередачи. writeImage — отдельная операция. У преобразования цвета и кодировщика могут быть собственные правила: сначала снимаем числовые значения живого изображения, затем отдельно проверяем записанные PNG. RGB в этом уроке — линейный, sRGB — нелинейная передача; это не взаимозаменяемые надписи. Alpha описывает прозрачность, а не пространство цвета. Наши RGB↔sRGB метки и преобразование RGBA→GRAY проверены с сохранением alpha; ICC-профили, CMYK, PDF/EPS и печать не сертифицируются этими программами.

Весь официальный XML
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagecolorspace">
 <refnamediv>
  <refname>Imagick::setImageColorspace</refname>
  <refpurpose>Sets the image colorspace</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageColorspace</methodname>
   <methodparam><type>int</type><parameter>colorspace</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image colorspace. This method should be used when creating new images. To change the colorspace of an existing image, you should use <methodname>Imagick::transformImageColorspace</methodname>.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>colorspace</parameter></term>
     <listitem>
      <para>
        One of the <link linkend="imagick.constants.colorspace">COLORSPACE constants</link>
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </para>
 </refsect1>

 <refsect1 role="errors">
  &reftitle.errors;
  <para>
   &imagick.imagick.throws;
  </para>
 </refsect1>

</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->

Показать цену ошибочного назначения линейного RGB обычному sRGB

setImageColorspace(RGB) сохранил числа этой RGB-пробы, но объявил их линейными. Следующее реальное преобразование в sRGB сделало картинку светлее. Это диагностический контрпример: менять метку известного sRGB ради слова RGB не нужно.

Показать цену ошибочного назначения линейного RGB обычному sRGBПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$tagged = clone $source; $before = colorspaceRawHash($tagged);
if (!$tagged->setImageColorspace(Imagick::COLORSPACE_RGB)) { throw new RuntimeException('Image tag failed'); }
$same = $before === colorspaceRawHash($tagged); $tagSpace = $tagged->getImageColorspace();
$displayed = clone $tagged; $displayed->transformImageColorspace(Imagick::COLORSPACE_SRGB);
saveColorspacePNG($displayed, 'tag-linear-preview.png');
saveColorspaceComparison([$source, $displayed], 'colorspace-tag-consequence.png');
echo "colorspace-tag-consequence.png\ntag-linear-preview.png\n";
printf("tag=%d numeric-same=%d gamma=%.1f; converted=%d\n", $tagSpace, (int)$same, $tagged->getImageGamma(), $displayed->getImageColorspace());

setImageColorspace(RGB) сохранил числа этой RGB-пробы, но объявил их линейными. Следующее реальное преобразование в sRGB сделало картинку светлее. Это диагностический контрпример: менять метку известного sRGB ради слова RGB не нужно. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-tag-consequence.png
tag-linear-preview.png
tag=21 numeric-same=1 gamma=1.0; converted=23

Исправить только заведомо ошибочную метку собственного RGBA-входа

Мы сами испортили только обозначение собственного sRGB-источника, поэтому можем вернуть правильную метку без преобразования чисел. tag-repaired.png полностью равен входной наклейке по декодированным значениям RGBA; одинаковые PNG-байты не обещаем. Это решение для известного происхождения, а не угадывание пространства чужого CMYK/ICC-файла.

Исправить только заведомо ошибочную метку собственного RGBA-входаПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__ . '/colorspace-fixture.php';
restoreColorspaceInputs();
$source = new Imagick(__DIR__ . '/source.jpg');
$product = new Imagick(__DIR__ . '/product.png');
$mislabeled = clone $product;
$mislabeled->setImageColorspace(Imagick::COLORSPACE_RGB);
$wrong = clone $mislabeled; $wrong->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$repaired = clone $mislabeled;
if (!$repaired->setImageColorspace(Imagick::COLORSPACE_SRGB)) { throw new RuntimeException('Known tag repair failed'); }
$exact = colorspaceRawHash($repaired) === colorspaceRawHash($product);
$white = colorspacePreview($product, 'white'); $wrongWhite = colorspacePreview($wrong, 'white'); $repairedWhite = colorspacePreview($repaired, 'white');
saveColorspacePNG($wrong, 'tag-wrong.png', true); saveColorspacePNG($repaired, 'tag-repaired.png', true);
saveColorspacePNG($wrongWhite, 'tag-wrong-white.png'); saveColorspacePNG($repairedWhite, 'tag-repaired-white.png');
saveColorspaceComparison([$source, $wrongWhite, $repairedWhite], 'colorspace-known-tag-repair.png');
echo "colorspace-known-tag-repair.png\ntag-wrong.png\ntag-repaired.png\ntag-wrong-white.png\ntag-repaired-white.png\n";
printf("known-sRGB repair-exact=%d alpha-exact=%d repaired-space=%d\n", (int)$exact, (int)($product->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)===$repaired->exportImagePixels(0,0,400,320,'A',Imagick::PIXEL_DOUBLE)), $repaired->getImageColorspace());

Мы сами испортили только обозначение собственного sRGB-источника, поэтому можем вернуть правильную метку без преобразования чисел. tag-repaired.png полностью равен входной наклейке по декодированным значениям RGBA; одинаковые PNG-байты не обещаем. Это решение для известного происхождения, а не угадывание пространства чужого CMYK/ICC-файла. Запуск: сохраните example.php, colorspace-fixture.php, source.jpg.b64 и product.png.b64 в одной папке; оставьте также прочие файлы ZIP. Команда php example.php требует Imagick с JPEG/PNG. Helper восстанавливает оба входа по точным байтам; целевые три метода вызываются открыто в программе. Выходные PNG создаются при запуске, сеть и шрифты не нужны.

Ожидаемый вывод
colorspace-known-tag-repair.png
tag-wrong.png
tag-repaired.png
tag-wrong-white.png
tag-repaired-white.png
known-sRGB repair-exact=1 alpha-exact=1 repaired-space=23
Источники и обсуждения

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

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

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

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