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

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

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

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

Глава 390 · После объектов, массивов и основ изображения; цветовые метаданные

Imagick: прочитать первичные цвета, построить xy-график и проверить метаданные

Шесть getter/setter первичных точек: понятный координатный отчёт, версия x/y/z, неизменные RGB, ICC-граница и реальное сохранение PNG/MIFF.

Получить полезный координатный отчёт, прежде чем менять цвета

В каталоге товарная картинка выглядит по-разному после обработки. Прежде чем менять её цвет, полезно получить понятный отчёт: какие первичные точки записаны, есть ли ICC и менялись ли сами RGB-числа. Здесь работаем со своим известным sRGB-рисунком коробки и кружки 400 × 320. Получим таблицу координат и настоящий xy-график; картинка товара останется прежней. Такой отчёт помогает отличить описание цвета от операции над пикселями.

Собственный исходник и настоящий PHP xy-график его R/G/B-координат; график показывает метаданные, а не перекрашенный результат
Собственный исходник и настоящий PHP xy-график его R/G/B-координат; график показывает метаданные, а не перекрашенный результат
$red = $image->getImageRedPrimary();
echo $red['x']; // для нашего входа 0.64

$image — уже открытое изображение. Стрелка -> вызывает его метод; пустые скобки означают отсутствие входных аргументов. Знак = сохраняет вернувшийся массив в $red, а ['x'] выбирает значение по строковому ключу. Точка с запятой завершает инструкцию. Число .64 относится к первичному красному цвету в описании всего изображения, а не к яркости красного пикселя. Следующая полная программа открывает объявленный вход и сохраняет видимый график.

Получить координатный отчёт о знакомом PNG и построить xy-треугольник

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах.

Получить координатный отчёт о знакомом PNG и построить xy-треугольникПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);
$images=['source'=>cpImage($image,'source-preview8.png'),'chart'=>cpImage($chart,'first-chart8.png')];
$rects=cpCompare([$image,$chart],'color-primaries-first.png');
cpDiagnostic('color-primaries-first',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>$images,'chart_basis'=>['x_origin'=>50,'y_origin'=>280,'x_scale'=>375,'y_scale'=>300,'coordinate_units'=>'CIE xy chromaticity, dimensionless'],
    'panel_keys'=>['source','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['red_xy'=>cpClose($red['x'],.64)&&cpClose($red['y'],.33),'green_xy'=>cpClose($green['x'],.30)&&cpClose($green['y'],.60),
        'blue_xy'=>cpClose($blue['x'],.15)&&cpClose($blue['y'],.06),'IM7_three_components'=>array_keys($red)===['x','y','z'],
        'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-first.png\nsource-preview8.png\nfirst-chart8.png\nmetrics.json\nred=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1\n";

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-first.png
source-preview8.png
first-chart8.png
metrics.json
red=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1

Наш точный PNG содержит cHRM с этими координатами, а ICC-профиля в нём нет. Это известный собственный вход; один getter чужого файла сам по себе не подтверждает происхождение или верность его описания. Оси x/y на графике безразмерны. Три точки соединены для удобства сопоставления; цветные подписи R/G/B лишь различают вершины. Это не карта всех видимых цветов, не измерение охвата конкретного монитора и не доказательство корректности файла. Здесь нет подковы спектра или преобразования RGB→XYZ каждого пикселя. Читаем именно сохранённые атрибуты. Массивы и пиксельные значения объясняют два разных вида данных.

Различить цветность, RGB-компоненты и ICC-профиль

Путь данных: getter возвращает координаты для xy-графика; setter меняет поля описания, а RGB-пиксели сохраняются
Путь данных: getter возвращает координаты для xy-графика; setter меняет поля описания, а RGB-пиксели сохраняются

У изображения есть отдельно массив пикселей и описание того, как понимать их цвет. Первичные точки задают CIE-цветности базовых R,G,B. Координаты x/y не измеряются в пикселях, процентах или байтах: это отношения тристимульных величин. Для нормированных точек x+y+z=1; y здесь не равна яркостной величине Y. Для sRGB стандартные xy: R(.640,.330), G(.300,.600), B(.150,.060). Белая точка и функция передачи — отдельные характеристики; белую точку в этом этапе не меняем.

На уровне проверенного IM7 Wand setter присваивает только три поля chromaticity выбранной первичной точки. Он не вызывает ICC-преобразование, не меняет RGB-компоненты и не переписывает вложенный ICC. Поэтому одинаковые рисунки до/после — ожидаемый полезный результат: это контроль отсутствия случайного преобразования. Для сравнения используем одинаковые RGB8-копии без профилей и цветовых chunks; настоящие tagged PNG/MIFF храним отдельно. Цветоуправляемый браузер может по-разному показывать файлы с разными описаниями даже при одинаковых RGB; наш общий просмотр не обещает одинаковость всех приложений.

ДанныеЧто показано здесьЧто этим не доказано
Getter x/y/zПоля объекта и координатный отчётЧто поля верно описывают неизвестную фотографию.
RGB16-хешРавенство всех RGB-компонент конкретных объектовРавенство файлов или внешнего вида во всех просмотрщиках.
ICC SHAБайты вложенного профиля не изменилисьСогласованность произвольно изменённых primary-полей с профилем.
Readback PNG/MIFFЧто реально прочитано после сохраненияПереносимость произвольного z между кодерами.

Разобрать короткие getter/setter и два самостоятельных запуска

Три setter записывают известные точки на копии: общий RGB8-просмотр до и после одинаков
Три setter записывают известные точки на копии: общий RGB8-просмотр до и после одинаков
$red = $image->getImageRedPrimary();
$green = $image->getImageGreenPrimary();
$blue = $image->getImageBluePrimary();

Имена red/green/blue выбирают одну из трёх первичных точек. Каждый getter вызывается без аргументов и возвращает свой массив. В проверенном IM7 в каждом есть x,y,z; в IM6 — x,y. printf в самостоятельном примере форматирует числа до трёх знаков после точки: это оформление отчёта, не округление сохранённых метаданных.

Прочитать три массива без аргументов и выбрать x/y/z по ключу

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки.

Прочитать три массива без аргументов и выбрать x/y/z по ключуПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);$result=cpImage($chart,'getter-chart8.png');
cpCompare([$chart],'color-primaries-get-minimal.png');
cpDiagnostic('color-primaries-get-minimal',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>['chart'=>$result],'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['all_three_arrays'=>count($red)===3&&count($green)===3&&count($blue)===3,
        'source_preserved'=>cpState($image)===$sourceState,'known_normalized_points'=>cpClose(array_sum($red),1)&&cpClose(array_sum($green),1)&&cpClose(array_sum($blue),1)]]);
echo "color-primaries-get-minimal.png\ngetter-chart8.png\nmetrics.json\n";
printf("R x=%.3f y=%.3f z=%.3f\nG x=%.3f y=%.3f z=%.3f\nB x=%.3f y=%.3f z=%.3f\n",$red['x'],$red['y'],$red['z'],$green['x'],$green['y'],$green['z'],$blue['x'],$blue['y'],$blue['z']);

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-get-minimal.png
getter-chart8.png
metrics.json
R x=0.640 y=0.330 z=0.030
G x=0.300 y=0.600 z=0.100
B x=0.150 y=0.060 z=0.790
$declared = clone $image;
$ok = $declared->setImageRedPrimary(0.64, 0.33, 0.03);

Clone создаёт независимую копию для декларации; исходник остаётся отдельно. Три float внутри скобок — x,y,z именно в IM7-binding. Переменная $ok получает true при успешной записи. Это не новый Imagick и не число изменённых пикселей. В полной программе аналогично задаются зелёная и синяя точки. Мы знаем происхождение входа и используем стандартные sRGB-значения; при неизвестном профиле сначала выясняют происхождение, а не угадывают треугольник.

Объявить известные первичные точки на копии и проверить отсутствие преобразования

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку.

