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

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

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

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

Глава 388 · После объектов, клонирования и основных операций с изображениями; совместимость с IM6

Imagick: прозрачные округлённые углы, matte и opacity — сохранить результат и перенести старый код

Создать настоящий PNG, отличить флаг и численную alpha от файла, сохранить отверстия при ослаблении и явно получить непрозрачное превью.

Получить настоящий округлённый PNG и сохранить исходник

Для карточки товара нужен настоящий скачиваемый PNG с мягко округлёнными прозрачными углами. Затем эту карточку надо сделать менее заметной на странице и подготовить отдельное непрозрачное превью. В старом обработчике легко получить чёрные углы: выключить matte или присвоить всем пикселям одну opacity. Сначала создадим понятный результат, затем посмотрим, какие изменения действительно сохраняют отверстия.

Собственный исходник 400 × 320 и настоящий округлённый PNG на отдельной шахматной подложке
Собственный исходник 400 × 320 и настоящий округлённый PNG на отдельной шахматной подложке
$image = clone $source;
$image->roundCorners(40, 40);

$source — прочитанное исходное изображение, clone создаёт отдельный объект $image. Стрелка -> вызывает метод этого объекта; два числа в скобках задают закругление по горизонтали и вертикали. Запятые разделяют аргументы, точка с запятой заканчивает инструкцию. Этот вызов меняет объект, но сам по себе не отправляет файл посетителю и не записывает его на диск. Следующая полная программа сохранит реальный round-raw8.png с alpha и отдельный просмотр, где отверстия видны на шахматке.

Использован собственный рисунок коробки и кружки, 400 × 320; он включён в каждый самостоятельный архив. Шахматка не записана в прозрачный результат: это отдельная подложка иллюстрации. Для оформления картинки только на веб-странице достаточно CSS border-radius; здесь нужен изменённый файл, который можно скачать или обработать дальше. Замена цвета и alpha и фон решают другие части обработки.

Получить настоящий PNG с округлёнными прозрачными углами

Размер остался 400 × 320; углы настоящего PNG прозрачны, центр непрозрачен. Шахматка присутствует только в отдельном просмотре. Исходник сохранён.

