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

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

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

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

Глава 391 · После объектов, массивов и первичных цветов; цветовые метаданные

Imagick: прочитать белую точку D65 и отличить метаданные от баланса белого

Два метода white point: полезный координатный отчёт и xy-график, различие белого пикселя/ICC PCS, версия x/y/z, настоящий PNG/MIFF readback и явные ошибки.

Получить отчёт D65 и не перепутать его с обработкой белого цвета

Коллега предлагает «поправить белый цвет», изменив white point в картинке товара. Сначала нужно понять, что именно записано и что меняет выбранный инструмент. Получим отчёт о белой точке собственного PNG и покажем её на xy-графике. Картинка останется прежней: полезный результат здесь — отличить характеристику цветового описания от настоящей обработки пикселей и не принять метаданные за готовую коррекцию.

Собственный товарный PNG и фактическая точка D65 на PHP xy-графике: отчёт о метаданных без изменения цвета картинки
Собственный товарный PNG и фактическая точка D65 на PHP xy-графике: отчёт о метаданных без изменения цвета картинки
$point = $image->getImageWhitePoint();
echo $point['x']; // наш известный вход: 0.3127

$image — уже открытое изображение. Стрелка -> вызывает метод этого объекта; пустые скобки означают, что аргументов нет. Знак = сохраняет вернувшийся массив в $point. Квадратные скобки с 'x' выбирают число по строковому ключу, а точка с запятой завершает инструкцию. Никакое положение пикселя здесь не передаётся. Полная программа ниже открывает вход и создаёт реальный график.

Получить отчёт D65 и показать точку на настоящем xy-графике

Прочитано описание белой точки собственного PNG: x=.3127,y=.3290,z=.3583 в проверенной IM7-сборке. PHP построил график именно полученной пары xy. Рисунок товара и его белый фон не перекрашивались.

Получить отчёт D65 и показать точку на настоящем xy-графикеПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$point=$image->getImageWhitePoint();
$chart=wpChart(['D65'=>$point]);
$images=['source'=>wpImage($image,'source-preview8.png'),'chart'=>wpImage($chart,'first-chart8.png')];
$rects=wpCompare([$image,$chart],'white-point-first.png');
wpDiagnostic('white-point-first',['executed_api'=>'getImageWhitePoint','point'=>$point,'before'=>$sourceState,'images'=>$images,
    'chart_basis'=>['origin'=>[50,280],'scale'=>[375,300],'units'=>'dimensionless CIE xy'],
    'panel_keys'=>['source','chart'],'panel_geometry'=>$rects,'source_unchanged'=>wpState($image)===$sourceState,
    'checks'=>['known_D65_xy'=>wpClose($point['x'],.3127)&&wpClose($point['y'],.3290),
        'IM7_three_coordinates'=>array_keys($point)===['x','y','z'],'source_preserved'=>wpState($image)===$sourceState]]);
echo "white-point-first.png\nsource-preview8.png\nfirst-chart8.png\nmetrics.json\nD65 x=0.3127 y=0.3290 z=0.3583 RGB-unchanged=1\n";

Прочитано описание белой точки собственного PNG: x=.3127,y=.3290,z=.3583 в проверенной IM7-сборке. PHP построил график именно полученной пары xy. Рисунок товара и его белый фон не перекрашивались. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-first.png
source-preview8.png
first-chart8.png
metrics.json
D65 x=0.3127 y=0.3290 z=0.3583 RGB-unchanged=1

Точный собственный PNG имеет размер 400 × 320, содержит cHRM с D65 и не содержит ICC. Его происхождение нам известно; getter чужого файла показывает имеющиеся атрибуты, но сам не доказывает их правильность. На графике x/y безразмерны. Одна точка не является изображением всех видимых цветов, калибровкой дисплея или оценкой температуры освещения сцены. Массив описывает форму отчёта, а пиксельные значения относятся к данным картинки.

Различить white point, белый пиксель, баланс белого и ICC PCS

D65 и изменённая запись на настоящих xy-графиках: сдвинулся атрибут, а RGB и белый пиксель остались прежними
D65 и изменённая запись на настоящих xy-графиках: сдвинулся атрибут, а RGB и белый пиксель остались прежними

White point — опорная цветность белого в описании пространства. Для нашего sRGB это стандартная D65 с x=.3127,y=.3290; при нормировке третья координата z=.3583. Это безразмерные CIE-координаты, не байты RGB и не единицы размера картинки. Буква y не означает яркостную величину Y. Координаты первичных R/G/B и характеристика передачи — другие части описания, о которых подробнее в предыдущей главе о первичных точках.

ПонятиеКакой вопрос решаетЧего не делает наш setter
White point в метаданныхКакой опорный белый записан в описании изображения?Не измеряет сцену и не проверяет достоверность описания.
Белый пиксель RGBКакие численные компоненты лежат в конкретной координате?Не ищет и не перекрашивает белые области.
Баланс белого/адаптацияКак преобразовать цветовые данные по выбранной модели/профилю?Не выполняет это преобразование.
D50 в ICC PCSКакое опорное представление связывает ICC-преобразования?Не переименовывает D65 исходного sRGB в D50 и не переписывает ICC.

Точная функция Wand лишь присваивает три поля white_point. Это объясняет, почему общий просмотр до и после одинаков: данные RGB не пересчитывались. Мы создаём отдельные одинаково stripped RGB8-копии для сравнения; настоящие tagged PNG/MIFF сохраняются отдельно. В цветоуправляемых просмотрщиках разные метаданные могут менять интерпретацию тех же RGB, поэтому одинаковые числа не обещают одинаковый вид всех файлов во всех приложениях. Общая учебная копия не является рекомендацией удалить исходное описание.

