CakeFest 2024: The Official CakePHP Conference

ImagickKernel::fromMatrix

(PECL imagick >= 3.3.0)

ImagickKernel::fromMatrixСоздаёт ядро из двумерной матрицы значений

Описание

public static ImagickKernel::fromMatrix(array $matrix, array $origin = ?): ImagickKernel

Создаёт ядро из двумерной матрицы значений. Каждое значение должно быть либо числом с плавающей запятой (если элемент должен использоваться), либо с 'false', если элемент следует пропустить. Для матриц нечётных размеров в обоих измерениях исходным пикселем по умолчанию будет центр ядра. Для всех других размеров ядра необходимо указать исходный пиксель.

Список параметров

array

Матрица (т.е. двумерный массив) значений, определяющих ядро. Каждый элемент должен быть либо числом с плавающей запятой, либо значением FALSE, если этот элемент не должен использоваться ядром.

array

Какой элемент ядра следует использовать в качестве исходного пикселя. Например, для матрицы 3x3, определяющей начало координат как [2, 2], будет указано, что нижний правый элемент должен быть исходным пикселем.

Возвращаемые значения

Созданный ImagickKernel.

Примеры

Пример #1 Пример использования ImagickKernel::fromMatrix()

<?php

function renderKernel(ImagickKernel $imagickKernel) {
$matrix = $imagickKernel->getMatrix();

$imageMargin = 20;

$tileSize = 20;
$tileSpace = 4;
$shadowSigma = 4;
$shadowDropX = 20;
$shadowDropY = 0;

$radius = ($tileSize / 2) * 0.9;

$rows = count($matrix);
$columns = count($matrix[0]);

$imagickDraw = new \ImagickDraw();

$imagickDraw->setFillColor('#afafaf');
$imagickDraw->setStrokeColor('none');

$imagickDraw->translate($imageMargin, $imageMargin);
$imagickDraw->push();

ksort($matrix);

foreach (
$matrix as $row) {
ksort($row);
$imagickDraw->push();
foreach (
$row as $cell) {
if (
$cell !== false) {
$color = intval(255 * $cell);
$colorString = sprintf("rgb(%f, %f, %f)", $color, $color, $color);
$imagickDraw->setFillColor($colorString);
$imagickDraw->rectangle(0, 0, $tileSize, $tileSize);
}
$imagickDraw->translate(($tileSize + $tileSpace), 0);
}
$imagickDraw->pop();
$imagickDraw->translate(0, ($tileSize + $tileSpace));
}

$imagickDraw->pop();

$width = ($columns * $tileSize) + (($columns - 1) * $tileSpace);
$height = ($rows * $tileSize) + (($rows - 1) * $tileSpace);

$imagickDraw->push();
$imagickDraw->translate($width/2 , $height/2);
$imagickDraw->setFillColor('rgba(0, 0, 0, 0)');
$imagickDraw->setStrokeColor('white');
$imagickDraw->circle(0, 0, $radius - 1, 0);
$imagickDraw->setStrokeColor('black');
$imagickDraw->circle(0, 0, $radius, 0);
$imagickDraw->pop();

$canvasWidth = $width + (2 * $imageMargin);
$canvasHeight = $height + (2 * $imageMargin);

$kernel = new \Imagick();
$kernel->newPseudoImage(
$canvasWidth,
$canvasHeight,
'canvas:none'
);

$kernel->setImageFormat('png');
$kernel->drawImage($imagickDraw);

/* создание тени на собственном слое */
$canvas = $kernel->clone();
$canvas->setImageBackgroundColor(new \ImagickPixel('rgb(0, 0, 0)'));
$canvas->shadowImage(100, $shadowSigma, $shadowDropX, $shadowDropY);

$canvas->setImagePage($canvasWidth, $canvasHeight, -5, -5);
$canvas->cropImage($canvasWidth, $canvasHeight, 0, 0);

/* накладывает исходный text_layer на shadow_layer */
$canvas->compositeImage($kernel, \Imagick::COMPOSITE_OVER, 0, 0);
$canvas->setImageFormat('png');

return
$canvas;
}

function
createFromMatrix() {
$matrix = [
[
0.5, 0, 0.2],
[
0, 1, 0],
[
0.9, 0, false],
];

$kernel = \ImagickKernel::fromMatrix($matrix);

return
$kernel;
}

function
fromMatrix() {
$kernel = createFromMatrix();
$imagick = renderKernel($kernel);

header("Content-Type: image/png");
echo
$imagick->getImageBlob();
}

?>

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top