Получить настоящий PNG с округлёнными прозрачными угламиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$image=clone $source;
$call=acCall('round',fn()=>$image->roundCorners(40,40));
$row=acImage($image,'round-raw8.png');
acView($image,'legacy-alpha-corners-round.png');acView($source,'source-preview8.png');
acDiagnostic('alpha-corners-round-minimal',['executed_api'=>'roundCorners','calls'=>['round'=>acRecord($call)],'images'=>['rounded'=>$row],
    'source_unchanged'=>acHash($source)===$before,'checks'=>['returned_true'=>$call['value']===true,
        'actual_no_deprecations'=>$call['deprecations']===0,'same_geometry'=>$row['geometry']===[400,320],
        'corner_transparent'=>$row['samples']['corner']['a']==0.0&&$row['encoded_png']['samples']['corner']['a']==0.0,
        'center_opaque'=>$row['samples']['center']['a']==1.0,'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-round.png\nround-raw8.png\nsource-preview8.png\nmetrics.json\nrounded=1 geometry=400x320 corner-alpha=0 center-alpha=1 source-unchanged=1\n";

Размер остался 400 × 320; углы настоящего PNG прозрачны, центр непрозрачен. Шахматка присутствует только в отдельном просмотре. Исходник сохранён. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-round.png
round-raw8.png
source-preview8.png
metrics.json
rounded=1 geometry=400x320 corner-alpha=0 center-alpha=1 source-unchanged=1

Все новые программы проверяются в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16, Ubuntu WSL. Группа исторически неоднородна: официальные статусы и фактические предупреждения разобраны в карточках ниже. Мы не утверждаем, что все шесть методов одинаково доступны или одинаково устарели на любой версии IM7.

Разделить численные alpha, флаг matte, файл и отдельное цветовое свойство

Три состояния одного округлённого результата: matte активна, выключена и включена заново; чёрные углы не являются прежними прозрачными отверстиями
Три состояния одного округлённого результата: matte активна, выключена и включена заново; чёрные углы не являются прежними прозрачными отверстиями
ВеличинаЧто означаетКак она отличается от других
RGBЦвет пикселя, например скрытый чёрный в прозрачном углу.Сам цвет не сообщает, виден ли пиксель.
Численная alphaВклад пикселя: 0 прозрачно, 1 непрозрачно.В отключённом matte может сохраняться как скрытое число.
Флаг matteПрименяет ли эта IM6-картинка alpha.False у getter не является ошибкой; активный true не означает наличие отверстий.
Alpha записанного PNGЧто действительно сохранил кодер и прочитал новый объект.При выключенной matte в этом примере PNG непрозрачен, хотя исходный объект ещё отдаёт скрытую A0.
Matte colorОтдельное поле цвета старого редактора.Не меняет автоматически RGB/alpha; приложение само выбирает, когда использовать его как фон.

Сравнение с трафаретом помогает только частично. Alpha задаёт пропускание каждой точки, а matte-флаг разрешает использовать эти числа в данной реализации. Но переключатель нельзя считать безвредным «снять и вернуть трафарет»: в IM6 включение из выключенного состояния сначала делает все alpha непрозрачными. Поэтому сохраним округлённый объект и изучим опасные действия на его копиях. Клонирование сохраняет отдельный рабочий вариант.

Файлы *-raw8.png — реальные RGBA8 после записи, а images.*.samples в metrics.json — численные значения объекта до экспорта. Рядом images.*.active_alpha и images.*.encoded_png.samples позволяют увидеть различие этапов. Мы не подменяем численную alpha у выключенного объекта тем, как выглядит его PNG. После повторного включения в данном IM6 исчезают уже сами прежние нули.

Выполнить короткие get/set-вызовы и сравнить два способа ослабления

Независимый matte color применяется только явным OVER; присваивание opacity заполняет углы, умножение alpha сохраняет их
Независимый matte color применяется только явным OVER; присваивание opacity заполняет углы, умножение alpha сохраняет их

Во всех архивах example.php лежит рядом с source.png.b64 и полным legacy-alpha-corners-fixture.php. acRestore проверяет контрольную сумму и восстанавливает PNG, acSource открывает его. Изучаемые вызовы видны в основном коде. acCall принимает короткую функцию fn()=>..., выполняет её под временным обработчиком только E_DEPRECATED и возвращает прежний обработчик через finally. acImage измеряет объект и отдельно читает созданный PNG, acCompare показывает отдельные копии на шахматке. Helper целиком открыт в последнем разделе; эти функции не являются встроенными методами Imagick. Стрелочные функции, функции и исключения помогают читать вспомогательную часть.

Флаг matte: нормальный false и невосстановленные отверстия

$hasMatte = $image->getImageMatte();
$image->setImageMatte(false);

$hasMatte получает логическое значение getter. Пустые скобки означают, что аргументов нет. False у непустого исходника — ответ «matte не активна»; true после округления означает активную alpha, а не успешность создания каждого отверстия. В setter передаётся bool false без кавычек. После выключения не надо сохранять этот вариант как прозрачный PNG. Следующая самостоятельная программа также показывает, что повторное true не возвращает утраченные углы.

Отличить флаг matte, сохранённые числа alpha и записанный PNG

Getter последовательно вернул false/true/false/true. После выключения matte численные alpha углов ещё 0, но записанный PNG уже непрозрачен. Повторное включение установило углам alpha 1: прежние отверстия не вернулись.

Отличить флаг matte, сохранённые числа alpha и записанный PNGПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;
$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;
$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$images=['rounded'=>acImage($rounded,'matte-rounded-raw8.png'),'disabled'=>acImage($disabled,'matte-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'matte-reenabled-raw8.png')];
$rects=acCompare([$rounded,$disabled,$reenabled],'legacy-alpha-corners-matte.png');
$checks=['false_is_valid_result'=>$calls['get_source']['value']===false,
    'flags_change'=>$calls['get_rounded']['value']===true&&$calls['get_disabled']['value']===false&&$calls['get_reenabled']['value']===true,
    'disable_keeps_latent_alpha'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['active_alpha']===false,
    'disabled_PNG_is_opaque'=>$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
    'reenable_loses_holes'=>$images['reenabled']['samples']['corner']['a']==1.0,
    'source_preserved'=>acHash($source)===$before];
foreach(['get_source','get_rounded','get_disabled','get_reenabled'] as $key){$checks[$key.'_two_warnings']=$calls[$key]['deprecations']===2;}
foreach(['disable','enable'] as $key){$checks[$key.'_true_no_warning']=$calls[$key]['value']===true&&$calls[$key]['deprecations']===0;}
acDiagnostic('alpha-corners-matte-minimal',['executed_apis'=>['getImageMatte','setImageMatte','roundCorners'],'calls'=>array_map('acRecord',$calls),'images'=>$images,
    'panel_keys'=>['rounded','disabled','reenabled'],'panel_geometry'=>$rects,'source_unchanged'=>acHash($source)===$before,'checks'=>$checks]);
echo "legacy-alpha-corners-matte.png\nmatte-rounded-raw8.png\nmatte-disabled-raw8.png\nmatte-reenabled-raw8.png\nmetrics.json\nmatte=0,1,0,1 disabled-latent-alpha=0 disabled-PNG-alpha=1 reenabled-alpha=1 source-unchanged=1\n";

Getter последовательно вернул false/true/false/true. После выключения matte численные alpha углов ещё 0, но записанный PNG уже непрозрачен. Повторное включение установило углам alpha 1: прежние отверстия не вернулись. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-matte.png
matte-rounded-raw8.png
matte-disabled-raw8.png
matte-reenabled-raw8.png
metrics.json
matte=0,1,0,1 disabled-latent-alpha=0 disabled-PNG-alpha=1 reenabled-alpha=1 source-unchanged=1

Matte color: сохранить настройку, получить копию и явно применить

$image->setImageMatteColor('#e8f2f8');
$pixel = $image->getImageMatteColor();

Строка #e8f2f8 — допустимое представление цвета. Setter записывает отдельную настройку, getter возвращает объект ImagickPixel, который можно передать как цвет подложки. Редактирование $pixel не является редактированием поля изображения. В полном примере полученную копию намеренно меняем на red и читаем настройку снова: сохранённый голубоватый цвет остаётся прежним. Только newImage с этим цветом и последующий OVER создают видимый фон.

Прочитать matte color и явно использовать его как фон превью

Setter сохранил цвет #e8f2f8 без изменения пикселей. Getter вернул независимый ImagickPixel: изменение полученной копии на red не затронуло сохранённый цвет. Только явная композиция на выбранном фоне создала непрозрачное превью.

Прочитать matte color и явно использовать его как фон превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$image=clone $source;
$calls['round']=acCall('round',fn()=>$image->roundCorners(40,40));$pixelsBefore=acHash($image);
$calls['set_color']=acCall('set_color',fn()=>$image->setImageMatteColor('#e8f2f8'));
$read=acCall('get_color',fn()=>$image->getImageMatteColor());
$firstRead=acRecord($read);$pixel=$read['value'];$pixel->setColor('red');
$again=acCall('get_after_pixel_edit',fn()=>$image->getImageMatteColor());
$backgroundColor=$again['value'];
$preview=new Imagick();$preview->newImage(400,320,$backgroundColor,'png');
$preview->compositeImage($image,Imagick::COMPOSITE_OVER,0,0);
$images=['rounded'=>acImage($image,'color-rounded-raw8.png'),'preview'=>acImage($preview,'color-preview8.png')];
$rects=acCompare([$image,$preview],'legacy-alpha-corners-color.png');$stored=$backgroundColor->getColor(1);
acDiagnostic('alpha-corners-color-minimal',['executed_apis'=>['setImageMatteColor','getImageMatteColor','roundCorners'],
    'calls'=>['round'=>acRecord($calls['round']),'set_color'=>acRecord($calls['set_color']),'get_color'=>$firstRead,'get_after_pixel_edit'=>acRecord($again)],
    'edited_returned_pixel'=>$pixel->getColor(1),'stored_color'=>$stored,'pixels_unchanged'=>acHash($image)===$pixelsBefore,'images'=>$images,
    'panel_keys'=>['rounded','preview'],'panel_geometry'=>$rects,'source_unchanged'=>acHash($source)===$before,
    'checks'=>['set_true_no_warning'=>$calls['set_color']['value']===true&&$calls['set_color']['deprecations']===0,
        'getter_new_Pixel'=>$read['value'] instanceof ImagickPixel&&$again['value'] instanceof ImagickPixel&&$read['value']!==$again['value'],
        'getter_one_warning'=>$read['deprecations']===1&&$again['deprecations']===1,
        'stored_color_independent'=>acClose($stored['r'],232/255)&&acClose($stored['g'],242/255)&&acClose($stored['b'],248/255),
        'setter_preserves_pixels'=>acHash($image)===$pixelsBefore,
        'explicit_preview_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-color.png\ncolor-rounded-raw8.png\ncolor-preview8.png\nmetrics.json\nstored-color=#e8f2f8 getter-copy-independent=1 setter-pixels-unchanged=1 explicit-preview=1 source-unchanged=1\n";

Setter сохранил цвет #e8f2f8 без изменения пикселей. Getter вернул независимый ImagickPixel: изменение полученной копии на red не затронуло сохранённый цвет. Только явная композиция на выбранном фоне создала непрозрачное превью. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-color.png
color-rounded-raw8.png
color-preview8.png
metrics.json
stored-color=#e8f2f8 getter-copy-independent=1 setter-pixels-unchanged=1 explicit-preview=1 source-unchanged=1

Общая opacity и сохранение прозрачных отверстий

$absolute->setImageOpacity(0.5);
$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY, 0.5, Imagick::CHANNEL_ALPHA);

0.5 — число с десятичной точкой, не строка и не процент 50. Первый метод присваивает это значение всем alpha. Второй явно выбирает умножение и канал alpha: старый 0 остаётся 0, старый 1 становится примерно 0.5. Константы после Imagick:: именуют операцию и канал. Для непрозрачного входа каналу сначала надо позволить участвовать в обработке; наш вход уже округлён и его alpha активна. В каждой строке используется своя копия, чтобы один опыт не менял вход другого.

Сопоставить присваивание общей opacity и ослабление готового слоя

setImageOpacity(0.5) заполнил прозрачные углы полупрозрачными чёрными пикселями. Умножение существующей alpha оставило отверстия. RGB сохранились; после PNG8 alpha центра составила соответственно 127/255 и 128/255.

Сопоставить присваивание общей opacity и ослабление готового слояПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$absolute=clone $rounded;$multiply=clone $rounded;
$calls['set_opacity']=acCall('set_opacity',fn()=>$absolute->setImageOpacity(0.5));
$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$images=['absolute'=>acImage($absolute,'opacity-absolute-raw8.png'),'multiply'=>acImage($multiply,'opacity-multiply-raw8.png')];
$rects=acCompare([$absolute,$multiply],'legacy-alpha-corners-opacity.png');
acDiagnostic('alpha-corners-opacity-minimal',['executed_apis'=>['setImageOpacity','roundCorners','evaluateImage'],'quantum'=>$quantum,
    'calls'=>array_map('acRecord',$calls),'images'=>$images,'panel_keys'=>['absolute','multiply'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>[
        'absolute_true_one_warning'=>$calls['set_opacity']['value']===true&&$calls['set_opacity']['deprecations']===1,
        'absolute_fills_holes'=>acClose($images['absolute']['samples']['corner']['a'],32767/$quantum),
        'multiply_preserves_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'multiply_center_half'=>acClose($images['multiply']['samples']['center']['a'],32768/$quantum),
        'RGB_preserved'=>acHash($absolute,'RGB')===acHash($rounded,'RGB')&&acHash($multiply,'RGB')===acHash($rounded,'RGB'),
        'PNG_stages_distinguished'=>acClose($images['absolute']['encoded_png']['samples']['center']['a'],127/255)&&acClose($images['multiply']['encoded_png']['samples']['center']['a'],128/255),
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-opacity.png\nopacity-absolute-raw8.png\nopacity-multiply-raw8.png\nmetrics.json\nabsolute-fills-holes=1 multiply-preserves-holes=1 PNG-alpha=127,128 source-unchanged=1\n";

setImageOpacity(0.5) заполнил прозрачные углы полупрозрачными чёрными пикселями. Умножение существующей alpha оставило отверстия. RGB сохранились; после PNG8 alpha центра составила соответственно 127/255 и 128/255. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-opacity.png
opacity-absolute-raw8.png
opacity-multiply-raw8.png
metrics.json
absolute-fills-holes=1 multiply-preserves-holes=1 PNG-alpha=127,128 source-unchanged=1

Имена opacity и alpha в старом Core используют противоположные внутренние шкалы, но публичный setImageOpacity принимает 0 для прозрачности и 1 для непрозрачности. В нашей Q16-сборке 0.5 превратилось в alpha 32 767 / 65 535; при multiply получено 32 768 / 65 535 в центре. После PNG8 это соответственно 127 / 255 и 128 / 255. Это измеренное округление, а не обещание идеального десятичного 0.5 во всех форматах.

Собрать полезные варианты, выбрать альтернативу и обработать реальные ошибки

Отдельное готовое превью и реальные альтернативы: явная маска, абсолютная alpha, ослабление слоя и другая геометрия legacy-маски
Отдельное готовое превью и реальные альтернативы: явная маска, абсолютная alpha, ослабление слоя и другая геометрия legacy-маски

Теперь старый редактор должен выдать три полезных варианта: округлённый прозрачный оригинал, более мягкий слой с теми же отверстиями и отдельное непрозрачное превью на выбранном фоне. Шесть изучаемых методов участвуют в одном сценарии, но опасные выключение/включение и абсолютная opacity изолированы на clone. Основной rounded не теряет прозрачность. Массив $calls сохраняет результаты и предупреждения, $images — численные измерения и сведения о реально созданных файлах. Массивы связывают эти подписанные результаты.

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1

Явная маска и точность замены старого вызова

Если переносим округление, можно явно создать маску нужного размера с прозрачными углами и применить DstIn. В следующем примере маска 400 × 320, её roundRectangle идёт от (0,0) до (399,319), обводки нет. Это понятное правило новой задачи, а не точная имитация внутренней legacy-маски с её обводкой 10, смещением 5 и correction −6. Реальные края и RGBA16-хеши различаются, хотя углы прозрачны и размер совпадает.

Выбрать явную маску и проверить точность альтернатив и семь отказов

Маска с явной геометрией даёт прозрачные углы, но не объявляется пиксельно равной legacy roundCorners. Absolute SET отличается от setImageOpacity на один Quantum; после PNG8 здесь также видна одна ступень alpha. Получены шесть исключений пустого объекта и исключение неверного цвета.

Выбрать явную маску и проверить точность альтернатив и семь отказовПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$legacy=clone $source;$calls=[];
$calls['legacy_round']=acCall('legacy_round',fn()=>$legacy->roundCorners(40,40));
$half=clone $legacy;$calls['legacy_half']=acCall('legacy_half',fn()=>$half->setImageOpacity(0.5));
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$set=clone $legacy;$calls['modern_set']=acCall('modern_set',fn()=>$set->evaluateImage(Imagick::EVALUATE_SET,0.5*$quantum,Imagick::CHANNEL_ALPHA));
$multiply=clone $legacy;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$mask=new Imagick();$mask->newImage(400,320,'transparent','png');$draw=new ImagickDraw();
$draw->setStrokeColor('none');$draw->setFillColor('white');$draw->roundRectangle(0,0,399,319,40,40);$mask->drawImage($draw);
$modern=clone $source;$modern->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
$calls['modern_round']=acCall('modern_round',fn()=>$modern->compositeImage($mask,Imagick::COMPOSITE_DSTIN,0,0));
$explicit=clone $source;$calls['legacy_explicit']=acCall('legacy_explicit',fn()=>$explicit->roundCorners(40,24,0,0,0));
$images=['modern_round'=>acImage($modern,'alternatives-modern-round-raw8.png'),'modern_set'=>acImage($set,'alternatives-modern-set-raw8.png'),
    'multiply'=>acImage($multiply,'alternatives-multiply-raw8.png'),'legacy_explicit'=>acImage($explicit,'alternatives-legacy-explicit-raw8.png'),
    'legacy_half'=>acImage($half,'alternatives-legacy-half-raw8.png')];
$errors=[];
foreach(['getImageMatte'=>[],'setImageMatte'=>[true],'getImageMatteColor'=>[],'setImageMatteColor'=>['red'],'setImageOpacity'=>[0.5],'roundCorners'=>[40,40]] as $method=>$args){
    $empty=new Imagick();$errors['empty_'.$method]=acRecord(acCall('empty_'.$method,fn()=>$empty->$method(...$args)));
}
$errors['invalid_color']=acRecord(acCall('invalid_color',fn()=>$legacy->setImageMatteColor('definitely-invalid-color-value')));
$equal=acHash($half)===acHash($set);$rects=acCompare([$modern,$set,$multiply,$explicit],'legacy-alpha-corners-alternatives.png');
$checks=['absolute_NOT_exact_equal'=>$equal===false,
    'one_quantum_difference'=>acClose($images['modern_set']['samples']['corner']['a']-$images['legacy_half']['samples']['corner']['a'],1/$quantum),
    'PNG_one_alpha_step'=>acClose($images['modern_set']['encoded_png']['samples']['corner']['a'],128/255)&&acClose($images['legacy_half']['encoded_png']['samples']['corner']['a'],127/255),
    'modern_mask_has_transparent_corners'=>$images['modern_round']['samples']['corner']['a']==0.0&&$images['modern_round']['samples']['center']['a']==1.0,
    'modern_mask_not_claimed_pixel_identical'=>acHash($modern)!==acHash($legacy),
    'explicit_geometry_visible'=>$images['legacy_explicit']['samples']['edge']['a']==1.0,
    'source_preserved'=>acHash($source)===$before];
foreach($errors as $name=>$record){$checks[$name.'_caught']=($record['error']['class']??null)==='ImagickException';}
acDiagnostic('alpha-corners-alternatives',['executed_apis'=>['roundCorners','setImageOpacity','getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','evaluateImage','compositeImage'],
    'quantum'=>$quantum,'calls'=>array_map('acRecord',$calls),'images'=>$images,'errors'=>$errors,'absolute_modern_RGBA16_equal'=>$equal,
    'legacy_round_RGBA16_sha256'=>acHash($legacy),'panel_keys'=>['modern_round','modern_set','multiply','legacy_explicit'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>$checks]);
echo "legacy-alpha-corners-alternatives.png\nalternatives-modern-round-raw8.png\nalternatives-modern-set-raw8.png\nalternatives-multiply-raw8.png\nalternatives-legacy-explicit-raw8.png\nalternatives-legacy-half-raw8.png\nmetrics.json\nabsolute-RGBA16-equal=0 quantum-difference=1 failures=7 modern-mask-not-pixel-identical=1 source-unchanged=1\n";

Маска с явной геометрией даёт прозрачные углы, но не объявляется пиксельно равной legacy roundCorners. Absolute SET отличается от setImageOpacity на один Quantum; после PNG8 здесь также видна одна ступень alpha. Получены шесть исключений пустого объекта и исключение неверного цвета. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-alternatives.png
alternatives-modern-round-raw8.png
alternatives-modern-set-raw8.png
alternatives-multiply-raw8.png
alternatives-legacy-explicit-raw8.png
alternatives-legacy-half-raw8.png
metrics.json
absolute-RGBA16-equal=0 quantum-difference=1 failures=7 modern-mask-not-pixel-identical=1 source-unchanged=1
ТребованиеПодход в программеОграничение
Ослабить слой с отверстиямиEVALUATE_MULTIPLY по CHANNEL_ALPHA.Сохраняет нули alpha, но значения округляются в шкале сборки.
Присвоить всем абсолютную alphaEVALUATE_SET с 0.5 × QuantumRange.Здесь на один Quantum отличается от legacy setImageOpacity; точное равенство отвергнуто.
Задать новую геометрию округленияПрозрачная маска и DstIn.Не обещает побитово те же края, что у roundCorners.
Явно настроить legacy-маскуroundCorners(40,24,0,0,0).Все три необязательные настройки заданы явно; это другой результат, а не default 40/40.
Получить JPEG/непрозрачную карточкуЯвно смешать на выбранной подложке и экспортировать отдельно.JPEG не хранит прозрачные отверстия; установка matte color сама этого не делает.

В последней программе шесть методов намеренно вызваны на пустых объектах; каждый дал ImagickException «Can not process empty Imagick object». Неверный цвет дал ImagickException «Unrecognized color string». Ошибки пойманы отдельно от E_DEPRECATED. В прикладном обработчике не надо намеренно провоцировать такие случаи: проверьте входной файл, размер и понятную политику радиусов/opacity, а оставшиеся исключения превратите в ясное сообщение. Точные тексты относятся к проверенной версии.

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

Полный базовый контракт и фактическое поведение

Imagick::getImageMatte(): bool

Метод без аргументов возвращает bool — активен ли matte-канал. False является нормальным результатом для нашего исходного непрозрачного PNG и для выключенного matte, а не признаком сбоя. Общее официальное return-boilerplate «true при успехе» следует читать вместе с точным описанием true/false. Это не величина прозрачности и не проверка, есть ли хотя бы один прозрачный пиксель: активный канал может содержать только непрозрачные значения.

Аргументов нет: круглые скобки остаются пустыми.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagematte">
 <refnamediv>
  <refname>Imagick::getImageMatte</refname>
  <refpurpose>Return if the image has a matte channel</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::getImageMatte</methodname>
   <void/>
  </methodsynopsis>

  <para>
   Returns &true; if the image has a matte channel otherwise false.
   &imagick.method.available.0x629;
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </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
-->

Полный базовый контракт и фактическое поведение

Imagick::setImageMatte(bool $matte): bool

Метод возвращает true после изменения флага текущего изображения. В проверенном IM6 выключение оставляет скрытые численные alpha, но PNG-кодер и OVER их не применяют: чёрные RGB углов становятся видимыми. При включении из выключенного состояния Core заполняет alpha непрозрачными значениями. Для сохранения отверстий оставьте исходный округлённый объект и работайте с clone.

ПараметрСмысл
$matteОбязательный bool: true активирует matte, false выключает. В показанном IM6 повторное включение из выключенного состояния заново делает все пиксели непрозрачными. Это не безопасная кнопка «скрыть и вернуть прежнюю прозрачность».

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML не помечает этот setter deprecated. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagematte">
 <refnamediv>
  <refname>Imagick::setImageMatte</refname>
  <refpurpose>Sets the image matte channel</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageMatte</methodname>
   <methodparam><type>bool</type><parameter>matte</parameter></methodparam>
  </methodsynopsis>

  <para>
   Sets the image matte channel. 
   &imagick.method.available.0x629;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>matte</parameter></term>
     <listitem>
      <para>
       True activates the matte channel and false disables it.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </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
-->

Полный базовый контракт и фактическое поведение

Imagick::getImageMatteColor(): ImagickPixel

Метод без аргументов возвращает новый ImagickPixel с копией сохранённого matte color, а не RGB какого-либо пикселя изображения и не ссылку на само поле. Редактирование полученного Pixel не меняет цвет в изображении. Чтобы использовать его как фон превью, приложение явно создаёт подложку с этим цветом и выполняет OVER.

Аргументов нет: круглые скобки остаются пустыми.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagemattecolor">
 <refnamediv>
  <refname>Imagick::getImageMatteColor</refname>
  <refpurpose>Returns the image matte color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>ImagickPixel</type><methodname>Imagick::getImageMatteColor</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the image matte color.
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns ImagickPixel object on 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
-->

Полный базовый контракт и фактическое поведение

Imagick::setImageMatteColor(mixed $matte): bool

Метод возвращает true и меняет отдельное свойство цвета. Это не перекрашивание, не назначение всем пикселям alpha и не автоматическая подложка будущего JPEG. В нашей задаче храним цвет интерфейса старого редактора, затем явно читаем его и используем для самостоятельного непрозрачного превью.

ПараметрСмысл
$matteОбязательный ImagickPixel или строка допустимого цвета, здесь #e8f2f8. Официальный параметр описан кратко; точный wrapper преобразует цвет и сохраняет его в отдельном поле matte_color. Пиксели и alpha от setter сами не меняются. Строка разрешена с PECL Imagick 2.1.0; ранее требовался ImagickPixel.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagemattecolor">
 <refnamediv>
  <refname>Imagick::setImageMatteColor</refname>
  <refpurpose>Sets the image matte color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageMatteColor</methodname>
   <methodparam><type>mixed</type><parameter>matte</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image matte color.
  </para>
 </refsect1>

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

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as the parameter.
        Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Полный базовый контракт и фактическое поведение

Imagick::setImageOpacity(float $opacity): bool

Метод возвращает true и присваивает общий уровень alpha текущему изображению. Официальное предупреждение о прежде прозрачных областях существенно: после 0.5 все они полупрозрачны. Чтобы ослабить уже готовый слой с отверстиями, используйте evaluateImage с EVALUATE_MULTIPLY и CHANNEL_ALPHA. Для абсолютного EVALUATE_SET нужна Quantum-шкала; в этой Q16-сборке SET и legacy opacity округлились по-разному на один Quantum, поэтому точное RGBA16-равенство не заявляется.

ПараметрСмысл
$opacityОбязательный float: 0 полностью прозрачно, 1 полностью непрозрачно. Несмотря на имя opacity, публичная шкала совпадает с alpha; Wand пересчитывает её в старую внутреннюю opacity Q − Q × alpha. Значение присваивается всем пикселям, а не умножает их прежнюю alpha.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageopacity">
 <refnamediv>
  <refname>Imagick::setImageOpacity</refname>
  <refpurpose>Sets the image opacity level</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageOpacity</methodname>
   <methodparam><type>float</type><parameter>opacity</parameter></methodparam>
  </methodsynopsis>

  <para>
   Sets the image to the specified opacity level. &imagick.method.available.0x631;
   This method operates on all channels, which means that for example opacity value
   of 0.5 will set all transparent areas to partially opaque. To add transparency to
   areas that are not already transparent use <link linkend="imagick.evaluateimage">Imagick::evaluateImage()</link>
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>opacity</parameter></term>
     <listitem>
      <para>
       The level of transparency: 1.0 is fully opaque and 0.0 is fully
       transparent.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>

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

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>A <function>Imagick::setImageOpacity</function> example</title>
    <para>
     An example of using Imagick::setImageOpacity()
    </para>
    <programlisting role="php">
<![CDATA[
<?php
/* Create the object */
$image = new Imagick('source.png');

/* Set the opacity */
$image->setImageOpacity(0.7);

/* output the image */
header('Content-type: image/png');
echo $image;

?>
]]>
    </programlisting>
   </example>
  </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
-->

Полный базовый контракт и фактическое поведение

Imagick::roundCorners(float $x_rounding, float $y_rounding, float $stroke_width = 10, float $displace = 5, float $size_correction = -6): bool

Метод возвращает true, изменяя текущую картинку через самостоятельно построенную маску и DstIn. Размер кадра сохраняется, углы получают alpha; исходный PNG остаётся доступен через отдельный clone. В точных bindings roundCorners — alias roundCornersImage. В XML записаны deprecated с Imagick 3.4.4 и недоступность для IM7, однако текущие 3.7/3.8 bindings содержат alias без deprecated-флага и ветку композиции IM7. Это расхождение сохранено честно: наш реальный пример проверен в IM6, а не объявлен автоматически недоступным или протестированным на всех сборках IM7.

ПараметрСмысл
$x_rounding, $y_roundingДва обязательных float, закругление по горизонтали и вертикали в построении маски; здесь 40,40, а в отдельном примере 40,24. Это не проценты. Видимый край зависит также от остальных настроек маски.
$stroke_widthНеобязательный float, по умолчанию 10. Ширина чёрной обводки внутренней маски. Это не команда нарисовать чёрную рамку на исходной картинке: маска применяется через DstIn, её RGB не переносятся как декоративный бордюр.
$displaceНеобязательный float, по умолчанию 5. Внутренний roundRectangle начинается в (displace,displace). Это не перенос самого исходного изображения.
$size_correctionНеобязательный float, по умолчанию −6. Дальняя точка маски задаётся как (width + correction,height + correction), при этом размер результата остаётся прежним. Вызов с 0,0,0 после радиусов задаёт другую геометрию, а не точную копию default.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.roundcorners">
 <refnamediv>
  <refname>Imagick::roundCorners</refname>
  <refpurpose>Rounds image corners</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::roundCorners</methodname>
   <methodparam><type>float</type><parameter>x_rounding</parameter></methodparam>
   <methodparam><type>float</type><parameter>y_rounding</parameter></methodparam>
   <methodparam choice="opt"><type>float</type><parameter>stroke_width</parameter><initializer>10</initializer></methodparam>   
   <methodparam choice="opt"><type>float</type><parameter>displace</parameter><initializer>5</initializer></methodparam>   
   <methodparam choice="opt"><type>float</type><parameter>size_correction</parameter><initializer>-6</initializer></methodparam>   
  </methodsynopsis>
  <para>
   Rounds image corners. The first two parameters control the amount 
   of rounding and the three last parameters can be used to fine-tune 
   the rounding process. &imagick.method.available.0x629;
   &imagick.method.not.available.0x700;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x_rounding</parameter></term>
     <listitem>
      <para>
       x rounding
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y_rounding</parameter></term>
     <listitem>
      <para>
       y rounding
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>stroke_width</parameter></term>
     <listitem>
      <para>
        stroke width
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>displace</parameter></term>
     <listitem>
      <para>
        image displace
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>size_correction</parameter></term>
     <listitem>
      <para>
        size correction
      </para>
     </listitem>
    </varlistentry>

   </variablelist>
  </para>
 </refsect1>

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

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>Using <function>Imagick::roundCorners</function>:</title>
    <para>
     Rounds the image corners
    </para>
    <programlisting role="php">
<![CDATA[
<?php

$image = new Imagick();
$image->newPseudoImage(100, 100, "magick:rose");
$image->setImageFormat("png");

$image->roundCorners(5,3);
$image->writeImage("rounded.png");
?>
]]>
    </programlisting>
   </example>
  </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
-->

Два сохранённых официальных примера

Исходный пример opacity читает source.png, вызывает setImageOpacity(0.7), задаёт Content-type: image/png и выводит объект. Он сохранён целиком в XML; его ограничение об изменении прежде прозрачных областей не исчезает от выбора 0.7. Наш самостоятельный пример добавляет контролируемый вход и показывает две разные задачи ослабления. Официальный пример roundCorners создаёт magick:rose 100 × 100 и записывает rounded.png после (5,3); он также полностью сохранён, а наши входные файлы не зависят от встроенной rose-картинки.

Окружение и воспроизводимость

Реальные программы выполнены в официальной Ubuntu-среде PHP 8.3.6 / Imagick 3.7.0 / IM6.9.12-98 Q16. Наличие расширения Imagick без знания связанной версии ImageMagick недостаточно. Для соответствующей Ubuntu 24.04 используются официальные пакеты; это не обещание одинаковых версий на любом дистрибутиве и не необходимость заменять работающую Windows-среду.

sudo apt install php8.3-cli php8.3-imagick
php example.php

Упражнение: после округления требуется полупрозрачный водяной знак, который сохраняет прозрачные углы. Решение: оставить matte активной, работать на clone и умножить существующую alpha по CHANNEL_ALPHA. Absolute opacity и выключение matte здесь неверны по смыслу. Если нужен отдельный непрозрачный файл, создайте подложку выбранного цвета и выполните OVER, сохраняя исходный прозрачный PNG.

Полный вспомогательный PHP из каждого самостоятельного архива
<?php
declare(strict_types=1);
function acRestore():void {
    $raw=base64_decode((string)file_get_contents(__DIR__.'/source.png.b64'),true);
    if($raw===false||hash('sha256',$raw)!=='b6af02ed97020582a27e993a1565de41e23ea97ff7be11ac132d68204d56d483'||file_put_contents(__DIR__.'/source.png',$raw)===false){throw new RuntimeException('Own source PNG missing or changed');}
}
function acSource():Imagick {return new Imagick(__DIR__.'/source.png');}
function acHash(Imagick $image,string $map='RGBA'):string {
    return hash('sha256',json_encode($image->exportImagePixels(0,0,400,320,$map,Imagick::PIXEL_SHORT),JSON_THROW_ON_ERROR));
}
function acSamples(Imagick $image):array {
    $samples=[];
    foreach(['corner'=>[0,0],'edge'=>[10,10],'inside'=>[45,45],'center'=>[200,160],'right_corner'=>[399,319]] as $key=>$xy){$samples[$key]=$image->getImagePixelColor(...$xy)->getColor(1);}
    return $samples;
}
function acCall(string $label,callable $operation):array {
    $warnings=[];$out=['label'=>$label];
    set_error_handler(function(int $severity,string $message)use(&$warnings):bool {
        if($severity!==E_DEPRECATED){return false;}
        $warnings[]=['severity'=>$severity,'message'=>$message];return true;
    });
    try{$out['value']=$operation();}
    catch(Throwable $error){$out['error']=['class'=>get_class($error),'message'=>$error->getMessage()];}
    finally{restore_error_handler();}
    $out['warnings']=$warnings;$out['deprecations']=count($warnings);return $out;
}
function acRecord(array $call):array {
    $out=$call;
    if(array_key_exists('value',$out)){
        $value=$out['value'];unset($out['value']);
        $out['returned']=$value instanceof ImagickPixel?['class'=>get_class($value),'color'=>$value->getColor(1)]:$value;
    }
    return $out;
}
function acRaw(Imagick $image,string $filename):void {
    $copy=clone $image;$copy->stripImage();$copy->setImageFormat('png');$copy->setImageDepth(8);
    $copy->setOption('png:bit-depth','8');$copy->setOption('png:color-type','6');$copy->setOption('png:exclude-chunk','all');
    if(!$copy->writeImage(__DIR__.'/'.$filename)){throw new RuntimeException('PNG write failed');}
}
function acChecker(Imagick $image):Imagick {
    static $background=null;
    if($background===null){
        $background=new Imagick();$background->newImage(400,320,'white','png');$draw=new ImagickDraw();$draw->setStrokeColor('none');$draw->setFillColor('#d8e1e2');
        for($y=0;$y<320;$y+=20){for($x=0;$x<400;$x+=20){if((intdiv($x,20)+intdiv($y,20))%2===0){$draw->rectangle($x,$y,$x+19,$y+19);}}}
        $background->drawImage($draw);
    }
    $out=clone $background;$out->compositeImage($image,Imagick::COMPOSITE_OVER,0,0);return $out;
}
function acView(Imagick $image,string $filename):void {acRaw(acChecker($image),$filename);}
function acCompare(array $images,string $filename):array {
    $board=new Imagick();$board->newImage(400*count($images),320,'white','png');$rects=[];
    foreach($images as $i=>$image){$board->compositeImage(acChecker($image),Imagick::COMPOSITE_OVER,400*$i,0);$rects[]=['x'=>400*$i,'y'=>0,'width'=>400,'height'=>320];}
    acRaw($board,$filename);return $rects;
}
function acImage(Imagick $image,string $filename):array {
    $row=['geometry'=>[$image->getImageWidth(),$image->getImageHeight()],
        'active_alpha'=>$image->getImageAlphaChannel(),'samples'=>acSamples($image),
        'rgb16_sha256'=>acHash($image,'RGB'),'rgba16_sha256'=>acHash($image)];
    acRaw($image,$filename);$encoded=new Imagick(__DIR__.'/'.$filename);
    $row['encoded_png']=['filename'=>$filename,'active_alpha'=>$encoded->getImageAlphaChannel(),'samples'=>acSamples($encoded),'rgba16_sha256'=>acHash($encoded)];
    return $row;
}
function acClose(float $a,float $b):bool {return abs($a-$b)<1.0e-12;}
function acDiagnostic(string $id,array $data):void {
    $doc=['schema'=>'aen-legacy-alpha-corners-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');}
}

Helper не скрывает изучаемые вызовы: они находятся в example.php. Его методы acImage/getImageAlphaChannel для измерения не подменяют учебный getImageMatte. Предупреждения сохраняются по уровню и тексту, прежний обработчик восстанавливается через finally; остальные предупреждения не подавляются. Для HTTP отдавайте картинку отдельным ответом без текстового журнала. Далее: alpha и фон, композиция, legacy-заливки и глубина цвета.

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

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

Imagick::getImageMatteОкруглённый PNG, флаг matte, независимый цвет и осмысленное изменение прозрачности

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageMatte(): bool

Полный базовый контракт и фактическое поведение

Imagick::getImageMatte(): bool

Метод без аргументов возвращает bool — активен ли matte-канал. False является нормальным результатом для нашего исходного непрозрачного PNG и для выключенного matte, а не признаком сбоя. Общее официальное return-boilerplate «true при успехе» следует читать вместе с точным описанием true/false. Это не величина прозрачности и не проверка, есть ли хотя бы один прозрачный пиксель: активный канал может содержать только непрозрачные значения.

Аргументов нет: круглые скобки остаются пустыми.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagematte">
 <refnamediv>
  <refname>Imagick::getImageMatte</refname>
  <refpurpose>Return if the image has a matte channel</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::getImageMatte</methodname>
   <void/>
  </methodsynopsis>

  <para>
   Returns &true; if the image has a matte channel otherwise false.
   &imagick.method.available.0x629;
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </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
-->

Отличить флаг matte, сохранённые числа alpha и записанный PNG

Getter последовательно вернул false/true/false/true. После выключения matte численные alpha углов ещё 0, но записанный PNG уже непрозрачен. Повторное включение установило углам alpha 1: прежние отверстия не вернулись.

Отличить флаг matte, сохранённые числа alpha и записанный PNGПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;
$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;
$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$images=['rounded'=>acImage($rounded,'matte-rounded-raw8.png'),'disabled'=>acImage($disabled,'matte-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'matte-reenabled-raw8.png')];
$rects=acCompare([$rounded,$disabled,$reenabled],'legacy-alpha-corners-matte.png');
$checks=['false_is_valid_result'=>$calls['get_source']['value']===false,
    'flags_change'=>$calls['get_rounded']['value']===true&&$calls['get_disabled']['value']===false&&$calls['get_reenabled']['value']===true,
    'disable_keeps_latent_alpha'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['active_alpha']===false,
    'disabled_PNG_is_opaque'=>$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
    'reenable_loses_holes'=>$images['reenabled']['samples']['corner']['a']==1.0,
    'source_preserved'=>acHash($source)===$before];
foreach(['get_source','get_rounded','get_disabled','get_reenabled'] as $key){$checks[$key.'_two_warnings']=$calls[$key]['deprecations']===2;}
foreach(['disable','enable'] as $key){$checks[$key.'_true_no_warning']=$calls[$key]['value']===true&&$calls[$key]['deprecations']===0;}
acDiagnostic('alpha-corners-matte-minimal',['executed_apis'=>['getImageMatte','setImageMatte','roundCorners'],'calls'=>array_map('acRecord',$calls),'images'=>$images,
    'panel_keys'=>['rounded','disabled','reenabled'],'panel_geometry'=>$rects,'source_unchanged'=>acHash($source)===$before,'checks'=>$checks]);
echo "legacy-alpha-corners-matte.png\nmatte-rounded-raw8.png\nmatte-disabled-raw8.png\nmatte-reenabled-raw8.png\nmetrics.json\nmatte=0,1,0,1 disabled-latent-alpha=0 disabled-PNG-alpha=1 reenabled-alpha=1 source-unchanged=1\n";

Getter последовательно вернул false/true/false/true. После выключения matte численные alpha углов ещё 0, но записанный PNG уже непрозрачен. Повторное включение установило углам alpha 1: прежние отверстия не вернулись. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-matte.png
matte-rounded-raw8.png
matte-disabled-raw8.png
matte-reenabled-raw8.png
metrics.json
matte=0,1,0,1 disabled-latent-alpha=0 disabled-PNG-alpha=1 reenabled-alpha=1 source-unchanged=1

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1
Imagick::setImageMatteОкруглённый PNG, флаг matte, независимый цвет и осмысленное изменение прозрачности

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageMatte(bool $matte): bool

Полный базовый контракт и фактическое поведение

Imagick::setImageMatte(bool $matte): bool

Метод возвращает true после изменения флага текущего изображения. В проверенном IM6 выключение оставляет скрытые численные alpha, но PNG-кодер и OVER их не применяют: чёрные RGB углов становятся видимыми. При включении из выключенного состояния Core заполняет alpha непрозрачными значениями. Для сохранения отверстий оставьте исходный округлённый объект и работайте с clone.

ПараметрСмысл
$matteОбязательный bool: true активирует matte, false выключает. В показанном IM6 повторное включение из выключенного состояния заново делает все пиксели непрозрачными. Это не безопасная кнопка «скрыть и вернуть прежнюю прозрачность».

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML не помечает этот setter deprecated. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagematte">
 <refnamediv>
  <refname>Imagick::setImageMatte</refname>
  <refpurpose>Sets the image matte channel</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageMatte</methodname>
   <methodparam><type>bool</type><parameter>matte</parameter></methodparam>
  </methodsynopsis>

  <para>
   Sets the image matte channel. 
   &imagick.method.available.0x629;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>matte</parameter></term>
     <listitem>
      <para>
       True activates the matte channel and false disables it.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   &imagick.return.success;
  </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
-->

Отличить флаг matte, сохранённые числа alpha и записанный PNG

Getter последовательно вернул false/true/false/true. После выключения matte численные alpha углов ещё 0, но записанный PNG уже непрозрачен. Повторное включение установило углам alpha 1: прежние отверстия не вернулись.

Отличить флаг matte, сохранённые числа alpha и записанный PNGПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;
$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;
$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$images=['rounded'=>acImage($rounded,'matte-rounded-raw8.png'),'disabled'=>acImage($disabled,'matte-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'matte-reenabled-raw8.png')];
$rects=acCompare([$rounded,$disabled,$reenabled],'legacy-alpha-corners-matte.png');
$checks=['false_is_valid_result'=>$calls['get_source']['value']===false,
    'flags_change'=>$calls['get_rounded']['value']===true&&$calls['get_disabled']['value']===false&&$calls['get_reenabled']['value']===true,
    'disable_keeps_latent_alpha'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['active_alpha']===false,
    'disabled_PNG_is_opaque'=>$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
    'reenable_loses_holes'=>$images['reenabled']['samples']['corner']['a']==1.0,
    'source_preserved'=>acHash($source)===$before];
foreach(['get_source','get_rounded','get_disabled','get_reenabled'] as $key){$checks[$key.'_two_warnings']=$calls[$key]['deprecations']===2;}
foreach(['disable','enable'] as $key){$checks[$key.'_true_no_warning']=$calls[$key]['value']===true&&$calls[$key]['deprecations']===0;}
acDiagnostic('alpha-corners-matte-minimal',['executed_apis'=>['getImageMatte','setImageMatte','roundCorners'],'calls'=>array_map('acRecord',$calls),'images'=>$images,
    'panel_keys'=>['rounded','disabled','reenabled'],'panel_geometry'=>$rects,'source_unchanged'=>acHash($source)===$before,'checks'=>$checks]);
echo "legacy-alpha-corners-matte.png\nmatte-rounded-raw8.png\nmatte-disabled-raw8.png\nmatte-reenabled-raw8.png\nmetrics.json\nmatte=0,1,0,1 disabled-latent-alpha=0 disabled-PNG-alpha=1 reenabled-alpha=1 source-unchanged=1\n";

Getter последовательно вернул false/true/false/true. После выключения matte численные alpha углов ещё 0, но записанный PNG уже непрозрачен. Повторное включение установило углам alpha 1: прежние отверстия не вернулись. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-matte.png
matte-rounded-raw8.png
matte-disabled-raw8.png
matte-reenabled-raw8.png
metrics.json
matte=0,1,0,1 disabled-latent-alpha=0 disabled-PNG-alpha=1 reenabled-alpha=1 source-unchanged=1

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1
Imagick::getImageMatteColorОкруглённый PNG, флаг matte, независимый цвет и осмысленное изменение прозрачности

PECL imagick 2, PECL imagick 3 · imagick

Imagick::getImageMatteColor(): ImagickPixel

Полный базовый контракт и фактическое поведение

Imagick::getImageMatteColor(): ImagickPixel

Метод без аргументов возвращает новый ImagickPixel с копией сохранённого matte color, а не RGB какого-либо пикселя изображения и не ссылку на само поле. Редактирование полученного Pixel не меняет цвет в изображении. Чтобы использовать его как фон превью, приложение явно создаёт подложку с этим цветом и выполняет OVER.

Аргументов нет: круглые скобки остаются пустыми.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.getimagemattecolor">
 <refnamediv>
  <refname>Imagick::getImageMatteColor</refname>
  <refpurpose>Returns the image matte color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>ImagickPixel</type><methodname>Imagick::getImageMatteColor</methodname>
   <void/>
  </methodsynopsis>
  <para>
   Returns the image matte color.
  </para>
 </refsect1>

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

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Returns ImagickPixel object on 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
-->

Прочитать matte color и явно использовать его как фон превью

Setter сохранил цвет #e8f2f8 без изменения пикселей. Getter вернул независимый ImagickPixel: изменение полученной копии на red не затронуло сохранённый цвет. Только явная композиция на выбранном фоне создала непрозрачное превью.

Прочитать matte color и явно использовать его как фон превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$image=clone $source;
$calls['round']=acCall('round',fn()=>$image->roundCorners(40,40));$pixelsBefore=acHash($image);
$calls['set_color']=acCall('set_color',fn()=>$image->setImageMatteColor('#e8f2f8'));
$read=acCall('get_color',fn()=>$image->getImageMatteColor());
$firstRead=acRecord($read);$pixel=$read['value'];$pixel->setColor('red');
$again=acCall('get_after_pixel_edit',fn()=>$image->getImageMatteColor());
$backgroundColor=$again['value'];
$preview=new Imagick();$preview->newImage(400,320,$backgroundColor,'png');
$preview->compositeImage($image,Imagick::COMPOSITE_OVER,0,0);
$images=['rounded'=>acImage($image,'color-rounded-raw8.png'),'preview'=>acImage($preview,'color-preview8.png')];
$rects=acCompare([$image,$preview],'legacy-alpha-corners-color.png');$stored=$backgroundColor->getColor(1);
acDiagnostic('alpha-corners-color-minimal',['executed_apis'=>['setImageMatteColor','getImageMatteColor','roundCorners'],
    'calls'=>['round'=>acRecord($calls['round']),'set_color'=>acRecord($calls['set_color']),'get_color'=>$firstRead,'get_after_pixel_edit'=>acRecord($again)],
    'edited_returned_pixel'=>$pixel->getColor(1),'stored_color'=>$stored,'pixels_unchanged'=>acHash($image)===$pixelsBefore,'images'=>$images,
    'panel_keys'=>['rounded','preview'],'panel_geometry'=>$rects,'source_unchanged'=>acHash($source)===$before,
    'checks'=>['set_true_no_warning'=>$calls['set_color']['value']===true&&$calls['set_color']['deprecations']===0,
        'getter_new_Pixel'=>$read['value'] instanceof ImagickPixel&&$again['value'] instanceof ImagickPixel&&$read['value']!==$again['value'],
        'getter_one_warning'=>$read['deprecations']===1&&$again['deprecations']===1,
        'stored_color_independent'=>acClose($stored['r'],232/255)&&acClose($stored['g'],242/255)&&acClose($stored['b'],248/255),
        'setter_preserves_pixels'=>acHash($image)===$pixelsBefore,
        'explicit_preview_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-color.png\ncolor-rounded-raw8.png\ncolor-preview8.png\nmetrics.json\nstored-color=#e8f2f8 getter-copy-independent=1 setter-pixels-unchanged=1 explicit-preview=1 source-unchanged=1\n";

Setter сохранил цвет #e8f2f8 без изменения пикселей. Getter вернул независимый ImagickPixel: изменение полученной копии на red не затронуло сохранённый цвет. Только явная композиция на выбранном фоне создала непрозрачное превью. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-color.png
color-rounded-raw8.png
color-preview8.png
metrics.json
stored-color=#e8f2f8 getter-copy-independent=1 setter-pixels-unchanged=1 explicit-preview=1 source-unchanged=1

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1
Imagick::setImageMatteColorОкруглённый PNG, флаг matte, независимый цвет и осмысленное изменение прозрачности

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageMatteColor(mixed $matte): bool

Полный базовый контракт и фактическое поведение

Imagick::setImageMatteColor(mixed $matte): bool

Метод возвращает true и меняет отдельное свойство цвета. Это не перекрашивание, не назначение всем пикселям alpha и не автоматическая подложка будущего JPEG. В нашей задаче храним цвет интерфейса старого редактора, затем явно читаем его и используем для самостоятельного непрозрачного превью.

ПараметрСмысл
$matteОбязательный ImagickPixel или строка допустимого цвета, здесь #e8f2f8. Официальный параметр описан кратко; точный wrapper преобразует цвет и сохраняет его в отдельном поле matte_color. Пиксели и alpha от setter сами не меняются. Строка разрешена с PECL Imagick 2.1.0; ранее требовался ImagickPixel.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimagemattecolor">
 <refnamediv>
  <refname>Imagick::setImageMatteColor</refname>
  <refpurpose>Sets the image matte color</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageMatteColor</methodname>
   <methodparam><type>mixed</type><parameter>matte</parameter></methodparam>
  </methodsynopsis>
  <para>
   Sets the image matte color.
  </para>
 </refsect1>

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

 <refsect1 role="changelog">
  &reftitle.changelog;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>PECL imagick 2.1.0</entry>
       <entry>
        Now allows a string representing the color as the parameter.
        Previous versions allow only an ImagickPixel object.
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </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
-->

Прочитать matte color и явно использовать его как фон превью

Setter сохранил цвет #e8f2f8 без изменения пикселей. Getter вернул независимый ImagickPixel: изменение полученной копии на red не затронуло сохранённый цвет. Только явная композиция на выбранном фоне создала непрозрачное превью.

Прочитать matte color и явно использовать его как фон превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$image=clone $source;
$calls['round']=acCall('round',fn()=>$image->roundCorners(40,40));$pixelsBefore=acHash($image);
$calls['set_color']=acCall('set_color',fn()=>$image->setImageMatteColor('#e8f2f8'));
$read=acCall('get_color',fn()=>$image->getImageMatteColor());
$firstRead=acRecord($read);$pixel=$read['value'];$pixel->setColor('red');
$again=acCall('get_after_pixel_edit',fn()=>$image->getImageMatteColor());
$backgroundColor=$again['value'];
$preview=new Imagick();$preview->newImage(400,320,$backgroundColor,'png');
$preview->compositeImage($image,Imagick::COMPOSITE_OVER,0,0);
$images=['rounded'=>acImage($image,'color-rounded-raw8.png'),'preview'=>acImage($preview,'color-preview8.png')];
$rects=acCompare([$image,$preview],'legacy-alpha-corners-color.png');$stored=$backgroundColor->getColor(1);
acDiagnostic('alpha-corners-color-minimal',['executed_apis'=>['setImageMatteColor','getImageMatteColor','roundCorners'],
    'calls'=>['round'=>acRecord($calls['round']),'set_color'=>acRecord($calls['set_color']),'get_color'=>$firstRead,'get_after_pixel_edit'=>acRecord($again)],
    'edited_returned_pixel'=>$pixel->getColor(1),'stored_color'=>$stored,'pixels_unchanged'=>acHash($image)===$pixelsBefore,'images'=>$images,
    'panel_keys'=>['rounded','preview'],'panel_geometry'=>$rects,'source_unchanged'=>acHash($source)===$before,
    'checks'=>['set_true_no_warning'=>$calls['set_color']['value']===true&&$calls['set_color']['deprecations']===0,
        'getter_new_Pixel'=>$read['value'] instanceof ImagickPixel&&$again['value'] instanceof ImagickPixel&&$read['value']!==$again['value'],
        'getter_one_warning'=>$read['deprecations']===1&&$again['deprecations']===1,
        'stored_color_independent'=>acClose($stored['r'],232/255)&&acClose($stored['g'],242/255)&&acClose($stored['b'],248/255),
        'setter_preserves_pixels'=>acHash($image)===$pixelsBefore,
        'explicit_preview_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-color.png\ncolor-rounded-raw8.png\ncolor-preview8.png\nmetrics.json\nstored-color=#e8f2f8 getter-copy-independent=1 setter-pixels-unchanged=1 explicit-preview=1 source-unchanged=1\n";

Setter сохранил цвет #e8f2f8 без изменения пикселей. Getter вернул независимый ImagickPixel: изменение полученной копии на red не затронуло сохранённый цвет. Только явная композиция на выбранном фоне создала непрозрачное превью. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-color.png
color-rounded-raw8.png
color-preview8.png
metrics.json
stored-color=#e8f2f8 getter-copy-independent=1 setter-pixels-unchanged=1 explicit-preview=1 source-unchanged=1

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1
Imagick::setImageOpacityОкруглённый PNG, флаг matte, независимый цвет и осмысленное изменение прозрачности

PECL imagick 2, PECL imagick 3 · imagick

Imagick::setImageOpacity(float $opacity): bool

Полный базовый контракт и фактическое поведение

Imagick::setImageOpacity(float $opacity): bool

Метод возвращает true и присваивает общий уровень alpha текущему изображению. Официальное предупреждение о прежде прозрачных областях существенно: после 0.5 все они полупрозрачны. Чтобы ослабить уже готовый слой с отверстиями, используйте evaluateImage с EVALUATE_MULTIPLY и CHANNEL_ALPHA. Для абсолютного EVALUATE_SET нужна Quantum-шкала; в этой Q16-сборке SET и legacy opacity округлились по-разному на один Quantum, поэтому точное RGBA16-равенство не заявляется.

ПараметрСмысл
$opacityОбязательный float: 0 полностью прозрачно, 1 полностью непрозрачно. Несмотря на имя opacity, публичная шкала совпадает с alpha; Wand пересчитывает её в старую внутреннюю opacity Q − Q × alpha. Значение присваивается всем пикселям, а не умножает их прежнюю alpha.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.setimageopacity">
 <refnamediv>
  <refname>Imagick::setImageOpacity</refname>
  <refpurpose>Sets the image opacity level</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::setImageOpacity</methodname>
   <methodparam><type>float</type><parameter>opacity</parameter></methodparam>
  </methodsynopsis>

  <para>
   Sets the image to the specified opacity level. &imagick.method.available.0x631;
   This method operates on all channels, which means that for example opacity value
   of 0.5 will set all transparent areas to partially opaque. To add transparency to
   areas that are not already transparent use <link linkend="imagick.evaluateimage">Imagick::evaluateImage()</link>
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>opacity</parameter></term>
     <listitem>
      <para>
       The level of transparency: 1.0 is fully opaque and 0.0 is fully
       transparent.
      </para>
     </listitem>
    </varlistentry>
   </variablelist>
  </para>

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

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>A <function>Imagick::setImageOpacity</function> example</title>
    <para>
     An example of using Imagick::setImageOpacity()
    </para>
    <programlisting role="php">
<![CDATA[
<?php
/* Create the object */
$image = new Imagick('source.png');

/* Set the opacity */
$image->setImageOpacity(0.7);

/* output the image */
header('Content-type: image/png');
echo $image;

?>
]]>
    </programlisting>
   </example>
  </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
-->

Сопоставить присваивание общей opacity и ослабление готового слоя

setImageOpacity(0.5) заполнил прозрачные углы полупрозрачными чёрными пикселями. Умножение существующей alpha оставило отверстия. RGB сохранились; после PNG8 alpha центра составила соответственно 127/255 и 128/255.

Сопоставить присваивание общей opacity и ослабление готового слояПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$absolute=clone $rounded;$multiply=clone $rounded;
$calls['set_opacity']=acCall('set_opacity',fn()=>$absolute->setImageOpacity(0.5));
$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$quantum=Imagick::getQuantumRange()['quantumRangeLong'];
$images=['absolute'=>acImage($absolute,'opacity-absolute-raw8.png'),'multiply'=>acImage($multiply,'opacity-multiply-raw8.png')];
$rects=acCompare([$absolute,$multiply],'legacy-alpha-corners-opacity.png');
acDiagnostic('alpha-corners-opacity-minimal',['executed_apis'=>['setImageOpacity','roundCorners','evaluateImage'],'quantum'=>$quantum,
    'calls'=>array_map('acRecord',$calls),'images'=>$images,'panel_keys'=>['absolute','multiply'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>[
        'absolute_true_one_warning'=>$calls['set_opacity']['value']===true&&$calls['set_opacity']['deprecations']===1,
        'absolute_fills_holes'=>acClose($images['absolute']['samples']['corner']['a'],32767/$quantum),
        'multiply_preserves_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'multiply_center_half'=>acClose($images['multiply']['samples']['center']['a'],32768/$quantum),
        'RGB_preserved'=>acHash($absolute,'RGB')===acHash($rounded,'RGB')&&acHash($multiply,'RGB')===acHash($rounded,'RGB'),
        'PNG_stages_distinguished'=>acClose($images['absolute']['encoded_png']['samples']['center']['a'],127/255)&&acClose($images['multiply']['encoded_png']['samples']['center']['a'],128/255),
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-opacity.png\nopacity-absolute-raw8.png\nopacity-multiply-raw8.png\nmetrics.json\nabsolute-fills-holes=1 multiply-preserves-holes=1 PNG-alpha=127,128 source-unchanged=1\n";

setImageOpacity(0.5) заполнил прозрачные углы полупрозрачными чёрными пикселями. Умножение существующей alpha оставило отверстия. RGB сохранились; после PNG8 alpha центра составила соответственно 127/255 и 128/255. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-opacity.png
opacity-absolute-raw8.png
opacity-multiply-raw8.png
metrics.json
absolute-fills-holes=1 multiply-preserves-holes=1 PNG-alpha=127,128 source-unchanged=1

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1
Imagick::roundCornersОкруглённый PNG, флаг matte, независимый цвет и осмысленное изменение прозрачности

PECL imagick 2, PECL imagick 3 · imagick

Imagick::roundCorners(float $x_rounding, float $y_rounding, float $stroke_width = 10, float $displace = 5, float $size_correction = -6): bool

Полный базовый контракт и фактическое поведение

Imagick::roundCorners(float $x_rounding, float $y_rounding, float $stroke_width = 10, float $displace = 5, float $size_correction = -6): bool

Метод возвращает true, изменяя текущую картинку через самостоятельно построенную маску и DstIn. Размер кадра сохраняется, углы получают alpha; исходный PNG остаётся доступен через отдельный clone. В точных bindings roundCorners — alias roundCornersImage. В XML записаны deprecated с Imagick 3.4.4 и недоступность для IM7, однако текущие 3.7/3.8 bindings содержат alias без deprecated-флага и ветку композиции IM7. Это расхождение сохранено честно: наш реальный пример проверен в IM6, а не объявлен автоматически недоступным или протестированным на всех сборках IM7.

ПараметрСмысл
$x_rounding, $y_roundingДва обязательных float, закругление по горизонтали и вертикали в построении маски; здесь 40,40, а в отдельном примере 40,24. Это не проценты. Видимый край зависит также от остальных настроек маски.
$stroke_widthНеобязательный float, по умолчанию 10. Ширина чёрной обводки внутренней маски. Это не команда нарисовать чёрную рамку на исходной картинке: маска применяется через DstIn, её RGB не переносятся как декоративный бордюр.
$displaceНеобязательный float, по умолчанию 5. Внутренний roundRectangle начинается в (displace,displace). Это не перенос самого исходного изображения.
$size_correctionНеобязательный float, по умолчанию −6. Дальняя точка маски задаётся как (width + correction,height + correction), при этом размер результата остаётся прежним. Вызов с 0,0,0 после радиусов задаёт другую геометрию, а не точную копию default.

Официальная доступность: PECL imagick 2, PECL imagick 3. Официальный XML помечает метод deprecated с PECL Imagick 3.4.4. Это не означает одинаковые предупреждения и доступность всех методов группы. В реально проверенной Imagick 3.7/IM6 getImageMatte дал два E_DEPRECATED, getImageMatteColor и setImageOpacity — по одному, setImageMatte/setImageMatteColor/roundCorners — ни одного. Отсутствие предупреждения не заменяет чтение официального статуса.

Историческая и текущая доступность различаются: getImageMatte/getImageMatteColor/setImageOpacity ограничены IM6 в исследованных bindings; setImageMatte остаётся шире, setImageMatteColor имеет guard IM6 либо IM7 ≥ 7.0.5, roundCorners alias также не ограничен одним IM6. Здесь все шесть реально запускались в одной IM6-среде. Другие платформы и версии надо оценивать отдельно, без механического переименования метода.

Пустой Imagick вызвал ImagickException для каждого из шести методов. Неверная строка цвета дала ImagickException «Unrecognized color string». Приложение заранее проверяет наличие входа и допустимые настройки, а оставшиеся исключения обрабатывает явно. Значение false у getter и выброшенное исключение — разные исходы. Ни хеш PNG-файла, ни один bool не заменяют проверку конкретного визуального результата.

Полный официальный XML с параметрами, возвратом, ограничениями и исходным примером, если он есть
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="imagick.roundcorners">
 <refnamediv>
  <refname>Imagick::roundCorners</refname>
  <refpurpose>Rounds image corners</refpurpose>
 </refnamediv>

 <refsynopsisdiv>
   &imagick.deprecated.function-3-4-4;
 </refsynopsisdiv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <modifier>public</modifier> <type>bool</type><methodname>Imagick::roundCorners</methodname>
   <methodparam><type>float</type><parameter>x_rounding</parameter></methodparam>
   <methodparam><type>float</type><parameter>y_rounding</parameter></methodparam>
   <methodparam choice="opt"><type>float</type><parameter>stroke_width</parameter><initializer>10</initializer></methodparam>   
   <methodparam choice="opt"><type>float</type><parameter>displace</parameter><initializer>5</initializer></methodparam>   
   <methodparam choice="opt"><type>float</type><parameter>size_correction</parameter><initializer>-6</initializer></methodparam>   
  </methodsynopsis>
  <para>
   Rounds image corners. The first two parameters control the amount 
   of rounding and the three last parameters can be used to fine-tune 
   the rounding process. &imagick.method.available.0x629;
   &imagick.method.not.available.0x700;
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    <varlistentry>
     <term><parameter>x_rounding</parameter></term>
     <listitem>
      <para>
       x rounding
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>y_rounding</parameter></term>
     <listitem>
      <para>
       y rounding
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>stroke_width</parameter></term>
     <listitem>
      <para>
        stroke width
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>displace</parameter></term>
     <listitem>
      <para>
        image displace
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>size_correction</parameter></term>
     <listitem>
      <para>
        size correction
      </para>
     </listitem>
    </varlistentry>

   </variablelist>
  </para>
 </refsect1>

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

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>Using <function>Imagick::roundCorners</function>:</title>
    <para>
     Rounds the image corners
    </para>
    <programlisting role="php">
<![CDATA[
<?php

$image = new Imagick();
$image->newPseudoImage(100, 100, "magick:rose");
$image->setImageFormat("png");

$image->roundCorners(5,3);
$image->writeImage("rounded.png");
?>
]]>
    </programlisting>
   </example>
  </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
-->

Получить настоящий PNG с округлёнными прозрачными углами

Размер остался 400 × 320; углы настоящего PNG прозрачны, центр непрозрачен. Шахматка присутствует только в отдельном просмотре. Исходник сохранён.

Получить настоящий PNG с округлёнными прозрачными угламиПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$image=clone $source;
$call=acCall('round',fn()=>$image->roundCorners(40,40));
$row=acImage($image,'round-raw8.png');
acView($image,'legacy-alpha-corners-round.png');acView($source,'source-preview8.png');
acDiagnostic('alpha-corners-round-minimal',['executed_api'=>'roundCorners','calls'=>['round'=>acRecord($call)],'images'=>['rounded'=>$row],
    'source_unchanged'=>acHash($source)===$before,'checks'=>['returned_true'=>$call['value']===true,
        'actual_no_deprecations'=>$call['deprecations']===0,'same_geometry'=>$row['geometry']===[400,320],
        'corner_transparent'=>$row['samples']['corner']['a']==0.0&&$row['encoded_png']['samples']['corner']['a']==0.0,
        'center_opaque'=>$row['samples']['center']['a']==1.0,'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-round.png\nround-raw8.png\nsource-preview8.png\nmetrics.json\nrounded=1 geometry=400x320 corner-alpha=0 center-alpha=1 source-unchanged=1\n";

Размер остался 400 × 320; углы настоящего PNG прозрачны, центр непрозрачен. Шахматка присутствует только в отдельном просмотре. Исходник сохранён. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-round.png
round-raw8.png
source-preview8.png
metrics.json
rounded=1 geometry=400x320 corner-alpha=0 center-alpha=1 source-unchanged=1

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

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях.

Подготовить прозрачную карточку, мягкий слой и отдельное непрозрачное превьюПример для указанного окружения
<?php
declare(strict_types=1);
require __DIR__.'/legacy-alpha-corners-fixture.php';
acRestore();
$source=acSource();$before=acHash($source);
$rounded=clone $source;$calls=[];
$calls['get_source']=acCall('get_source',fn()=>$source->getImageMatte());
$calls['round']=acCall('round',fn()=>$rounded->roundCorners(40,40));
$calls['get_rounded']=acCall('get_rounded',fn()=>$rounded->getImageMatte());
$disabled=clone $rounded;$calls['disable']=acCall('disable',fn()=>$disabled->setImageMatte(false));
$calls['get_disabled']=acCall('get_disabled',fn()=>$disabled->getImageMatte());
$reenabled=clone $disabled;$calls['enable']=acCall('enable',fn()=>$reenabled->setImageMatte(true));
$calls['get_reenabled']=acCall('get_reenabled',fn()=>$reenabled->getImageMatte());
$calls['set_color']=acCall('set_color',fn()=>$rounded->setImageMatteColor('#e8f2f8'));
$calls['get_color']=acCall('get_color',fn()=>$rounded->getImageMatteColor());
$preview=new Imagick();$preview->newImage(400,320,$calls['get_color']['value'],'png');$preview->compositeImage($rounded,Imagick::COMPOSITE_OVER,0,0);
$absolute=clone $rounded;$calls['opacity']=acCall('opacity',fn()=>$absolute->setImageOpacity(0.5));
$multiply=clone $rounded;$calls['multiply']=acCall('multiply',fn()=>$multiply->evaluateImage(Imagick::EVALUATE_MULTIPLY,0.5,Imagick::CHANNEL_ALPHA));
$images=['rounded'=>acImage($rounded,'workflow-round-raw8.png'),'absolute'=>acImage($absolute,'workflow-absolute-raw8.png'),
    'multiply'=>acImage($multiply,'workflow-multiply-raw8.png'),'preview'=>acImage($preview,'workflow-preview8.png'),
    'disabled'=>acImage($disabled,'workflow-disabled-raw8.png'),'reenabled'=>acImage($reenabled,'workflow-reenabled-raw8.png')];
$rects=acCompare([$rounded,$absolute,$multiply,$preview],'legacy-alpha-corners-workflow.png');
$flags=array_map(fn($key)=>$calls[$key]['value'],['get_source','get_rounded','get_disabled','get_reenabled']);
acDiagnostic('alpha-corners-workflow',['executed_apis'=>['getImageMatte','setImageMatte','getImageMatteColor','setImageMatteColor','setImageOpacity','roundCorners','evaluateImage'],
    'calls'=>array_map('acRecord',$calls),'matte_flags'=>$flags,'images'=>$images,'panel_keys'=>['rounded','absolute','multiply','preview'],'panel_geometry'=>$rects,
    'source_unchanged'=>acHash($source)===$before,'checks'=>['matte_false_is_valid'=>$flags===[false,true,false,true],
        'original_holes_retained'=>$images['rounded']['samples']['corner']['a']==0.0,
        'disable_is_not_PNG_transparency'=>$images['disabled']['samples']['corner']['a']==0.0&&$images['disabled']['encoded_png']['samples']['corner']['a']==1.0,
        'reenable_not_restore'=>$images['reenabled']['samples']['corner']['a']==1.0,
        'correct_fade_keeps_holes'=>$images['multiply']['samples']['corner']['a']==0.0,
        'absolute_fade_fills_holes'=>$images['absolute']['samples']['corner']['a']>0.49,
        'preview_has_chosen_background'=>acClose($images['preview']['samples']['corner']['r'],232/255)&&$images['preview']['samples']['corner']['a']==1.0,
        'source_preserved'=>acHash($source)===$before]]);
echo "legacy-alpha-corners-workflow.png\nworkflow-round-raw8.png\nworkflow-absolute-raw8.png\nworkflow-multiply-raw8.png\nworkflow-disabled-raw8.png\nworkflow-reenabled-raw8.png\nworkflow-preview8.png\nmetrics.json\nsix-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1\n";

Все шесть изучаемых методов вызваны в сценарии старого редактора. Прозрачный оригинал результата сохранён; мягкая копия получена умножением alpha; непрозрачное превью создано явным OVER на цвете, прочитанном из matte color. Опасные переключения показаны на отдельных копиях. Самостоятельный ZIP содержит example.php, source.png.b64 и legacy-alpha-corners-fixture.php. Распакуйте рядом и запустите php example.php. acRestore проверяет SHA и восстанавливает собственный PNG; acSource читает его. acCall выполняет явно показанную операцию, сохраняет только E_DEPRECATED и возвращает прежний обработчик через finally. acRecord сохраняет понятный результат getter; acImage отдельно измеряет объект до PNG8, пишет копию и читает именно сохранённый файл. acView/Compare смешивают копии поверх отдельной шахматки. Полный helper приведён в последнем разделе; он не вызывает вместо вас изучаемые matte/opacity/roundCorners. Проверено в PHP 8.3.6 / Imagick 3.7.0 / ImageMagick 6.9.12-98 Q16 в Ubuntu WSL; исполнения всей группы на Windows IM7 здесь не заявлено.

Ожидаемый вывод проверенной программы
legacy-alpha-corners-workflow.png
workflow-round-raw8.png
workflow-absolute-raw8.png
workflow-multiply-raw8.png
workflow-disabled-raw8.png
workflow-reenabled-raw8.png
workflow-preview8.png
metrics.json
six-target-methods=1 matte=0,1,0,1 fade-preserves-holes=1 explicit-background=1 source-unchanged=1
Источники и обсуждения

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

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

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

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