Разобрать короткую запись setter/getter и получить готовые файлы

Известный D65 объявлен на копии: общий RGB8-просмотр до и после одинаков, белый пиксель сохранён
Известный D65 объявлен на копии: общий RGB8-просмотр до и после одинаков, белый пиксель сохранён
$declared = clone $image;
$ok = $declared->setImageWhitePoint(0.3127, 0.3290, 0.3583);
$point = $declared->getImageWhitePoint();

Clone создаёт независимую копию $declared. Три числа — x,y,z именно в IM7-binding; третье число не является «добавить синего». $ok получает true при успешной записи полей; $point получает массив после чтения. Getter не сохраняет файл автоматически. В полной программе рядом записаны реальные изображения и отдельно проверен белый пиксель (0,0). Мы объявляем известный D65 для собственного входа, а не угадываем, как исправить чужую фотографию.

Задать известный D65 на копии и прочитать его обратно

Setter вернул true, getter прочитал D65. RGB16 и белый пиксель (0,0) сохранились; ICC не появился. Здесь декларируется известная характеристика собственного входа, а не исправляется оттенок фотографии.

Задать известный D65 на копии и прочитать его обратноПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$declared=clone $image;
$returned=$declared->setImageWhitePoint(0.3127,0.3290,0.3583);
$point=$declared->getImageWhitePoint();
$after=wpState($declared);
$images=['before'=>wpImage($image,'minimal-before8.png'),'after'=>wpImage($declared,'minimal-after8.png')];
$rects=wpCompare([$image,$declared],'white-point-minimal.png');
wpDiagnostic('white-point-minimal',['executed_apis'=>['setImageWhitePoint','getImageWhitePoint'],'returned'=>$returned,'point'=>$point,
    'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>wpState($image)===$sourceState,
    'checks'=>['setter_true'=>$returned===true,'known_D65'=>wpClose($point['x'],.3127)&&wpClose($point['y'],.329)&&wpClose($point['z'],.3583),
        'RGB_not_converted'=>$after['RGB16_sha256']===$sourceState['RGB16_sha256'],'white_pixel_unchanged'=>$after['white_pixel']===$sourceState['white_pixel'],
        'ICC_not_created'=>$after['icc_sha256']===null,'source_preserved'=>wpState($image)===$sourceState]]);
echo "white-point-minimal.png\nminimal-before8.png\nminimal-after8.png\nmetrics.json\nsetter=true D65-readback=1 RGB-unchanged=1 white-pixel-unchanged=1\n";

Setter вернул true, getter прочитал D65. RGB16 и белый пиксель (0,0) сохранились; ICC не появился. Здесь декларируется известная характеристика собственного входа, а не исправляется оттенок фотографии. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-minimal.png
minimal-before8.png
minimal-after8.png
metrics.json
setter=true D65-readback=1 RGB-unchanged=1 white-pixel-unchanged=1

Официальная краткая сигнатура setters содержит x,y, но точный IM7 требует x,y,z. IM6 принимает два аргумента и возвращает две координаты. Это различие binding объяснено в обеих карточках ниже. Название версии PHP не заменяет знание ImageMagick, с которым собран модуль; вызов с двумя числами в проверенном IM7 даёт ArgumentCountError. Понятия копии объекта и ассоциативного массива помогают читать три короткие строки.

Проверить настоящий файл, ICC-границу и четыре ошибки

Фактическое сохранение PNG/MIFF и ICC-граница: координатный атрибут отдельно от пикселей и профиля
Фактическое сохранение PNG/MIFF и ICC-граница: координатный атрибут отдельно от пикселей и профиля

Следующая задача — сохранить файл, а не только изменить объект в памяти. В PNG cHRM белая точка хранится как x/y с шагом 1/100000; отдельного z в этом chunk нет. Поэтому полезно реально открыть результат и сверить атрибуты. В намеренно диагностической копии зададим z=.123 при прежних x=.3127,y=.3290; такую ненормированную запись не используем как описание рабочей картинки.

Сохранить координаты в PNG/MIFF и проверить настоящий readback

В RAM принято ненормированное z=.123. Реально открытые PNG и MIFF дали x=.3127,y=.3290,z=.3583, сохранив все RGB16. Значения каждого этапа записаны в metrics.json. Это наблюдение конкретных кодеров, а не допустимое описание рабочего sRGB-файла или обещание переносимости произвольного z.

