ConFoo 2025

ImagickKernel::fromMatrix

(PECL imagick >= 3.3.0)

ImagickKernel::fromMatrixDescription

Descripción

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

Crea un núcleo («kernel») desde una matriz 2D de valore. Cada balor debería ser o bien de tipo float (si el elemento debería utilizarse) o bien 'false' si el elemento debería saltarse. Para matrices que son de tamaño impar en ambas dimensiones, el píxel de origen será el centro del núcleo. Para todos los demás tamaños de núcleos, el píxel de origen será especificado.

Parámetros

array

Una matriz (esto es, un array 2D) de valores que definen el núlceo. Cada elemento debería ser o bien un valor de tipo float o FALSE si el elemento no debería ser empleado por el núcleo.

array

El elemento del núcleo que debería utilizarse como píxel de origen. P.ej., para una matriz de 3x3, indicar el origen como [2, 2] especificaría que el elemento inferior derecho sería el píxel de origen.

Valores devueltos

El objeto ImagickKernel generado.

Ejemplos

Ejemplo #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);

/* crear una sombra paralela en su misma capa */
$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);

/* componer la capa de texto original con 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