Объявить известные первичные точки на копии и проверить отсутствие преобразованияПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$declared=clone $image;
$returned['red']=$declared->setImageRedPrimary(0.64,0.33,0.03);
$returned['green']=$declared->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$declared->setImageBluePrimary(0.15,0.06,0.79);
$after=cpState($declared);
$images=['before'=>cpImage($image,'setter-before8.png'),'after'=>cpImage($declared,'setter-after8.png')];
$rects=cpCompare([$image,$declared],'color-primaries-set-minimal.png');
cpDiagnostic('color-primaries-set-minimal',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary'],
    'returned'=>$returned,'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['three_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
        'RGB_not_converted'=>$sourceState['RGB16_sha256']===$after['RGB16_sha256'],'ICC_not_created'=>$after['icc_sha256']===null,
        'red_declared'=>cpClose($after['primaries']['red']['z'],.03),'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-set-minimal.png\nsetter-before8.png\nsetter-after8.png\nmetrics.json\nsetters=3 true=3 RGB-unchanged=1 ICC-created=0\n";

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-set-minimal.png
setter-before8.png
setter-after8.png
metrics.json
setters=3 true=3 RGB-unchanged=1 ICC-created=0

Официальные XML setters показывают два аргумента, а фактический IM7 требует три. Это различие объяснено в каждой полной карточке ниже. Не удаляйте третий аргумент, ориентируясь только на короткую веб-сигнатуру. Копирование, измерение RGB и clone выполняют разные задачи.

Проверить сохранение, ICC-границу и прикладную политику

Реальные readback PNG/MIFF и ICC-граница: изменённые координаты не означают преобразованные RGB
Реальные readback PNG/MIFF и ICC-граница: изменённые координаты не означают преобразованные RGB

Теперь требование меняется: отчёт нужен после сохранения файла. Принятое значение в RAM не равно обещанию, что формат сохранит все поля. PNG cHRM содержит восемь чисел x/y: белую точку и три первичные точки, каждое с шагом 1/100000. Отдельного z там нет. В следующей программе намеренно записано ненормированное z=.123, чтобы увидеть границу, а не использовать такое описание в рабочем каталоге.

Проверить, что RAM и сохранённый PNG/MIFF — разные контракты

В объекте принято z=.123 при x=.64,y=.33. После реальной записи и открытия оба исследованных формата дали z=.03, сохранив RGB. Это наблюдение текущих кодеров, а не обещание переносимости произвольного z или правило его восстановления для всех файлов.

Проверить, что RAM и сохранённый PNG/MIFF — разные контрактыПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$declared=clone $image;
$declared->setImageRedPrimary(0.64,0.33,0.03);
$declared->setImageGreenPrimary(0.30,0.60,0.10);
$declared->setImageBluePrimary(0.15,0.06,0.79);
$normal=cpState($declared);
$declared->setImageRedPrimary(0.64,0.33,0.123);
$inMemory=cpState($declared);
$saved['PNG']=cpSaveRead($declared,'primary-data.png','png',true);
$saved['MIFF']=cpSaveRead($declared,'primary-data.miff','miff');
$png=new Imagick(__DIR__.'/primary-data.png');$miff=new Imagick(__DIR__.'/primary-data.miff');
$images=['PNG'=>cpImage($png,'serialization-png8.png'),'MIFF'=>cpImage($miff,'serialization-miff8.png')];
$rects=cpCompare([$png,$miff],'color-primaries-serialization.png');
cpDiagnostic('color-primaries-serialization',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary','getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'normal'=>$normal,'in_memory'=>$inMemory,'saved'=>$saved,'images'=>$images,'panel_keys'=>['PNG','MIFF'],'panel_geometry'=>$rects,
    'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['RAM_accepts_non_normalized_z'=>cpClose($inMemory['primaries']['red']['z'],.123),
        'observed_PNG_z_not_preserved'=>cpClose($saved['PNG']['state']['primaries']['red']['z'],.03),
        'observed_MIFF_z_not_preserved'=>cpClose($saved['MIFF']['state']['primaries']['red']['z'],.03),
        'both_RGB_preserved'=>$saved['PNG']['state']['RGB16_sha256']===$sourceState['RGB16_sha256']&&$saved['MIFF']['state']['RGB16_sha256']===$sourceState['RGB16_sha256'],
        'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-serialization.png\nserialization-png8.png\nserialization-miff8.png\nprimary-data.png\nprimary-data.miff\nmetrics.json\nred-z RAM=0.123 PNG=0.030 MIFF=0.030 RGB-unchanged=1\n";

В объекте принято z=.123 при x=.64,y=.33. После реальной записи и открытия оба исследованных формата дали z=.03, сохранив RGB. Это наблюдение текущих кодеров, а не обещание переносимости произвольного z или правило его восстановления для всех файлов. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-serialization.png
serialization-png8.png
serialization-miff8.png
primary-data.png
primary-data.miff
metrics.json
red-z RAM=0.123 PNG=0.030 MIFF=0.030 RGB-unchanged=1

В проверенной сборке RAM сохранила .123, но прочитанные PNG и MIFF вернули .03. RGB при этом совпал. Не обобщайте это в правило «формат вычисляет z=1−x−y»: другой реальный контрпример ниже даёт x=.66,y=.32,z=.03 после PNG, тогда как 1−x−y=.02. Сериализация зависит от кодера и взаимодействующих метаданных. Настройки cHRM/sRGB/iCCP в эксперименте относятся к отдельному диагностическому PNG, а не являются рецептом удалить чужой профиль.

Для ICC-границы берём публично распространяемый CC0 sRGB-профиль и присоединяем его к нашему известному sRGB-входу. Первое присоединение профиля к ранее непрофилированному входу здесь является описанием известных данных, не новым цветовым преобразованием. Затем намеренно задаём R(.66,.32,.02) на экспериментальной копии. Это демонстрация возможной несогласованности: не публикуйте такую копию как исправленный sRGB-файл.

Сверить ICC-границу, политику координат и восемь реальных отказов

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены.

Сверить ICC-границу, политику координат и восемь реальных отказовПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$profiled=clone $image;
$profiled->profileImage('icc',(string)file_get_contents(__DIR__.'/target-srgb.icc'));
$profileBefore=cpState($profiled);$beforeView=clone $profiled;
$returned['red']=$profiled->setImageRedPrimary(0.66,0.32,0.02);
$returned['green']=$profiled->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$profiled->setImageBluePrimary(0.15,0.06,0.79);
$red=$profiled->getImageRedPrimary();$green=$profiled->getImageGreenPrimary();$blue=$profiled->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];$after=cpState($profiled);
$saved=cpSaveRead($profiled,'profiled-data.png','png');
$chart=cpChart($points);
$images=['before'=>cpImage($beforeView,'workflow-before8.png'),'after'=>cpImage($profiled,'workflow-after8.png'),'chart'=>cpImage($chart,'workflow-chart8.png')];
$rects=cpCompare([$beforeView,$profiled,$chart],'color-primaries-workflow.png');
$unchecked=clone $image;$uncheckedReturned=$unchecked->setImageGreenPrimary(-0.2,1.4,9.0);$uncheckedState=cpState($unchecked);
$policyError=cpTry(fn()=>cpValidate(['x'=>-.2,'y'=>1.4,'z'=>9.0]));
$errors['missing_z']=cpTry(fn()=>(clone $image)->setImageBluePrimary(.15,.06));
$errors['bad_type']=cpTry(fn()=>(clone $image)->setImageRedPrimary('not-a-coordinate',.33,.03));
foreach(['getImageRedPrimary'=>[],'getImageGreenPrimary'=>[],'getImageBluePrimary'=>[],'setImageRedPrimary'=>[.64,.33,.03],'setImageGreenPrimary'=>[.3,.6,.1],'setImageBluePrimary'=>[.15,.06,.79]] as $method=>$args){
    $empty=new Imagick();$errors['empty_'.$method]=cpTry(fn()=>$empty->$method(...$args));
}
$checks=['setters_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
    'RGB_not_converted'=>$profileBefore['RGB16_sha256']===$after['RGB16_sha256'],
    'ICC_bytes_unchanged'=>$profileBefore['icc_sha256']===$after['icc_sha256']&&$after['icc_sha256']!==null,
    'profiled_PNG_RGB_ICC_preserved'=>$saved['state']['RGB16_sha256']===$after['RGB16_sha256']&&$saved['state']['icc_sha256']===$after['icc_sha256'],
    'observed_profiled_PNG_z'=>cpClose($saved['state']['primaries']['red']['x'],.66)&&cpClose($saved['state']['primaries']['red']['y'],.32)&&cpClose($saved['state']['primaries']['red']['z'],.03),
    'API_accepts_out_of_policy'=>$uncheckedReturned===true&&cpClose($uncheckedState['primaries']['green']['x'],-.2),
    'application_rejects_invalid'=>($policyError['error']['class']??null)==='InvalidArgumentException',
    'source_preserved'=>cpState($image)===$sourceState];
foreach($errors as $name=>$record){$checks['caught_'.$name]=isset($record['error']);}
cpDiagnostic('color-primaries-workflow',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary','getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'returned'=>$returned,'before'=>$profileBefore,'after'=>$after,'points'=>$points,'saved'=>$saved,'images'=>$images,
    'unchecked'=>['returned'=>$uncheckedReturned,'state'=>$uncheckedState],'policy_error'=>$policyError,'errors'=>$errors,
    'panel_keys'=>['before','after','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,'checks'=>$checks]);
echo "color-primaries-workflow.png\nworkflow-before8.png\nworkflow-after8.png\nworkflow-chart8.png\nprofiled-data.png\nmetrics.json\nRGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1\n";

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-workflow.png
workflow-before8.png
workflow-after8.png
workflow-chart8.png
profiled-data.png
metrics.json
RGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1
Реальное наблюдениеПрактический вывод
Setters приняли (-.2,1.4,9) и вернули trueУспех API не заменяет проверку прикладной политики.
Наша cpValidate отвергла эти числаОграничения finite, [0,1], y>0 и сумма1 — собственная политика данного проекта.
Восемь native/PHP-ошибок пойманыШесть пустых объектов: ImagickException; два аргумента в IM7: ArgumentCountError; строка вместо float: TypeError.
ICC и RGB остались теми жеPrimary setter не является преобразованием профиля.
Сохранённый profiled PNG дал R(.66,.32,.03)Проверяйте реальный readback, не предсказывайте z по общей формуле.

CpTry в helper ловит Throwable и сохраняет класс/сообщение; это аппарат демонстрации ошибок, а не необходимое условие простого чтения координат. Для чужих файлов дополнительно ограничивают допустимые размеры и форматы по задаче. Чтение метаданных относительно дёшево, но экспорт всех RGB для учебной проверки и построение графика требуют памяти/работы по размеру изображения. Не копируйте полный пиксельный аудит в каждый запрос каталога без необходимости.

Сохранить полные шесть контрактов и выбрать следующий шаг

Назначение, параметры, результат и версия binding

Imagick::getImageRedPrimary(): array

Метод без аргументов читает координаты красной первичной точки текущего изображения. Возвращается ассоциативный массив: в официальном базовом описании ключи x и y, в проверенной IM7-ветке — x,y,z. В точном IM6-binding остаются x,y. Метод не возвращает ImagickPixel, координаты пикселя или яркости каналов и не изменяет картинку.

РезультатСмысл
x и yБезразмерные CIE-координаты первичного цвета, общий атрибут текущего изображения.
zПрисутствует в IM7. Не считайте его переносимым произвольным полем файла: в наблюдении z=.123 в RAM превратился в .03 при PNG/MIFF-readback.
ОшибкиПолный официальный контракт указывает ImagickException; пустой объект действительно даёт «Can not process empty Imagick object».

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimageredprimary">
 <refnamediv>
  <refname>Imagick::getImageRedPrimary</refname>
  <refpurpose>Returns the chromaticity red primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageRedPrimary</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity red primary point as an array with the keys "x" and "y".
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
    Returns the chromaticity red primary point as an array with the keys "x"
    and "y".
    &imagick.imagickexception.throw;
  </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
-->

Назначение, параметры, результат и версия binding

Imagick::setImageRedPrimary(float $x, float $y): bool

Метод задаёт координаты красной первичной точки в метаданных текущего изображения. Официальная базовая запись выше содержит два обязательных float: x и y. Но фактическая сигнатура зависит от библиотеки, с которой собран Imagick: ветка IM6 принимает x,y, а проверенная IM7 — три обязательных float x,y,z. Это проверено по точному C/stub Imagick 3.8.1 и реальному вызову. В IM7 вызов с двумя числами даёт ArgumentCountError. Не определяйте эту разницу только по номеру PHP или названию расширения.

Imagick::setImageRedPrimary(float $x, float $y, float $z): bool // binding IM7
ВходКак понимать
$xБезразмерная CIE-координата цветности x, не горизонтальная координата пикселя.
$yБезразмерная CIE-координата цветности y, не яркость Y и не вертикальная координата пикселя.
$zТретий обязательный аргумент только в ветке IM7. Для наших нормированных известных точек z = 1 − x − y. Это не значение синего канала RGB. Native setter не навязывает нормировку или диапазон.

Возврат bool true означает успешную запись полей, а не выполнение цветового преобразования и не проверку корректности описания. Исследованный Wand просто присваивает chromaticity.red_primary.x/y/z: RGB и содержимое ICC не пересчитываются. Работа ведётся над текущим кадром; clone позволяет оставить вход отдельно. Наша политика конечных нормированных координат не является встроенной проверкой API.

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageredprimary">
 <refnamediv>
  <refname>Imagick::setImageRedPrimary</refname>
  <refpurpose>Sets the image chromaticity red primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageRedPrimary</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity red primary point.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      </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
-->

Назначение, параметры, результат и версия binding

Imagick::getImageGreenPrimary(): array

Метод без аргументов читает координаты зелёной первичной точки текущего изображения. Возвращается ассоциативный массив: в официальном базовом описании ключи x и y, в проверенной IM7-ветке — x,y,z. В точном IM6-binding остаются x,y. Метод не возвращает ImagickPixel, координаты пикселя или яркости каналов и не изменяет картинку.

РезультатСмысл
x и yБезразмерные CIE-координаты первичного цвета, общий атрибут текущего изображения.
zПрисутствует в IM7. Не считайте его переносимым произвольным полем файла: в наблюдении z=.123 в RAM превратился в .03 при PNG/MIFF-readback.
ОшибкиПолный официальный контракт указывает ImagickException; пустой объект действительно даёт «Can not process empty Imagick object».

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagegreenprimary">
 <refnamediv>
  <refname>Imagick::getImageGreenPrimary</refname>
  <refpurpose>Returns the chromaticy green primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageGreenPrimary</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity green primary point. Returns an array with the keys "x" and "y".
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns an array with the keys "x" and "y" on success, throws an
   ImagickException on failure.
  </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
-->

Назначение, параметры, результат и версия binding

Imagick::setImageGreenPrimary(float $x, float $y): bool

Метод задаёт координаты зелёной первичной точки в метаданных текущего изображения. Официальная базовая запись выше содержит два обязательных float: x и y. Но фактическая сигнатура зависит от библиотеки, с которой собран Imagick: ветка IM6 принимает x,y, а проверенная IM7 — три обязательных float x,y,z. Это проверено по точному C/stub Imagick 3.8.1 и реальному вызову. В IM7 вызов с двумя числами даёт ArgumentCountError. Не определяйте эту разницу только по номеру PHP или названию расширения.

Imagick::setImageGreenPrimary(float $x, float $y, float $z): bool // binding IM7
ВходКак понимать
$xБезразмерная CIE-координата цветности x, не горизонтальная координата пикселя.
$yБезразмерная CIE-координата цветности y, не яркость Y и не вертикальная координата пикселя.
$zТретий обязательный аргумент только в ветке IM7. Для наших нормированных известных точек z = 1 − x − y. Это не значение синего канала RGB. Native setter не навязывает нормировку или диапазон.

Возврат bool true означает успешную запись полей, а не выполнение цветового преобразования и не проверку корректности описания. Исследованный Wand просто присваивает chromaticity.green_primary.x/y/z: RGB и содержимое ICC не пересчитываются. Работа ведётся над текущим кадром; clone позволяет оставить вход отдельно. Наша политика конечных нормированных координат не является встроенной проверкой API.

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagegreenprimary">
 <refnamediv>
  <refname>Imagick::setImageGreenPrimary</refname>
  <refpurpose>Sets the image chromaticity green primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageGreenPrimary</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity green primary point.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      </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
-->

Назначение, параметры, результат и версия binding

Imagick::getImageBluePrimary(): array

Метод без аргументов читает координаты синей первичной точки текущего изображения. Возвращается ассоциативный массив: в официальном базовом описании ключи x и y, в проверенной IM7-ветке — x,y,z. В точном IM6-binding остаются x,y. Метод не возвращает ImagickPixel, координаты пикселя или яркости каналов и не изменяет картинку.

РезультатСмысл
x и yБезразмерные CIE-координаты первичного цвета, общий атрибут текущего изображения.
zПрисутствует в IM7. Не считайте его переносимым произвольным полем файла: в наблюдении z=.123 в RAM превратился в .03 при PNG/MIFF-readback.
ОшибкиПолный официальный контракт указывает ImagickException; пустой объект действительно даёт «Can not process empty Imagick object».

В полном XML синопсис getter имеет пустой список аргументов, хотя ниже остались пункты x/y. В реальном getter это выходные ключи массива: передавать x/y в скобки не требуется. Исходный XML сохранён целиком; рабочий вызов — $image->getImageBluePrimary().

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimageblueprimary">
 <refnamediv>
  <refname>Imagick::getImageBluePrimary</refname>
  <refpurpose>Returns the chromaticy blue primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageBluePrimary</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity blue primary point for the image.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      The chromaticity blue primary x-point.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      The chromaticity blue primary y-point.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Array consisting of "x" and "y" coordinates of point.
  </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
-->

Назначение, параметры, результат и версия binding

Imagick::setImageBluePrimary(float $x, float $y): bool

Метод задаёт координаты синей первичной точки в метаданных текущего изображения. Официальная базовая запись выше содержит два обязательных float: x и y. Но фактическая сигнатура зависит от библиотеки, с которой собран Imagick: ветка IM6 принимает x,y, а проверенная IM7 — три обязательных float x,y,z. Это проверено по точному C/stub Imagick 3.8.1 и реальному вызову. В IM7 вызов с двумя числами даёт ArgumentCountError. Не определяйте эту разницу только по номеру PHP или названию расширения.

Imagick::setImageBluePrimary(float $x, float $y, float $z): bool // binding IM7
ВходКак понимать
$xБезразмерная CIE-координата цветности x, не горизонтальная координата пикселя.
$yБезразмерная CIE-координата цветности y, не яркость Y и не вертикальная координата пикселя.
$zТретий обязательный аргумент только в ветке IM7. Для наших нормированных известных точек z = 1 − x − y. Это не значение синего канала RGB. Native setter не навязывает нормировку или диапазон.

Возврат bool true означает успешную запись полей, а не выполнение цветового преобразования и не проверку корректности описания. Исследованный Wand просто присваивает chromaticity.blue_primary.x/y/z: RGB и содержимое ICC не пересчитываются. Работа ведётся над текущим кадром; clone позволяет оставить вход отдельно. Наша политика конечных нормированных координат не является встроенной проверкой API.

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageblueprimary">
 <refnamediv>
  <refname>Imagick::setImageBluePrimary</refname>
  <refpurpose>Sets the image chromaticity blue primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageBluePrimary</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity blue primary point.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      </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
-->

Запуск, входы и следующий шаг

Каждый архив самодостаточен. Нужны PHP с Imagick и доступная запись в распакованную папку; запуск: php example.php. Точные версии выполненных примеров: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows. Исходный рисунок собственный; ICC взят из закреплённой CC0-коллекции Compact-ICC-Profiles, Open Sans используется без изменения с Apache 2.0. Лицензии вложены. Эти версии фиксируют наблюдение, а не утверждают, что такая сборка последняя.

Упражнение: коллега изменил primary-поля и говорит, что преобразовал P3 в sRGB. Сначала сравните RGB и ICC до/после, затем настоящий сохранённый файл. Одних setter true и нового треугольника недостаточно. Для нашего известного sRGB-входа ответ прост: координатное описание изменено, RGB и ICC остались прежними; это не ICC-преобразование. Далее пройдите рабочий путь известный исходный ICC → целевой ICC и различие назначения пространства и преобразования.

Полный вспомогательный PHP из каждого самостоятельного архива
<?php
declare(strict_types=1);
function cpRestore():void {
    $hashes=json_decode('{"source.png":"b6af02ed97020582a27e993a1565de41e23ea97ff7be11ac132d68204d56d483","target-srgb.icc":"c56e1685d888f5edb92fe07f2750f387f8fe8e91b32ff8fb0b56bfbbb9458353","font.ttf":"13c03e22a633919beb2847c58c8285fb8a735ee97097d7c48fd403f8294b05f8"}',true,512,JSON_THROW_ON_ERROR);
    foreach($hashes as $filename=>$hash){$raw=base64_decode((string)file_get_contents(__DIR__.'/'.$filename.'.b64'),true);
        if($raw===false||hash('sha256',$raw)!==$hash||file_put_contents(__DIR__.'/'.$filename,$raw)===false){throw new RuntimeException('Fixture missing or changed');}}
}
function cpHash(Imagick $image):string {return hash('sha256',json_encode($image->exportImagePixels(0,0,400,320,'RGB',Imagick::PIXEL_SHORT),JSON_THROW_ON_ERROR));}
function cpPoints(Imagick $image):array {return ['red'=>$image->getImageRedPrimary(),'green'=>$image->getImageGreenPrimary(),'blue'=>$image->getImageBluePrimary()];}
function cpState(Imagick $image):array {
    return ['primaries'=>cpPoints($image),'RGB16_sha256'=>cpHash($image),
        'icc_sha256'=>in_array('icc',$image->getImageProfiles('*',false),true)?hash('sha256',$image->getImageProfile('icc')):null];
}
function cpClose(float $a,float $b):bool {return abs($a-$b)<1.0e-9;}
function cpView(Imagick $image):Imagick {
    $copy=clone $image;$copy->stripImage();$copy->setImageFormat('png');$copy->setImageDepth(8);
    $copy->setOption('png:bit-depth','8');$copy->setOption('png:color-type','2');$copy->setOption('png:exclude-chunk','all');return $copy;
}
function cpSaveView(Imagick $image,string $filename):void {
    if(!cpView($image)->writeImage(__DIR__.'/'.$filename)){throw new RuntimeException('Cannot save display PNG');}
}
function cpImage(Imagick $image,string $filename):array {
    $state=cpState($image);cpSaveView($image,$filename);$read=new Imagick(__DIR__.'/'.$filename);
    return $state+['geometry'=>[$image->getImageWidth(),$image->getImageHeight()],
        'encoded_png'=>['filename'=>$filename,'RGB16_sha256'=>cpHash($read),'primaries'=>cpPoints($read)],
        'display_basis'=>'Stripped RGB8 clone; not the tagged production file'];
}
function cpCompare(array $images,string $filename):array {
    $board=new Imagick();$board->newImage(400*count($images),320,'white','png');$rects=[];
    foreach($images as $i=>$image){$board->compositeImage(cpView($image),Imagick::COMPOSITE_OVER,400*$i,0);$rects[]=['x'=>400*$i,'y'=>0,'width'=>400,'height'=>320];}
    cpSaveView($board,$filename);return $rects;
}
function cpChart(array $points):Imagick {
    $chart=new Imagick();$chart->newImage(400,320,'white','png');$draw=new ImagickDraw();
    $draw->setFont(__DIR__.'/font.ttf');$draw->setFontSize(13);$draw->setStrokeWidth(1);$draw->setFillColor('none');$draw->setStrokeColor('#cddada');
    foreach([0.0,0.2,0.4,0.6,0.8] as $v){$x=50+375*$v;$y=280-300*$v;$draw->line($x,40,$x,280);$draw->line(50,$y,350,$y);}
    $draw->setStrokeColor('#526c70');$draw->line(50,280,350,280);$draw->line(50,280,50,40);
    $draw->setStrokeColor('none');$draw->setFillColor('#24383a');
    foreach([0.0,0.2,0.4,0.6,0.8] as $v){$draw->annotation(50+375*$v-8,300,sprintf('%.1f',$v));$draw->annotation(17,284-300*$v,sprintf('%.1f',$v));}
    $draw->annotation(365,284,'x');$draw->annotation(48,22,'y');$vertices=[];
    foreach($points as $p){$vertices[]=['x'=>50+375*$p['x'],'y'=>280-300*$p['y']];}
    $draw->setFillColor('none');$draw->setStrokeColor('#27696c');$draw->polygon($vertices);
    foreach(array_values($points) as $i=>$p){$v=$vertices[$i];$draw->setFillColor(['#c33131','#287a4b','#345bb8'][$i]);$draw->setStrokeColor('none');$draw->circle($v['x'],$v['y'],$v['x']+4,$v['y']);$draw->annotation($v['x']+7,$v['y']-5,['R','G','B'][$i]);}
    $chart->drawImage($draw);return $chart;
}
function cpSaveRead(Imagick $image,string $filename,string $format,bool $onlyChrm=false):array {
    $copy=clone $image;$copy->setImageFormat($format);
    if($format==='png'){$copy->setImageDepth(8);$copy->setOption('png:bit-depth','8');$copy->setOption('png:color-type','2');}
    if($onlyChrm){$copy->setOption('png:include-chunk','cHRM');$copy->setOption('png:exclude-chunk','sRGB,iCCP');}
    if(!$copy->writeImage(__DIR__.'/'.$filename)){throw new RuntimeException('Cannot save tagged data');}
    $read=new Imagick(__DIR__.'/'.$filename);
    return ['filename'=>$filename,'sha256'=>hash_file('sha256',__DIR__.'/'.$filename),'bytes'=>filesize(__DIR__.'/'.$filename),'state'=>cpState($read)];
}
function cpTry(callable $operation):array {
    try{return ['returned'=>$operation()];}catch(Throwable $e){return ['error'=>['class'=>get_class($e),'message'=>$e->getMessage()]];}
}
function cpValidate(array $point):void {
    foreach(['x','y','z'] as $key){if(!isset($point[$key])||!is_float($point[$key])||!is_finite($point[$key])||$point[$key]<0||$point[$key]>1){throw new InvalidArgumentException('Project requires finite normalized x/y/z in [0,1]');}}
    if($point['y']<=0||abs(array_sum($point)-1.0)>1.0e-9){throw new InvalidArgumentException('Project requires y>0 and x+y+z=1');}
}
function cpDiagnostic(string $id,array $data):void {
    $doc=['schema'=>'aen-color-primaries-program-diagnostics-v1','example_id'=>$id,
        'runtime'=>['php'=>PHP_VERSION,'imagick'=>phpversion('imagick'),'imagemagick'=>Imagick::getVersion()]]+$data;
    if(file_put_contents(__DIR__.'/metrics.json',json_encode($doc,JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR)."\n")===false){throw new RuntimeException('Cannot write measurements');}
}

CpRestore восстанавливает точные входы по SHA; cpState читает атрибуты, RGB16 и ICC отдельно. CpChart рисует координаты, которые основной код передал через $points; cpImage сохраняет отдельный общий RGB8-просмотр и измеряет его после реальной записи. CpSaveRead сохраняет настоящие tagged dataoutputs и открывает их обратно. CpCompare ставит панели 400 × 320 рядом без изменения масштаба. В основном example.php остаются все изучаемые вызовы; helper не превращает метаданные в скрытое цветовое преобразование.

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

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

Imagick::getImageRedPrimaryПроверить описание первичных цветов и отличить метаданные от преобразования

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageRedPrimary(): array

Назначение, параметры, результат и версия binding

Imagick::getImageRedPrimary(): array

Метод без аргументов читает координаты красной первичной точки текущего изображения. Возвращается ассоциативный массив: в официальном базовом описании ключи x и y, в проверенной IM7-ветке — x,y,z. В точном IM6-binding остаются x,y. Метод не возвращает ImagickPixel, координаты пикселя или яркости каналов и не изменяет картинку.

РезультатСмысл
x и yБезразмерные CIE-координаты первичного цвета, общий атрибут текущего изображения.
zПрисутствует в IM7. Не считайте его переносимым произвольным полем файла: в наблюдении z=.123 в RAM превратился в .03 при PNG/MIFF-readback.
ОшибкиПолный официальный контракт указывает ImagickException; пустой объект действительно даёт «Can not process empty Imagick object».

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimageredprimary">
 <refnamediv>
  <refname>Imagick::getImageRedPrimary</refname>
  <refpurpose>Returns the chromaticity red primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageRedPrimary</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity red primary point as an array with the keys "x" and "y".
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
    Returns the chromaticity red primary point as an array with the keys "x"
    and "y".
    &imagick.imagickexception.throw;
  </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
-->

Прочитать три массива без аргументов и выбрать x/y/z по ключу

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки.

Прочитать три массива без аргументов и выбрать x/y/z по ключуПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);$result=cpImage($chart,'getter-chart8.png');
cpCompare([$chart],'color-primaries-get-minimal.png');
cpDiagnostic('color-primaries-get-minimal',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>['chart'=>$result],'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['all_three_arrays'=>count($red)===3&&count($green)===3&&count($blue)===3,
        'source_preserved'=>cpState($image)===$sourceState,'known_normalized_points'=>cpClose(array_sum($red),1)&&cpClose(array_sum($green),1)&&cpClose(array_sum($blue),1)]]);