Сохранить координаты в PNG/MIFF и проверить настоящий readbackПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$declared=clone $image;
$returned=$declared->setImageWhitePoint(0.3127,0.3290,0.123);
$point=$declared->getImageWhitePoint();$inMemory=wpState($declared);
$saved['PNG']=wpSaveRead($declared,'white-point-data.png','png',true);
$saved['MIFF']=wpSaveRead($declared,'white-point-data.miff','miff');
$png=new Imagick(__DIR__.'/white-point-data.png');$miff=new Imagick(__DIR__.'/white-point-data.miff');
$images=['PNG'=>wpImage($png,'serialization-png8.png'),'MIFF'=>wpImage($miff,'serialization-miff8.png')];
$rects=wpCompare([$png,$miff],'white-point-serialization.png');
wpDiagnostic('white-point-serialization',['executed_apis'=>['setImageWhitePoint','getImageWhitePoint'],'returned'=>$returned,
    'point'=>$point,'in_memory'=>$inMemory,'saved'=>$saved,'images'=>$images,'panel_keys'=>['PNG','MIFF'],'panel_geometry'=>$rects,
    'source_unchanged'=>wpState($image)===$sourceState,
    'checks'=>['setter_accepts_non_normalized_z'=>$returned===true&&wpClose($point['z'],.123),
        'PNG_xy_preserved'=>wpClose($saved['PNG']['state']['white_point']['x'],.3127)&&wpClose($saved['PNG']['state']['white_point']['y'],.329),
        'MIFF_xy_preserved'=>wpClose($saved['MIFF']['state']['white_point']['x'],.3127)&&wpClose($saved['MIFF']['state']['white_point']['y'],.329),
        'observed_PNG_z_not_preserved'=>wpClose($saved['PNG']['state']['white_point']['z'],.3583),
        'observed_MIFF_z_not_preserved'=>wpClose($saved['MIFF']['state']['white_point']['z'],.3583),
        'RGB_preserved'=>$saved['PNG']['state']['RGB16_sha256']===$sourceState['RGB16_sha256']&&$saved['MIFF']['state']['RGB16_sha256']===$sourceState['RGB16_sha256'],
        'source_preserved'=>wpState($image)===$sourceState]]);
echo "white-point-serialization.png\nserialization-png8.png\nserialization-miff8.png\nwhite-point-data.png\nwhite-point-data.miff\nmetrics.json\nsaved-formats=2 actual-white-points-in-metrics=1 RGB-unchanged=1\n";

В RAM принято ненормированное z=.123. Реально открытые PNG и MIFF дали x=.3127,y=.3290,z=.3583, сохранив все RGB16. Значения каждого этапа записаны в metrics.json. Это наблюдение конкретных кодеров, а не допустимое описание рабочего sRGB-файла или обещание переносимости произвольного z. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-serialization.png
serialization-png8.png
serialization-miff8.png
white-point-data.png
white-point-data.miff
metrics.json
saved-formats=2 actual-white-points-in-metrics=1 RGB-unchanged=1

В наблюдении RAM сохранила z=.123, а оба реально прочитанных формата дали z=.3583 при x=.3127,y=.3290. Эти этапы записаны раздельно в metrics.json. Не заменяйте наблюдение общей формулой и не обещайте, что любой формат сохранит произвольный z. Равенство RGB проверяется отдельно от сохранения метаданных; SHA файла относится к байтам контейнера. Настройки cHRM/sRGB/iCCP здесь относятся к отдельному диагностическому PNG, а не являются универсальным рецептом обработки чужих профилей.

Наконец, к нашему известному sRGB-входу присоединяется CC0 sRGB ICC. Первое присоединение к непрофилированному входу лишь описывает уже известные данные. На экспериментальной копии задаётся (.4,.3,.3), чтобы показать границу setter: он меняет атрибут, сохраняя прежние RGB и байты ICC. Прочитанный PNG вернул (.4,.3,.3583), хотя 1−.4−.3=.3. Значит, нельзя объявить универсальным правилом «кодер всегда вычисляет z=1−x−y». Это намеренно потенциально несогласованное описание; не публикуйте такую копию как выполненный баланс белого.

Разделить white point, белый пиксель и ICC; поймать четыре ошибки

На экспериментальной профилированной копии white point стал (.4,.3,.3) в RAM; настоящий PNG прочитан как (.4,.3,.3583). RGB, белый пиксель и байты ICC остались прежними. Две точки на графике показывают изменённое описание. Native принял неверные координаты; наша прикладная политика отвергла их. Четыре ошибки сохранены по классу/сообщению.

Разделить white point, белый пиксель и ICC; поймать четыре ошибкиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$profiled=clone $image;
$profiled->profileImage('icc',(string)file_get_contents(__DIR__.'/target-srgb.icc'));
$before=wpState($profiled);$beforeView=clone $profiled;
$returned=$profiled->setImageWhitePoint(0.4,0.3,0.3);
$point=$profiled->getImageWhitePoint();$after=wpState($profiled);
$saved=wpSaveRead($profiled,'profiled-data.png','png');
$chart=wpChart(['before'=>$before['white_point'],'after'=>$point]);
$images=['before'=>wpImage($beforeView,'workflow-before8.png'),'after'=>wpImage($profiled,'workflow-after8.png'),'chart'=>wpImage($chart,'workflow-chart8.png')];
$rects=wpCompare([$beforeView,$profiled,$chart],'white-point-workflow.png');
$unchecked=clone $image;$uncheckedReturn=$unchecked->setImageWhitePoint(-.2,1.4,9.0);$uncheckedState=wpState($unchecked);
$policyError=wpTry(fn()=>wpValidate(['x'=>-.2,'y'=>1.4,'z'=>9.0]));
$errors['missing_z']=wpTry(fn()=>(clone $image)->setImageWhitePoint(.3127,.329));
$errors['bad_type']=wpTry(fn()=>(clone $image)->setImageWhitePoint('not-a-coordinate',.329,.3583));
$errors['empty_get']=wpTry(fn()=>(new Imagick())->getImageWhitePoint());
$errors['empty_set']=wpTry(fn()=>(new Imagick())->setImageWhitePoint(.3127,.329,.3583));
$checks=['setter_true'=>$returned===true,'RAM_point'=>wpClose($point['x'],.4)&&wpClose($point['y'],.3)&&wpClose($point['z'],.3),
    'RGB_not_converted'=>$before['RGB16_sha256']===$after['RGB16_sha256'],'white_pixel_unchanged'=>$before['white_pixel']===$after['white_pixel'],
    'ICC_unchanged'=>$before['icc_sha256']===$after['icc_sha256']&&$after['icc_sha256']!==null,
    'PNG_RGB_ICC_preserved'=>$saved['state']['RGB16_sha256']===$after['RGB16_sha256']&&$saved['state']['icc_sha256']===$after['icc_sha256'],
    'observed_PNG_white_point'=>wpClose($saved['state']['white_point']['x'],.4)&&wpClose($saved['state']['white_point']['y'],.3)&&wpClose($saved['state']['white_point']['z'],.3583),
    'API_accepts_invalid'=>$uncheckedReturn===true&&wpClose($uncheckedState['white_point']['x'],-.2),
    'policy_rejects_invalid'=>($policyError['error']['class']??null)==='InvalidArgumentException','source_preserved'=>wpState($image)===$sourceState];
