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

Дерево руководства
Глава 368 · После объектов, пикселей и файлов
Imagick: запрос декодеру, метка и преобразование цвета
Получить серый PNG каталога, увидеть реальное YCbCr-чтение JPEG и не перепутать настройки объекта с преобразованием цвета.
Получить полезную серую версию и увидеть отличие
Нужны цветная карточка каталога и отдельная серая версия для макета. Обычный JPEG открывается в sRGB, а просьба «сделать GRAY» через похожий setter не обязательно пересчитывает его цвета. Получим самостоятельный first-gray.png, сохранив исходный JPEG; затем разберём, где настройка чтения, где обозначение изображения и где настоящая обработка чисел.
Надписи RGB и «Q16 внутри, PNG8 на диске» унаследованы от собственного исходного рисунка и остаются пикселями внутри JPEG. Это не автоматические метаданные текущего JPEG или PNG просмотра. Q16 означает внутренний 16-битный диапазон компоненты проверенной сборки, PNG8 в старой надписи — 8 бит на компоненту, а не индексированный PNG. Фактический формат определяют байты файла и его повторное чтение.


| Понятие до схемы | Значение в этих примерах |
|---|---|
| RGB / RGBA / alpha | RGB — красная, зелёная и синяя компоненты. RGBA добавляет alpha: 0 прозрачно, 1 непрозрачно. Отдельный собственный PNG имеет отверстия и полупрозрачные края. |
| Цветовое пространство | Правило, по которому числа компонент означают цвет. Здесь sRGB — обычное нелинейное представление; RGB означает линейное. Одинаковые числа с разными правилами могут дать разный вид. |
| YCbCr / GRAY | YCbCr — яркостная 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 не означает, что прозрачность удалена из самостоятельного файла. |

Самая маленькая запись
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 результата. Значения не обозначают качество. Цветной исходник сохранён отдельно и не перезаписан.
<?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.
<?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 как число с шестью знаками после точки. Основы: объекты и методы, файлы и пути, обработка отказов.

Запросить YCbCr до чтения и вернуть полезный sRGB/GRAY результат
До отображения снимаем числовую пробу Y/Cb/Cr в точке (80,88), затем явно преобразуем изображение в sRGB. Эти три числа не являются RGB-цветом. Отдельная серая производная нужна для макета без цвета; исходный 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();
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 хранит прозрачность.
<?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 не нужно.
<?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-файла.
<?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-пакетом не проверяются. |
Выбрать нужный уровень настройки по своей задаче

Упражнение: нужен серый 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.
<?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 не перекодируется.
<?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 хранит прозрачность.
<?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 не нужно.
<?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-файла.
<?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
Источники и обсуждения
- Imagick::getColorspace
- Imagick::setColorspace
- Imagick::setImageColorspace
- Imagick 3.8.1 imagick_class.c
- Imagick 3.8.1 imagick_helpers.c
- ImageMagick 7.1.1-46 MagickWand/magick-image.c
- ImageMagick 7.1.1-46 MagickWand/magick-property.c
- ImageMagick 7.1.1-46 MagickCore/colorspace.c
- ImageMagick 7.1.1-46 coders/jpeg.c
- ImageMagick 7.1.1-46 coders/png.c
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