echo "color-primaries-get-minimal.png\ngetter-chart8.png\nmetrics.json\n";
printf("R x=%.3f y=%.3f z=%.3f\nG x=%.3f y=%.3f z=%.3f\nB x=%.3f y=%.3f z=%.3f\n",$red['x'],$red['y'],$red['z'],$green['x'],$green['y'],$green['z'],$blue['x'],$blue['y'],$blue['z']);

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-get-minimal.png
getter-chart8.png
metrics.json
R x=0.640 y=0.330 z=0.030
G x=0.300 y=0.600 z=0.100
B x=0.150 y=0.060 z=0.790

Получить координатный отчёт о знакомом PNG и построить xy-треугольник

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах.

Получить координатный отчёт о знакомом PNG и построить xy-треугольникПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);
$images=['source'=>cpImage($image,'source-preview8.png'),'chart'=>cpImage($chart,'first-chart8.png')];
$rects=cpCompare([$image,$chart],'color-primaries-first.png');
cpDiagnostic('color-primaries-first',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>$images,'chart_basis'=>['x_origin'=>50,'y_origin'=>280,'x_scale'=>375,'y_scale'=>300,'coordinate_units'=>'CIE xy chromaticity, dimensionless'],
    'panel_keys'=>['source','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['red_xy'=>cpClose($red['x'],.64)&&cpClose($red['y'],.33),'green_xy'=>cpClose($green['x'],.30)&&cpClose($green['y'],.60),
        'blue_xy'=>cpClose($blue['x'],.15)&&cpClose($blue['y'],.06),'IM7_three_components'=>array_keys($red)===['x','y','z'],
        'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-first.png\nsource-preview8.png\nfirst-chart8.png\nmetrics.json\nred=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1\n";

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-first.png
source-preview8.png
first-chart8.png
metrics.json
red=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1
Imagick::setImageRedPrimaryПроверить описание первичных цветов и отличить метаданные от преобразования

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageRedPrimary(float $x, float $y): bool

Назначение, параметры, результат и версия binding

Imagick::setImageRedPrimary(float $x, float $y): bool

Метод задаёт координаты красной первичной точки в метаданных текущего изображения. Официальная базовая запись выше содержит два обязательных float: x и y. Но фактическая сигнатура зависит от библиотеки, с которой собран Imagick: ветка IM6 принимает x,y, а проверенная IM7 — три обязательных float x,y,z. Это проверено по точному C/stub Imagick 3.8.1 и реальному вызову. В IM7 вызов с двумя числами даёт ArgumentCountError. Не определяйте эту разницу только по номеру PHP или названию расширения.

Imagick::setImageRedPrimary(float $x, float $y, float $z): bool // binding IM7
ВходКак понимать
$xБезразмерная CIE-координата цветности x, не горизонтальная координата пикселя.
$yБезразмерная CIE-координата цветности y, не яркость Y и не вертикальная координата пикселя.
$zТретий обязательный аргумент только в ветке IM7. Для наших нормированных известных точек z = 1 − x − y. Это не значение синего канала RGB. Native setter не навязывает нормировку или диапазон.

Возврат bool true означает успешную запись полей, а не выполнение цветового преобразования и не проверку корректности описания. Исследованный Wand просто присваивает chromaticity.red_primary.x/y/z: RGB и содержимое ICC не пересчитываются. Работа ведётся над текущим кадром; clone позволяет оставить вход отдельно. Наша политика конечных нормированных координат не является встроенной проверкой API.

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageredprimary">
 <refnamediv>
  <refname>Imagick::setImageRedPrimary</refname>
  <refpurpose>Sets the image chromaticity red primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageRedPrimary</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity red primary point.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      </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
-->

Объявить известные первичные точки на копии и проверить отсутствие преобразования

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку.

Объявить известные первичные точки на копии и проверить отсутствие преобразованияПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$declared=clone $image;
$returned['red']=$declared->setImageRedPrimary(0.64,0.33,0.03);
$returned['green']=$declared->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$declared->setImageBluePrimary(0.15,0.06,0.79);
$after=cpState($declared);
$images=['before'=>cpImage($image,'setter-before8.png'),'after'=>cpImage($declared,'setter-after8.png')];
$rects=cpCompare([$image,$declared],'color-primaries-set-minimal.png');
cpDiagnostic('color-primaries-set-minimal',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary'],
    'returned'=>$returned,'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['three_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
        'RGB_not_converted'=>$sourceState['RGB16_sha256']===$after['RGB16_sha256'],'ICC_not_created'=>$after['icc_sha256']===null,
        'red_declared'=>cpClose($after['primaries']['red']['z'],.03),'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-set-minimal.png\nsetter-before8.png\nsetter-after8.png\nmetrics.json\nsetters=3 true=3 RGB-unchanged=1 ICC-created=0\n";

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-set-minimal.png
setter-before8.png
setter-after8.png
metrics.json
setters=3 true=3 RGB-unchanged=1 ICC-created=0

Сверить ICC-границу, политику координат и восемь реальных отказов

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены.

Сверить ICC-границу, политику координат и восемь реальных отказовПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$profiled=clone $image;
$profiled->profileImage('icc',(string)file_get_contents(__DIR__.'/target-srgb.icc'));
$profileBefore=cpState($profiled);$beforeView=clone $profiled;
$returned['red']=$profiled->setImageRedPrimary(0.66,0.32,0.02);
$returned['green']=$profiled->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$profiled->setImageBluePrimary(0.15,0.06,0.79);
$red=$profiled->getImageRedPrimary();$green=$profiled->getImageGreenPrimary();$blue=$profiled->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];$after=cpState($profiled);
$saved=cpSaveRead($profiled,'profiled-data.png','png');
$chart=cpChart($points);
$images=['before'=>cpImage($beforeView,'workflow-before8.png'),'after'=>cpImage($profiled,'workflow-after8.png'),'chart'=>cpImage($chart,'workflow-chart8.png')];
$rects=cpCompare([$beforeView,$profiled,$chart],'color-primaries-workflow.png');
$unchecked=clone $image;$uncheckedReturned=$unchecked->setImageGreenPrimary(-0.2,1.4,9.0);$uncheckedState=cpState($unchecked);
$policyError=cpTry(fn()=>cpValidate(['x'=>-.2,'y'=>1.4,'z'=>9.0]));
$errors['missing_z']=cpTry(fn()=>(clone $image)->setImageBluePrimary(.15,.06));
$errors['bad_type']=cpTry(fn()=>(clone $image)->setImageRedPrimary('not-a-coordinate',.33,.03));
foreach(['getImageRedPrimary'=>[],'getImageGreenPrimary'=>[],'getImageBluePrimary'=>[],'setImageRedPrimary'=>[.64,.33,.03],'setImageGreenPrimary'=>[.3,.6,.1],'setImageBluePrimary'=>[.15,.06,.79]] as $method=>$args){
    $empty=new Imagick();$errors['empty_'.$method]=cpTry(fn()=>$empty->$method(...$args));
}
$checks=['setters_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
    'RGB_not_converted'=>$profileBefore['RGB16_sha256']===$after['RGB16_sha256'],
    'ICC_bytes_unchanged'=>$profileBefore['icc_sha256']===$after['icc_sha256']&&$after['icc_sha256']!==null,
    'profiled_PNG_RGB_ICC_preserved'=>$saved['state']['RGB16_sha256']===$after['RGB16_sha256']&&$saved['state']['icc_sha256']===$after['icc_sha256'],
    'observed_profiled_PNG_z'=>cpClose($saved['state']['primaries']['red']['x'],.66)&&cpClose($saved['state']['primaries']['red']['y'],.32)&&cpClose($saved['state']['primaries']['red']['z'],.03),
    'API_accepts_out_of_policy'=>$uncheckedReturned===true&&cpClose($uncheckedState['primaries']['green']['x'],-.2),
    'application_rejects_invalid'=>($policyError['error']['class']??null)==='InvalidArgumentException',
    'source_preserved'=>cpState($image)===$sourceState];
foreach($errors as $name=>$record){$checks['caught_'.$name]=isset($record['error']);}
cpDiagnostic('color-primaries-workflow',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary','getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'returned'=>$returned,'before'=>$profileBefore,'after'=>$after,'points'=>$points,'saved'=>$saved,'images'=>$images,
    'unchecked'=>['returned'=>$uncheckedReturned,'state'=>$uncheckedState],'policy_error'=>$policyError,'errors'=>$errors,
    'panel_keys'=>['before','after','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,'checks'=>$checks]);
echo "color-primaries-workflow.png\nworkflow-before8.png\nworkflow-after8.png\nworkflow-chart8.png\nprofiled-data.png\nmetrics.json\nRGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1\n";

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-workflow.png
workflow-before8.png
workflow-after8.png
workflow-chart8.png
profiled-data.png
metrics.json
RGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1
Imagick::getImageGreenPrimaryПроверить описание первичных цветов и отличить метаданные от преобразования

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageGreenPrimary(): array

Назначение, параметры, результат и версия binding

Imagick::getImageGreenPrimary(): array

Метод без аргументов читает координаты зелёной первичной точки текущего изображения. Возвращается ассоциативный массив: в официальном базовом описании ключи x и y, в проверенной IM7-ветке — x,y,z. В точном IM6-binding остаются x,y. Метод не возвращает ImagickPixel, координаты пикселя или яркости каналов и не изменяет картинку.

РезультатСмысл
x и yБезразмерные CIE-координаты первичного цвета, общий атрибут текущего изображения.
zПрисутствует в IM7. Не считайте его переносимым произвольным полем файла: в наблюдении z=.123 в RAM превратился в .03 при PNG/MIFF-readback.
ОшибкиПолный официальный контракт указывает ImagickException; пустой объект действительно даёт «Can not process empty Imagick object».

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagegreenprimary">
 <refnamediv>
  <refname>Imagick::getImageGreenPrimary</refname>
  <refpurpose>Returns the chromaticy green primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageGreenPrimary</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity green primary point. Returns an array with the keys "x" and "y".
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns an array with the keys "x" and "y" on success, throws an
   ImagickException on failure.
  </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
-->

Прочитать три массива без аргументов и выбрать x/y/z по ключу

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки.

Прочитать три массива без аргументов и выбрать x/y/z по ключуПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);$result=cpImage($chart,'getter-chart8.png');
cpCompare([$chart],'color-primaries-get-minimal.png');
cpDiagnostic('color-primaries-get-minimal',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>['chart'=>$result],'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['all_three_arrays'=>count($red)===3&&count($green)===3&&count($blue)===3,
        'source_preserved'=>cpState($image)===$sourceState,'known_normalized_points'=>cpClose(array_sum($red),1)&&cpClose(array_sum($green),1)&&cpClose(array_sum($blue),1)]]);
echo "color-primaries-get-minimal.png\ngetter-chart8.png\nmetrics.json\n";
printf("R x=%.3f y=%.3f z=%.3f\nG x=%.3f y=%.3f z=%.3f\nB x=%.3f y=%.3f z=%.3f\n",$red['x'],$red['y'],$red['z'],$green['x'],$green['y'],$green['z'],$blue['x'],$blue['y'],$blue['z']);

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-get-minimal.png
getter-chart8.png
metrics.json
R x=0.640 y=0.330 z=0.030
G x=0.300 y=0.600 z=0.100
B x=0.150 y=0.060 z=0.790

Получить координатный отчёт о знакомом PNG и построить xy-треугольник

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах.

Получить координатный отчёт о знакомом PNG и построить xy-треугольникПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);
$images=['source'=>cpImage($image,'source-preview8.png'),'chart'=>cpImage($chart,'first-chart8.png')];
$rects=cpCompare([$image,$chart],'color-primaries-first.png');
cpDiagnostic('color-primaries-first',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>$images,'chart_basis'=>['x_origin'=>50,'y_origin'=>280,'x_scale'=>375,'y_scale'=>300,'coordinate_units'=>'CIE xy chromaticity, dimensionless'],
    'panel_keys'=>['source','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['red_xy'=>cpClose($red['x'],.64)&&cpClose($red['y'],.33),'green_xy'=>cpClose($green['x'],.30)&&cpClose($green['y'],.60),
        'blue_xy'=>cpClose($blue['x'],.15)&&cpClose($blue['y'],.06),'IM7_three_components'=>array_keys($red)===['x','y','z'],
        'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-first.png\nsource-preview8.png\nfirst-chart8.png\nmetrics.json\nred=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1\n";

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-first.png
source-preview8.png
first-chart8.png
metrics.json
red=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1
Imagick::setImageGreenPrimaryПроверить описание первичных цветов и отличить метаданные от преобразования

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageGreenPrimary(float $x, float $y): bool

Назначение, параметры, результат и версия binding

Imagick::setImageGreenPrimary(float $x, float $y): bool

Метод задаёт координаты зелёной первичной точки в метаданных текущего изображения. Официальная базовая запись выше содержит два обязательных float: x и y. Но фактическая сигнатура зависит от библиотеки, с которой собран Imagick: ветка IM6 принимает x,y, а проверенная IM7 — три обязательных float x,y,z. Это проверено по точному C/stub Imagick 3.8.1 и реальному вызову. В IM7 вызов с двумя числами даёт ArgumentCountError. Не определяйте эту разницу только по номеру PHP или названию расширения.

Imagick::setImageGreenPrimary(float $x, float $y, float $z): bool // binding IM7
ВходКак понимать
$xБезразмерная CIE-координата цветности x, не горизонтальная координата пикселя.
$yБезразмерная CIE-координата цветности y, не яркость Y и не вертикальная координата пикселя.
$zТретий обязательный аргумент только в ветке IM7. Для наших нормированных известных точек z = 1 − x − y. Это не значение синего канала RGB. Native setter не навязывает нормировку или диапазон.

Возврат bool true означает успешную запись полей, а не выполнение цветового преобразования и не проверку корректности описания. Исследованный Wand просто присваивает chromaticity.green_primary.x/y/z: RGB и содержимое ICC не пересчитываются. Работа ведётся над текущим кадром; clone позволяет оставить вход отдельно. Наша политика конечных нормированных координат не является встроенной проверкой API.

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagegreenprimary">
 <refnamediv>
  <refname>Imagick::setImageGreenPrimary</refname>
  <refpurpose>Sets the image chromaticity green primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageGreenPrimary</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity green primary point.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      </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
-->

Объявить известные первичные точки на копии и проверить отсутствие преобразования

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку.

Объявить известные первичные точки на копии и проверить отсутствие преобразованияПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$declared=clone $image;
$returned['red']=$declared->setImageRedPrimary(0.64,0.33,0.03);
$returned['green']=$declared->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$declared->setImageBluePrimary(0.15,0.06,0.79);
$after=cpState($declared);
$images=['before'=>cpImage($image,'setter-before8.png'),'after'=>cpImage($declared,'setter-after8.png')];
$rects=cpCompare([$image,$declared],'color-primaries-set-minimal.png');
cpDiagnostic('color-primaries-set-minimal',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary'],
    'returned'=>$returned,'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['three_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
        'RGB_not_converted'=>$sourceState['RGB16_sha256']===$after['RGB16_sha256'],'ICC_not_created'=>$after['icc_sha256']===null,
        'red_declared'=>cpClose($after['primaries']['red']['z'],.03),'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-set-minimal.png\nsetter-before8.png\nsetter-after8.png\nmetrics.json\nsetters=3 true=3 RGB-unchanged=1 ICC-created=0\n";

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-set-minimal.png
setter-before8.png
setter-after8.png
metrics.json
setters=3 true=3 RGB-unchanged=1 ICC-created=0

Сверить ICC-границу, политику координат и восемь реальных отказов

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены.

Сверить ICC-границу, политику координат и восемь реальных отказовПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$profiled=clone $image;
$profiled->profileImage('icc',(string)file_get_contents(__DIR__.'/target-srgb.icc'));
$profileBefore=cpState($profiled);$beforeView=clone $profiled;
$returned['red']=$profiled->setImageRedPrimary(0.66,0.32,0.02);
$returned['green']=$profiled->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$profiled->setImageBluePrimary(0.15,0.06,0.79);
$red=$profiled->getImageRedPrimary();$green=$profiled->getImageGreenPrimary();$blue=$profiled->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];$after=cpState($profiled);
$saved=cpSaveRead($profiled,'profiled-data.png','png');
$chart=cpChart($points);
$images=['before'=>cpImage($beforeView,'workflow-before8.png'),'after'=>cpImage($profiled,'workflow-after8.png'),'chart'=>cpImage($chart,'workflow-chart8.png')];
$rects=cpCompare([$beforeView,$profiled,$chart],'color-primaries-workflow.png');
$unchecked=clone $image;$uncheckedReturned=$unchecked->setImageGreenPrimary(-0.2,1.4,9.0);$uncheckedState=cpState($unchecked);
$policyError=cpTry(fn()=>cpValidate(['x'=>-.2,'y'=>1.4,'z'=>9.0]));
$errors['missing_z']=cpTry(fn()=>(clone $image)->setImageBluePrimary(.15,.06));
$errors['bad_type']=cpTry(fn()=>(clone $image)->setImageRedPrimary('not-a-coordinate',.33,.03));
foreach(['getImageRedPrimary'=>[],'getImageGreenPrimary'=>[],'getImageBluePrimary'=>[],'setImageRedPrimary'=>[.64,.33,.03],'setImageGreenPrimary'=>[.3,.6,.1],'setImageBluePrimary'=>[.15,.06,.79]] as $method=>$args){
    $empty=new Imagick();$errors['empty_'.$method]=cpTry(fn()=>$empty->$method(...$args));
}
$checks=['setters_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
    'RGB_not_converted'=>$profileBefore['RGB16_sha256']===$after['RGB16_sha256'],
    'ICC_bytes_unchanged'=>$profileBefore['icc_sha256']===$after['icc_sha256']&&$after['icc_sha256']!==null,
    'profiled_PNG_RGB_ICC_preserved'=>$saved['state']['RGB16_sha256']===$after['RGB16_sha256']&&$saved['state']['icc_sha256']===$after['icc_sha256'],
    'observed_profiled_PNG_z'=>cpClose($saved['state']['primaries']['red']['x'],.66)&&cpClose($saved['state']['primaries']['red']['y'],.32)&&cpClose($saved['state']['primaries']['red']['z'],.03),
    'API_accepts_out_of_policy'=>$uncheckedReturned===true&&cpClose($uncheckedState['primaries']['green']['x'],-.2),
    'application_rejects_invalid'=>($policyError['error']['class']??null)==='InvalidArgumentException',
    'source_preserved'=>cpState($image)===$sourceState];
foreach($errors as $name=>$record){$checks['caught_'.$name]=isset($record['error']);}
cpDiagnostic('color-primaries-workflow',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary','getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'returned'=>$returned,'before'=>$profileBefore,'after'=>$after,'points'=>$points,'saved'=>$saved,'images'=>$images,
    'unchecked'=>['returned'=>$uncheckedReturned,'state'=>$uncheckedState],'policy_error'=>$policyError,'errors'=>$errors,
    'panel_keys'=>['before','after','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,'checks'=>$checks]);
echo "color-primaries-workflow.png\nworkflow-before8.png\nworkflow-after8.png\nworkflow-chart8.png\nprofiled-data.png\nmetrics.json\nRGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1\n";

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-workflow.png
workflow-before8.png
workflow-after8.png
workflow-chart8.png
profiled-data.png
metrics.json
RGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1
Imagick::getImageBluePrimaryПроверить описание первичных цветов и отличить метаданные от преобразования

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageBluePrimary(): array

Назначение, параметры, результат и версия binding

Imagick::getImageBluePrimary(): array

Метод без аргументов читает координаты синей первичной точки текущего изображения. Возвращается ассоциативный массив: в официальном базовом описании ключи x и y, в проверенной IM7-ветке — x,y,z. В точном IM6-binding остаются x,y. Метод не возвращает ImagickPixel, координаты пикселя или яркости каналов и не изменяет картинку.

РезультатСмысл
x и yБезразмерные CIE-координаты первичного цвета, общий атрибут текущего изображения.
zПрисутствует в IM7. Не считайте его переносимым произвольным полем файла: в наблюдении z=.123 в RAM превратился в .03 при PNG/MIFF-readback.
ОшибкиПолный официальный контракт указывает ImagickException; пустой объект действительно даёт «Can not process empty Imagick object».

В полном XML синопсис getter имеет пустой список аргументов, хотя ниже остались пункты x/y. В реальном getter это выходные ключи массива: передавать x/y в скобки не требуется. Исходный XML сохранён целиком; рабочий вызов — $image->getImageBluePrimary().

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimageblueprimary">
 <refnamediv>
  <refname>Imagick::getImageBluePrimary</refname>
  <refpurpose>Returns the chromaticy blue primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageBluePrimary</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity blue primary point for the image.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      The chromaticity blue primary x-point.
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      The chromaticity blue primary y-point.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Array consisting of "x" and "y" coordinates of point.
  </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
-->

Прочитать три массива без аргументов и выбрать x/y/z по ключу

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки.

Прочитать три массива без аргументов и выбрать x/y/z по ключуПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);$result=cpImage($chart,'getter-chart8.png');
cpCompare([$chart],'color-primaries-get-minimal.png');
cpDiagnostic('color-primaries-get-minimal',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>['chart'=>$result],'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['all_three_arrays'=>count($red)===3&&count($green)===3&&count($blue)===3,
        'source_preserved'=>cpState($image)===$sourceState,'known_normalized_points'=>cpClose(array_sum($red),1)&&cpClose(array_sum($green),1)&&cpClose(array_sum($blue),1)]]);
echo "color-primaries-get-minimal.png\ngetter-chart8.png\nmetrics.json\n";
printf("R x=%.3f y=%.3f z=%.3f\nG x=%.3f y=%.3f z=%.3f\nB x=%.3f y=%.3f z=%.3f\n",$red['x'],$red['y'],$red['z'],$green['x'],$green['y'],$green['z'],$blue['x'],$blue['y'],$blue['z']);

Каждый getter вернул массив с x,y,z в проверенной IM7-сборке. Пустые скобки означают отсутствие аргументов. Координаты относятся к описанию первичных цветов всего текущего изображения, а не к положению пикселя и не к RGB конкретной кружки. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-get-minimal.png
getter-chart8.png
metrics.json
R x=0.640 y=0.330 z=0.030
G x=0.300 y=0.600 z=0.100
B x=0.150 y=0.060 z=0.790

Получить координатный отчёт о знакомом PNG и построить xy-треугольник

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах.

Получить координатный отчёт о знакомом PNG и построить xy-треугольникПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$red=$image->getImageRedPrimary();
$green=$image->getImageGreenPrimary();
$blue=$image->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];
$chart=cpChart($points);
$images=['source'=>cpImage($image,'source-preview8.png'),'chart'=>cpImage($chart,'first-chart8.png')];
$rects=cpCompare([$image,$chart],'color-primaries-first.png');
cpDiagnostic('color-primaries-first',['executed_apis'=>['getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'points'=>$points,'images'=>$images,'chart_basis'=>['x_origin'=>50,'y_origin'=>280,'x_scale'=>375,'y_scale'=>300,'coordinate_units'=>'CIE xy chromaticity, dimensionless'],
    'panel_keys'=>['source','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['red_xy'=>cpClose($red['x'],.64)&&cpClose($red['y'],.33),'green_xy'=>cpClose($green['x'],.30)&&cpClose($green['y'],.60),
        'blue_xy'=>cpClose($blue['x'],.15)&&cpClose($blue['y'],.06),'IM7_three_components'=>array_keys($red)===['x','y','z'],
        'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-first.png\nsource-preview8.png\nfirst-chart8.png\nmetrics.json\nred=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1\n";

Из собственной картинки 400 × 320 прочитаны R(.64,.33), G(.30,.60), B(.15,.06). Их настоящие значения нанесены PHP на xy-график с делениями. Рисунок товара не перекрашен: полезный результат здесь — проверяемый отчёт о метаданных и их координатах. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-first.png
source-preview8.png
first-chart8.png
metrics.json
red=0.640,0.330 green=0.300,0.600 blue=0.150,0.060 RGB-unchanged=1
Imagick::setImageBluePrimaryПроверить описание первичных цветов и отличить метаданные от преобразования

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageBluePrimary(float $x, float $y): bool

Назначение, параметры, результат и версия binding

Imagick::setImageBluePrimary(float $x, float $y): bool

Метод задаёт координаты синей первичной точки в метаданных текущего изображения. Официальная базовая запись выше содержит два обязательных float: x и y. Но фактическая сигнатура зависит от библиотеки, с которой собран Imagick: ветка IM6 принимает x,y, а проверенная IM7 — три обязательных float x,y,z. Это проверено по точному C/stub Imagick 3.8.1 и реальному вызову. В IM7 вызов с двумя числами даёт ArgumentCountError. Не определяйте эту разницу только по номеру PHP или названию расширения.

Imagick::setImageBluePrimary(float $x, float $y, float $z): bool // binding IM7
ВходКак понимать
$xБезразмерная CIE-координата цветности x, не горизонтальная координата пикселя.
$yБезразмерная CIE-координата цветности y, не яркость Y и не вертикальная координата пикселя.
$zТретий обязательный аргумент только в ветке IM7. Для наших нормированных известных точек z = 1 − x − y. Это не значение синего канала RGB. Native setter не навязывает нормировку или диапазон.

Возврат bool true означает успешную запись полей, а не выполнение цветового преобразования и не проверку корректности описания. Исследованный Wand просто присваивает chromaticity.blue_primary.x/y/z: RGB и содержимое ICC не пересчитываются. Работа ведётся над текущим кадром; clone позволяет оставить вход отдельно. Наша политика конечных нормированных координат не является встроенной проверкой API.

Официальная доступность: PECL imagick 2, PECL imagick 3. Эти шесть записей не отмечены deprecated/removed в принятом официальном инвентаре. Наличие метода не гарантирует одинаковую сериализацию во всех форматах. Все шесть пустых объектов в нашей программе дали ImagickException; строка вместо float дала TypeError. Объект должен содержать открытое изображение до getter/setter.

Метаданные не доказывают происхождение пикселей: файл может содержать неверное описание. Три точки также не заменяют полный ICC-профиль и характеристику передачи. Для настоящего преобразования известного исходного профиля в целевой нужен отдельный ICC-сценарий с profileImage. Не присваивайте sRGB только ради изменения внешнего вида неизвестного файла.

Полный официальный XML: все описания, параметры, возврат и раздел ошибок
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageblueprimary">
 <refnamediv>
  <refname>Imagick::setImageBluePrimary</refname>
  <refpurpose>Sets the image chromaticity blue primary point</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageBluePrimary</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity blue primary point.
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x</parameter></term>
     <listitem>
      <para>
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y</parameter></term>
     <listitem>
      <para>
      </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
-->

Объявить известные первичные точки на копии и проверить отсутствие преобразования

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку.

Объявить известные первичные точки на копии и проверить отсутствие преобразованияПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$declared=clone $image;
$returned['red']=$declared->setImageRedPrimary(0.64,0.33,0.03);
$returned['green']=$declared->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$declared->setImageBluePrimary(0.15,0.06,0.79);
$after=cpState($declared);
$images=['before'=>cpImage($image,'setter-before8.png'),'after'=>cpImage($declared,'setter-after8.png')];
$rects=cpCompare([$image,$declared],'color-primaries-set-minimal.png');
cpDiagnostic('color-primaries-set-minimal',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary'],
    'returned'=>$returned,'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>cpState($image)===$sourceState,
    'checks'=>['three_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
        'RGB_not_converted'=>$sourceState['RGB16_sha256']===$after['RGB16_sha256'],'ICC_not_created'=>$after['icc_sha256']===null,
        'red_declared'=>cpClose($after['primaries']['red']['z'],.03),'source_preserved'=>cpState($image)===$sourceState]]);
echo "color-primaries-set-minimal.png\nsetter-before8.png\nsetter-after8.png\nmetrics.json\nsetters=3 true=3 RGB-unchanged=1 ICC-created=0\n";

Три setter вернули true; RGB16-компоненты сохранились, ICC-профиль не появился. Мы записали известные sRGB-координаты для собственного sRGB-входа. Это декларация известного представления, а не способ угадать или исправить неизвестную картинку. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-set-minimal.png
setter-before8.png
setter-after8.png
metrics.json
setters=3 true=3 RGB-unchanged=1 ICC-created=0

Сверить ICC-границу, политику координат и восемь реальных отказов

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены.

Сверить ICC-границу, политику координат и восемь реальных отказовПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/color-primaries-fixture.php';
cpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=cpState($image);
$profiled=clone $image;
$profiled->profileImage('icc',(string)file_get_contents(__DIR__.'/target-srgb.icc'));
$profileBefore=cpState($profiled);$beforeView=clone $profiled;
$returned['red']=$profiled->setImageRedPrimary(0.66,0.32,0.02);
$returned['green']=$profiled->setImageGreenPrimary(0.30,0.60,0.10);
$returned['blue']=$profiled->setImageBluePrimary(0.15,0.06,0.79);
$red=$profiled->getImageRedPrimary();$green=$profiled->getImageGreenPrimary();$blue=$profiled->getImageBluePrimary();
$points=['red'=>$red,'green'=>$green,'blue'=>$blue];$after=cpState($profiled);
$saved=cpSaveRead($profiled,'profiled-data.png','png');
$chart=cpChart($points);
$images=['before'=>cpImage($beforeView,'workflow-before8.png'),'after'=>cpImage($profiled,'workflow-after8.png'),'chart'=>cpImage($chart,'workflow-chart8.png')];
$rects=cpCompare([$beforeView,$profiled,$chart],'color-primaries-workflow.png');
$unchecked=clone $image;$uncheckedReturned=$unchecked->setImageGreenPrimary(-0.2,1.4,9.0);$uncheckedState=cpState($unchecked);
$policyError=cpTry(fn()=>cpValidate(['x'=>-.2,'y'=>1.4,'z'=>9.0]));
$errors['missing_z']=cpTry(fn()=>(clone $image)->setImageBluePrimary(.15,.06));
$errors['bad_type']=cpTry(fn()=>(clone $image)->setImageRedPrimary('not-a-coordinate',.33,.03));
foreach(['getImageRedPrimary'=>[],'getImageGreenPrimary'=>[],'getImageBluePrimary'=>[],'setImageRedPrimary'=>[.64,.33,.03],'setImageGreenPrimary'=>[.3,.6,.1],'setImageBluePrimary'=>[.15,.06,.79]] as $method=>$args){
    $empty=new Imagick();$errors['empty_'.$method]=cpTry(fn()=>$empty->$method(...$args));
}
$checks=['setters_true'=>$returned===['red'=>true,'green'=>true,'blue'=>true],
    'RGB_not_converted'=>$profileBefore['RGB16_sha256']===$after['RGB16_sha256'],
    'ICC_bytes_unchanged'=>$profileBefore['icc_sha256']===$after['icc_sha256']&&$after['icc_sha256']!==null,
    'profiled_PNG_RGB_ICC_preserved'=>$saved['state']['RGB16_sha256']===$after['RGB16_sha256']&&$saved['state']['icc_sha256']===$after['icc_sha256'],
    'observed_profiled_PNG_z'=>cpClose($saved['state']['primaries']['red']['x'],.66)&&cpClose($saved['state']['primaries']['red']['y'],.32)&&cpClose($saved['state']['primaries']['red']['z'],.03),
    'API_accepts_out_of_policy'=>$uncheckedReturned===true&&cpClose($uncheckedState['primaries']['green']['x'],-.2),
    'application_rejects_invalid'=>($policyError['error']['class']??null)==='InvalidArgumentException',
    'source_preserved'=>cpState($image)===$sourceState];
foreach($errors as $name=>$record){$checks['caught_'.$name]=isset($record['error']);}
cpDiagnostic('color-primaries-workflow',['executed_apis'=>['setImageRedPrimary','setImageGreenPrimary','setImageBluePrimary','getImageRedPrimary','getImageGreenPrimary','getImageBluePrimary'],
    'returned'=>$returned,'before'=>$profileBefore,'after'=>$after,'points'=>$points,'saved'=>$saved,'images'=>$images,
    'unchecked'=>['returned'=>$uncheckedReturned,'state'=>$uncheckedState],'policy_error'=>$policyError,'errors'=>$errors,
    'panel_keys'=>['before','after','chart'],'panel_geometry'=>$rects,'source_unchanged'=>cpState($image)===$sourceState,'checks'=>$checks]);
echo "color-primaries-workflow.png\nworkflow-before8.png\nworkflow-after8.png\nworkflow-chart8.png\nprofiled-data.png\nmetrics.json\nRGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1\n";

Изменённая запись R(.66,.32,.02) осталась в RAM рядом с прежними RGB и теми же байтами sRGB ICC. В прочитанном PNG получилось R(.66,.32,.03), а не автоматически .02. Неверные координаты сам setter принял; наша отдельная политика их отвергла. Восемь ошибок аргументов/пустого объекта пойманы и сохранены. Самостоятельный ZIP содержит example.php, source.png/ICC/font в base64, две лицензии и color-primaries-fixture.php. Распакуйте рядом и выполните php example.php. cpRestore проверяет SHA и восстанавливает входы. cpState читает координаты и отдельно измеряет RGB16/ICC; cpChart рисует настоящий график значений, переданных из основного кода; cpView/cpImage сохраняют отдельные RGB8-копии без цветовых метаданных для одинаковой основы сравнения. cpSaveRead сохраняет отдельный настоящий tagged PNG/MIFF и открывает его обратно. Вызовы изучаемых методов видны в example.php. Полный helper раскрыт в конце главы. Проверенная среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
color-primaries-workflow.png
workflow-before8.png
workflow-after8.png
workflow-chart8.png
profiled-data.png
metrics.json
RGB-unchanged=1 ICC-unchanged=1 errors=8 policy-rejection=1
Источники и обсуждения

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

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

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

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