foreach($errors as $name=>$record){$checks['caught_'.$name]=isset($record['error']);}
wpDiagnostic('white-point-workflow',['executed_apis'=>['setImageWhitePoint','getImageWhitePoint'],'returned'=>$returned,'point'=>$point,
    'before'=>$before,'after'=>$after,'saved'=>$saved,'images'=>$images,'unchecked'=>['returned'=>$uncheckedReturn,'state'=>$uncheckedState],
    'policy_error'=>$policyError,'errors'=>$errors,'panel_keys'=>['before','after','chart'],'panel_geometry'=>$rects,
    'source_unchanged'=>wpState($image)===$sourceState,'checks'=>$checks]);
echo "white-point-workflow.png\nworkflow-before8.png\nworkflow-after8.png\nworkflow-chart8.png\nprofiled-data.png\nmetrics.json\nRGB-unchanged=1 ICC-unchanged=1 white-pixel-unchanged=1 errors=4 policy-rejection=1\n";

На экспериментальной профилированной копии white point стал (.4,.3,.3) в RAM; настоящий PNG прочитан как (.4,.3,.3583). RGB, белый пиксель и байты ICC остались прежними. Две точки на графике показывают изменённое описание. Native принял неверные координаты; наша прикладная политика отвергла их. Четыре ошибки сохранены по классу/сообщению. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-workflow.png
workflow-before8.png
workflow-after8.png
workflow-chart8.png
profiled-data.png
metrics.json
RGB-unchanged=1 ICC-unchanged=1 white-pixel-unchanged=1 errors=4 policy-rejection=1
СитуацияЧто различать
Native принял (-.2,1.4,9)True подтверждает запись, не допустимость координат. Наша политика finite/[0,1]/y>0/сумма1 — отдельное правило проекта.
Два аргумента вместо трёхArgumentCountError в IM7, а не ошибка кодирования PNG.
Строка вместо floatTypeError; не маскируем её принудительным приведением.
Пустые getter/setterImagickException; объект должен содержать изображение.
Те же RGB, white pixel и ICCЦветовая обработка не выполнена одним присваиванием white point.

WpTry сохраняет класс и сообщение четырёх реальных ошибок; policy_error отдельно относится к нашей функции проверки. Это аппарат демонстрации для полного сценария, а не обязательная сложность первого getter. На больших файлах экспорт всех RGB для диагностики требует работы и памяти по числу пикселей; в обычном каталоге не нужен полный учебный аудит при каждом запросе. Сохраняйте исходный профиль и проверяйте настоящий результат там, где меняется формат.

Сохранить два полных официальных контракта и границы применения

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

Imagick::getImageWhitePoint(): array

Аргументов нет. Возвращается ассоциативный массив с координатами белой точки текущего изображения. Официальный XML описывает ключи x и y; точный binding IM7 добавляет z, тогда как IM6 возвращает x,y. Выбор $point['x'] читает поле массива, а не вызывает поиск белого пикселя. Getter не анализирует освещение, не оценивает средний цвет сцены и не меняет изображение.

РезультатКак читать
x,yCIE-цветность записанной белой точки, безразмерные значения.
z в IM7Третье поле объекта. Не обещайте перенос произвольного z через сохранение; читайте настоящий файл обратно.
Не являетсяRGB белого фона, цветовой температурой камеры, ICC PCS white или результатом автоматического баланса белого.

Официальная доступность: PECL imagick 2, PECL imagick 3. Ни одна из двух записей не отмечена deprecated/removed в принятом официальном инвентаре. Полный контракт ошибок указывает ImagickException. В реальном опыте пустые getter/setter дали «Can not process empty Imagick object»; строка вместо float — TypeError. Перед обращением объект должен содержать изображение. Работает текущее изображение последовательности; наш проект открывает один PNG и меняет clone.

Не путайте белую точку с белым пикселем. У нашего известного sRGB-входа white point соответствует D65 (.3127,.3290), а белый фон имеет RGB(255,255,255). Изменение атрибута не меняет эти RGB. D50, используемая в ICC Profile Connection Space для связи профилей, относится к другой роли и не означает, что исходный sRGB-файл следует пометить D50. Для известного исходного/целевого профиля нужен отдельный реальный ICC-маршрут.

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

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageWhitePoint</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity white point as an associative 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 white point as an associative array with the keys
   "x" and "y".
  </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::setImageWhitePoint(float $x, float $y): bool

Метод задаёт CIE-координаты белой точки в метаданных текущего изображения. Полный официальный XML содержит два обязательных float x,y. В точных исходниках Imagick 3.8.1 ветка IM6 принимает два аргумента, а ветка IM7 — три обязательных float x,y,z. Проверенные программы используют IM7. Вызов только с двумя числами там даёт ArgumentCountError. Версия PHP сама по себе эту разницу не определяет.

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

Возвращается bool true при успешной записи. Точная Wand-реализация присваивает chromaticity.white_point.x/y/z и не вызывает цветовое преобразование, баланс белого или хроматическую адаптацию. RGB-пиксели и вложенный ICC от этой записи не меняются. Native не проверяет нашу нормировку: неверные (-.2,1.4,9) принимаются. Прикладная политика проверяется отдельно, а true не является сертификатом корректного профиля.

Официальная доступность: PECL imagick 2, PECL imagick 3. Ни одна из двух записей не отмечена deprecated/removed в принятом официальном инвентаре. Полный контракт ошибок указывает ImagickException. В реальном опыте пустые getter/setter дали «Can not process empty Imagick object»; строка вместо float — TypeError. Перед обращением объект должен содержать изображение. Работает текущее изображение последовательности; наш проект открывает один PNG и меняет clone.

Не путайте белую точку с белым пикселем. У нашего известного sRGB-входа white point соответствует D65 (.3127,.3290), а белый фон имеет RGB(255,255,255). Изменение атрибута не меняет эти RGB. D50, используемая в ICC Profile Connection Space для связи профилей, относится к другой роли и не означает, что исходный sRGB-файл следует пометить D50. Для известного исходного/целевого профиля нужен отдельный реальный ICC-маршрут.

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

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageWhitePoint</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity white 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 и запись в распакованную папку. Каждый ZIP содержит все объявленные входы и helper; выполните php example.php. Фактическая среда — PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows. Версии фиксируют наблюдение, а не обещают последнюю или любую сборку. Исходник собственный, профиль из закреплённой CC0-коллекции Compact-ICC-Profiles, Open Sans без изменений по Apache 2.0; обе лицензии приложены.

Упражнение: коллега заменил координаты D65 на D50 и назвал это исправлением жёлтого оттенка фото. Проверьте отдельно white point, RGB белого участка и ICC. Ответ для наших setter-вызовов: изменилось описание, но RGB и профиль не преобразованы. Выбор модели настоящего баланса белого или ICC-конверсии требует известного входа и другой операции. Следующие связанные материалы: настоящий ICC-переход, первичные R/G/B и назначение пространства и преобразование.

Полный вспомогательный PHP из каждого ZIP
<?php
declare(strict_types=1);
function wpRestore():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 wpHash(Imagick $image):string {return hash('sha256',json_encode($image->exportImagePixels(0,0,400,320,'RGB',Imagick::PIXEL_SHORT),JSON_THROW_ON_ERROR));}
function wpState(Imagick $image):array {
    return ['white_point'=>$image->getImageWhitePoint(),'RGB16_sha256'=>wpHash($image),
        'white_pixel'=>$image->getImagePixelColor(0,0)->getColor(1),
        'icc_sha256'=>in_array('icc',$image->getImageProfiles('*',false),true)?hash('sha256',$image->getImageProfile('icc')):null];
}
function wpClose(float $a,float $b):bool {return abs($a-$b)<1.0e-9;}
function wpView(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 wpSaveView(Imagick $image,string $filename):void {if(!wpView($image)->writeImage(__DIR__.'/'.$filename)){throw new RuntimeException('Cannot save display PNG');}}
function wpImage(Imagick $image,string $filename):array {
    $state=wpState($image);wpSaveView($image,$filename);$read=new Imagick(__DIR__.'/'.$filename);
    return $state+['geometry'=>[$image->getImageWidth(),$image->getImageHeight()],
        'encoded_png'=>['filename'=>$filename,'RGB16_sha256'=>wpHash($read),'white_pixel'=>$read->getImagePixelColor(0,0)->getColor(1)],
        'display_basis'=>'Stripped RGB8 clone; not the tagged data file'];
}
function wpCompare(array $images,string $filename):array {
    $board=new Imagick();$board->newImage(400*count($images),320,'white','png');$rects=[];
    foreach($images as $i=>$image){$board->compositeImage(wpView($image),Imagick::COMPOSITE_OVER,400*$i,0);$rects[]=['x'=>400*$i,'y'=>0,'width'=>400,'height'=>320];}
    wpSaveView($board,$filename);return $rects;
}
function wpChart(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,.2,.4,.6,.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,.2,.4,.6,.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');$i=0;
    foreach($points as $name=>$point){$x=50+375*$point['x'];$y=280-300*$point['y'];$draw->setFillColor(['#167c80','#a14b5a'][$i%2]);$draw->circle($x,$y,$x+5,$y);$draw->annotation($x+9,$y+18+14*$i,(string)$name);$draw->annotation(75,52+18*$i,sprintf('%s x=%.4f y=%.4f',$name,$point['x'],$point['y']));$i++;}
    $chart->drawImage($draw);return $chart;
}
function wpSaveRead(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'=>wpState($read)];
}
function wpTry(callable $operation):array {try{return ['returned'=>$operation()];}catch(Throwable $e){return ['error'=>['class'=>get_class($e),'message'=>$e->getMessage()]];}}
function wpValidate(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)>1.0e-9){throw new InvalidArgumentException('Project requires y>0 and x+y+z=1');}
}
function wpDiagnostic(string $id,array $data):void {
    $doc=['schema'=>'aen-white-point-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');}
}

WpRestore восстанавливает точные данные по SHA. WpState читает координаты, RGB16, ICC и пиксель (0,0) раздельно; wpChart только рисует переданные точки с делениями осей. WpImage измеряет native-объект и отдельно открывает записанный общий RGB8-preview. WpSaveRead сохраняет настоящий tagged dataoutput, а wpCompare соединяет панели без изменения масштаба. Все изучаемые getter/setter остаются явными в основном example.php, никакого скрытого баланса белого helper не делает.

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

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

Imagick::getImageWhitePointПолучить отчёт о белой точке и отличить описание от обработки цвета

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageWhitePoint(): array

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

Imagick::getImageWhitePoint(): array

Аргументов нет. Возвращается ассоциативный массив с координатами белой точки текущего изображения. Официальный XML описывает ключи x и y; точный binding IM7 добавляет z, тогда как IM6 возвращает x,y. Выбор $point['x'] читает поле массива, а не вызывает поиск белого пикселя. Getter не анализирует освещение, не оценивает средний цвет сцены и не меняет изображение.

РезультатКак читать
x,yCIE-цветность записанной белой точки, безразмерные значения.
z в IM7Третье поле объекта. Не обещайте перенос произвольного z через сохранение; читайте настоящий файл обратно.
Не являетсяRGB белого фона, цветовой температурой камеры, ICC PCS white или результатом автоматического баланса белого.

Официальная доступность: PECL imagick 2, PECL imagick 3. Ни одна из двух записей не отмечена deprecated/removed в принятом официальном инвентаре. Полный контракт ошибок указывает ImagickException. В реальном опыте пустые getter/setter дали «Can not process empty Imagick object»; строка вместо float — TypeError. Перед обращением объект должен содержать изображение. Работает текущее изображение последовательности; наш проект открывает один PNG и меняет clone.

Не путайте белую точку с белым пикселем. У нашего известного sRGB-входа white point соответствует D65 (.3127,.3290), а белый фон имеет RGB(255,255,255). Изменение атрибута не меняет эти RGB. D50, используемая в ICC Profile Connection Space для связи профилей, относится к другой роли и не означает, что исходный sRGB-файл следует пометить D50. Для известного исходного/целевого профиля нужен отдельный реальный ICC-маршрут.

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

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>array</type><methodname>Imagick::getImageWhitePoint</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the chromaticity white point as an associative 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 white point as an associative array with the keys
   "x" and "y".
  </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
-->

Получить отчёт D65 и показать точку на настоящем xy-графике

Прочитано описание белой точки собственного PNG: x=.3127,y=.3290,z=.3583 в проверенной IM7-сборке. PHP построил график именно полученной пары xy. Рисунок товара и его белый фон не перекрашивались.

Получить отчёт D65 и показать точку на настоящем xy-графикеПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$point=$image->getImageWhitePoint();
$chart=wpChart(['D65'=>$point]);
$images=['source'=>wpImage($image,'source-preview8.png'),'chart'=>wpImage($chart,'first-chart8.png')];
$rects=wpCompare([$image,$chart],'white-point-first.png');
wpDiagnostic('white-point-first',['executed_api'=>'getImageWhitePoint','point'=>$point,'before'=>$sourceState,'images'=>$images,
    'chart_basis'=>['origin'=>[50,280],'scale'=>[375,300],'units'=>'dimensionless CIE xy'],
    'panel_keys'=>['source','chart'],'panel_geometry'=>$rects,'source_unchanged'=>wpState($image)===$sourceState,
    'checks'=>['known_D65_xy'=>wpClose($point['x'],.3127)&&wpClose($point['y'],.3290),
        'IM7_three_coordinates'=>array_keys($point)===['x','y','z'],'source_preserved'=>wpState($image)===$sourceState]]);
echo "white-point-first.png\nsource-preview8.png\nfirst-chart8.png\nmetrics.json\nD65 x=0.3127 y=0.3290 z=0.3583 RGB-unchanged=1\n";

Прочитано описание белой точки собственного PNG: x=.3127,y=.3290,z=.3583 в проверенной IM7-сборке. PHP построил график именно полученной пары xy. Рисунок товара и его белый фон не перекрашивались. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-first.png
source-preview8.png
first-chart8.png
metrics.json
D65 x=0.3127 y=0.3290 z=0.3583 RGB-unchanged=1

Задать известный D65 на копии и прочитать его обратно

Setter вернул true, getter прочитал D65. RGB16 и белый пиксель (0,0) сохранились; ICC не появился. Здесь декларируется известная характеристика собственного входа, а не исправляется оттенок фотографии.

Задать известный D65 на копии и прочитать его обратноПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$declared=clone $image;
$returned=$declared->setImageWhitePoint(0.3127,0.3290,0.3583);
$point=$declared->getImageWhitePoint();
$after=wpState($declared);
$images=['before'=>wpImage($image,'minimal-before8.png'),'after'=>wpImage($declared,'minimal-after8.png')];
$rects=wpCompare([$image,$declared],'white-point-minimal.png');
wpDiagnostic('white-point-minimal',['executed_apis'=>['setImageWhitePoint','getImageWhitePoint'],'returned'=>$returned,'point'=>$point,
    'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>wpState($image)===$sourceState,
    'checks'=>['setter_true'=>$returned===true,'known_D65'=>wpClose($point['x'],.3127)&&wpClose($point['y'],.329)&&wpClose($point['z'],.3583),
        'RGB_not_converted'=>$after['RGB16_sha256']===$sourceState['RGB16_sha256'],'white_pixel_unchanged'=>$after['white_pixel']===$sourceState['white_pixel'],
        'ICC_not_created'=>$after['icc_sha256']===null,'source_preserved'=>wpState($image)===$sourceState]]);
echo "white-point-minimal.png\nminimal-before8.png\nminimal-after8.png\nmetrics.json\nsetter=true D65-readback=1 RGB-unchanged=1 white-pixel-unchanged=1\n";

Setter вернул true, getter прочитал D65. RGB16 и белый пиксель (0,0) сохранились; ICC не появился. Здесь декларируется известная характеристика собственного входа, а не исправляется оттенок фотографии. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-minimal.png
minimal-before8.png
minimal-after8.png
metrics.json
setter=true D65-readback=1 RGB-unchanged=1 white-pixel-unchanged=1
Imagick::setImageWhitePointПолучить отчёт о белой точке и отличить описание от обработки цвета

PECL imagick 2, PECL imagick 3 · imagick

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

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

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

Метод задаёт CIE-координаты белой точки в метаданных текущего изображения. Полный официальный XML содержит два обязательных float x,y. В точных исходниках Imagick 3.8.1 ветка IM6 принимает два аргумента, а ветка IM7 — три обязательных float x,y,z. Проверенные программы используют IM7. Вызов только с двумя числами там даёт ArgumentCountError. Версия PHP сама по себе эту разницу не определяет.

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

Возвращается bool true при успешной записи. Точная Wand-реализация присваивает chromaticity.white_point.x/y/z и не вызывает цветовое преобразование, баланс белого или хроматическую адаптацию. RGB-пиксели и вложенный ICC от этой записи не меняются. Native не проверяет нашу нормировку: неверные (-.2,1.4,9) принимаются. Прикладная политика проверяется отдельно, а true не является сертификатом корректного профиля.

Официальная доступность: PECL imagick 2, PECL imagick 3. Ни одна из двух записей не отмечена deprecated/removed в принятом официальном инвентаре. Полный контракт ошибок указывает ImagickException. В реальном опыте пустые getter/setter дали «Can not process empty Imagick object»; строка вместо float — TypeError. Перед обращением объект должен содержать изображение. Работает текущее изображение последовательности; наш проект открывает один PNG и меняет clone.

Не путайте белую точку с белым пикселем. У нашего известного sRGB-входа white point соответствует D65 (.3127,.3290), а белый фон имеет RGB(255,255,255). Изменение атрибута не меняет эти RGB. D50, используемая в ICC Profile Connection Space для связи профилей, относится к другой роли и не означает, что исходный sRGB-файл следует пометить D50. Для известного исходного/целевого профиля нужен отдельный реальный ICC-маршрут.

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

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageWhitePoint</methodname>
   <methodparam><type>float</type><parameter>x</parameter></methodparam>
   <methodparam><type>float</type><parameter>y</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image chromaticity white 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
-->

Задать известный D65 на копии и прочитать его обратно

Setter вернул true, getter прочитал D65. RGB16 и белый пиксель (0,0) сохранились; ICC не появился. Здесь декларируется известная характеристика собственного входа, а не исправляется оттенок фотографии.

Задать известный D65 на копии и прочитать его обратноПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$declared=clone $image;
$returned=$declared->setImageWhitePoint(0.3127,0.3290,0.3583);
$point=$declared->getImageWhitePoint();
$after=wpState($declared);
$images=['before'=>wpImage($image,'minimal-before8.png'),'after'=>wpImage($declared,'minimal-after8.png')];
$rects=wpCompare([$image,$declared],'white-point-minimal.png');
wpDiagnostic('white-point-minimal',['executed_apis'=>['setImageWhitePoint','getImageWhitePoint'],'returned'=>$returned,'point'=>$point,
    'before'=>$sourceState,'after'=>$after,'images'=>$images,'panel_keys'=>['before','after'],'panel_geometry'=>$rects,
    'source_unchanged'=>wpState($image)===$sourceState,
    'checks'=>['setter_true'=>$returned===true,'known_D65'=>wpClose($point['x'],.3127)&&wpClose($point['y'],.329)&&wpClose($point['z'],.3583),
        'RGB_not_converted'=>$after['RGB16_sha256']===$sourceState['RGB16_sha256'],'white_pixel_unchanged'=>$after['white_pixel']===$sourceState['white_pixel'],
        'ICC_not_created'=>$after['icc_sha256']===null,'source_preserved'=>wpState($image)===$sourceState]]);
echo "white-point-minimal.png\nminimal-before8.png\nminimal-after8.png\nmetrics.json\nsetter=true D65-readback=1 RGB-unchanged=1 white-pixel-unchanged=1\n";

Setter вернул true, getter прочитал D65. RGB16 и белый пиксель (0,0) сохранились; ICC не появился. Здесь декларируется известная характеристика собственного входа, а не исправляется оттенок фотографии. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

Ожидаемый вывод программы в проверенной среде
white-point-minimal.png
minimal-before8.png
minimal-after8.png
metrics.json
setter=true D65-readback=1 RGB-unchanged=1 white-pixel-unchanged=1

Разделить white point, белый пиксель и ICC; поймать четыре ошибки

На экспериментальной профилированной копии white point стал (.4,.3,.3) в RAM; настоящий PNG прочитан как (.4,.3,.3583). RGB, белый пиксель и байты ICC остались прежними. Две точки на графике показывают изменённое описание. Native принял неверные координаты; наша прикладная политика отвергла их. Четыре ошибки сохранены по классу/сообщению.

Разделить white point, белый пиксель и ICC; поймать четыре ошибкиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/white-point-fixture.php';
wpRestore();
$image=new Imagick(__DIR__.'/source.png');
$sourceState=wpState($image);
$profiled=clone $image;
$profiled->profileImage('icc',(string)file_get_contents(__DIR__.'/target-srgb.icc'));
$before=wpState($profiled);$beforeView=clone $profiled;
$returned=$profiled->setImageWhitePoint(0.4,0.3,0.3);
$point=$profiled->getImageWhitePoint();$after=wpState($profiled);
$saved=wpSaveRead($profiled,'profiled-data.png','png');
$chart=wpChart(['before'=>$before['white_point'],'after'=>$point]);
$images=['before'=>wpImage($beforeView,'workflow-before8.png'),'after'=>wpImage($profiled,'workflow-after8.png'),'chart'=>wpImage($chart,'workflow-chart8.png')];
$rects=wpCompare([$beforeView,$profiled,$chart],'white-point-workflow.png');
$unchecked=clone $image;$uncheckedReturn=$unchecked->setImageWhitePoint(-.2,1.4,9.0);$uncheckedState=wpState($unchecked);
$policyError=wpTry(fn()=>wpValidate(['x'=>-.2,'y'=>1.4,'z'=>9.0]));
$errors['missing_z']=wpTry(fn()=>(clone $image)->setImageWhitePoint(.3127,.329));
$errors['bad_type']=wpTry(fn()=>(clone $image)->setImageWhitePoint('not-a-coordinate',.329,.3583));
$errors['empty_get']=wpTry(fn()=>(new Imagick())->getImageWhitePoint());
$errors['empty_set']=wpTry(fn()=>(new Imagick())->setImageWhitePoint(.3127,.329,.3583));
$checks=['setter_true'=>$returned===true,'RAM_point'=>wpClose($point['x'],.4)&&wpClose($point['y'],.3)&&wpClose($point['z'],.3),
    'RGB_not_converted'=>$before['RGB16_sha256']===$after['RGB16_sha256'],'white_pixel_unchanged'=>$before['white_pixel']===$after['white_pixel'],
    'ICC_unchanged'=>$before['icc_sha256']===$after['icc_sha256']&&$after['icc_sha256']!==null,
    'PNG_RGB_ICC_preserved'=>$saved['state']['RGB16_sha256']===$after['RGB16_sha256']&&$saved['state']['icc_sha256']===$after['icc_sha256'],
    'observed_PNG_white_point'=>wpClose($saved['state']['white_point']['x'],.4)&&wpClose($saved['state']['white_point']['y'],.3)&&wpClose($saved['state']['white_point']['z'],.3583),
    'API_accepts_invalid'=>$uncheckedReturn===true&&wpClose($uncheckedState['white_point']['x'],-.2),
    'policy_rejects_invalid'=>($policyError['error']['class']??null)==='InvalidArgumentException','source_preserved'=>wpState($image)===$sourceState];
foreach($errors as $name=>$record){$checks['caught_'.$name]=isset($record['error']);}
wpDiagnostic('white-point-workflow',['executed_apis'=>['setImageWhitePoint','getImageWhitePoint'],'returned'=>$returned,'point'=>$point,
    'before'=>$before,'after'=>$after,'saved'=>$saved,'images'=>$images,'unchecked'=>['returned'=>$uncheckedReturn,'state'=>$uncheckedState],
    'policy_error'=>$policyError,'errors'=>$errors,'panel_keys'=>['before','after','chart'],'panel_geometry'=>$rects,
    'source_unchanged'=>wpState($image)===$sourceState,'checks'=>$checks]);
echo "white-point-workflow.png\nworkflow-before8.png\nworkflow-after8.png\nworkflow-chart8.png\nprofiled-data.png\nmetrics.json\nRGB-unchanged=1 ICC-unchanged=1 white-pixel-unchanged=1 errors=4 policy-rejection=1\n";

На экспериментальной профилированной копии white point стал (.4,.3,.3) в RAM; настоящий PNG прочитан как (.4,.3,.3583). RGB, белый пиксель и байты ICC остались прежними. Две точки на графике показывают изменённое описание. Native принял неверные координаты; наша прикладная политика отвергла их. Четыре ошибки сохранены по классу/сообщению. ZIP самодостаточен: example.php, собственный PNG/CC0 ICC/Open Sans в base64, две лицензии и white-point-fixture.php. Распакуйте рядом и выполните php example.php. wpRestore проверяет SHA и восстанавливает входы. wpState отдельно читает white point, все RGB16, ICC и белый пиксель; wpChart рисует переданные из основного кода реальные координаты. wpImage/wpCompare сохраняют отдельные stripped RGB8-копии без масштабирования, а wpSaveRead — настоящий tagged PNG/MIFF и его readback. Все изучаемые вызовы видны в example.php; полный helper раскрыт в последнем разделе. Среда: PHP 8.5.11 / Imagick 3.8.1 / ImageMagick 7.1.1-46 Q16, Windows.

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

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

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

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

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