From 3252891e0565a3f3ac53beedb9727b66e0d842c6 Mon Sep 17 00:00:00 2001 From: lacatoire Date: Fri, 27 Feb 2026 08:56:52 +0100 Subject: [PATCH] =?UTF-8?q?ImagickKernel=20=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=81=A8=E4=B8=BB=E8=A6=81=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89?= =?UTF-8?q?=E3=81=AE=E7=BF=BB=E8=A8=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/imagick/imagickkernel.xml | 68 ++++++ .../imagick/imagickkernel/frombuiltin.xml | 215 ++++++++++++++++++ .../imagick/imagickkernel/frommatrix.xml | 203 +++++++++++++++++ reference/imagick/imagickkernel/scale.xml | 168 ++++++++++++++ 4 files changed, 654 insertions(+) create mode 100644 reference/imagick/imagickkernel.xml create mode 100644 reference/imagick/imagickkernel/frombuiltin.xml create mode 100644 reference/imagick/imagickkernel/frommatrix.xml create mode 100644 reference/imagick/imagickkernel/scale.xml diff --git a/reference/imagick/imagickkernel.xml b/reference/imagick/imagickkernel.xml new file mode 100644 index 0000000000..e8ab01bad1 --- /dev/null +++ b/reference/imagick/imagickkernel.xml @@ -0,0 +1,68 @@ + + + + + + + ImagickKernel クラス + ImagickKernel + + + + +
+ &reftitle.intro; + + + +
+ + +
+ &reftitle.classsynopsis; + + + + ImagickKernel + + + + + ImagickKernel + + + + + &Methods; + + + + +
+ +
+ + &reference.imagick.entities.imagickkernel; + +
+ + diff --git a/reference/imagick/imagickkernel/frombuiltin.xml b/reference/imagick/imagickkernel/frombuiltin.xml new file mode 100644 index 0000000000..ee56024722 --- /dev/null +++ b/reference/imagick/imagickkernel/frombuiltin.xml @@ -0,0 +1,215 @@ + + + + + + + ImagickKernel::fromBuiltIn + 組み込みカーネルからカーネルを作成する + + + + &reftitle.description; + + public static ImagickKernelImagickKernel::fromBuiltin + intkernelType + stringkernelString + + + 組み込みカーネルからカーネルを作成します。例については + http://www.imagemagick.org/Usage/morphology/#kernel を参照してください。 + 現時点では 'rotation' シンボルはサポートされていません。例: + $diamondKernel = ImagickKernel::fromBuiltIn(\Imagick::KERNEL_DIAMOND, "2"); + + + + + + &reftitle.parameters; + + + kerneltype + + + 作成するカーネルの種類。例: \Imagick::KERNEL_DIAMOND + + + + + kernelString + + + パラメータを記述する文字列。例: "4,2.5" + + + + + + + + &reftitle.returnvalues; + + + + + + + + + + &reftitle.examples; + + + <function>ImagickKernel::fromBuiltin</function> + + 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); + + /* 元のテキストレイヤーをシャドウレイヤーに合成 */ + $canvas->compositeImage($kernel, \Imagick::COMPOSITE_OVER, 0, 0); + $canvas->setImageFormat('png'); + + return $canvas; +} + + +function createFromBuiltin($kernelType, $kernelFirstTerm, $kernelSecondTerm, $kernelThirdTerm) { + $string = ''; + + if ($kernelFirstTerm != false && strlen(trim($kernelFirstTerm)) != 0) { + $string .= $kernelFirstTerm; + + if ($kernelSecondTerm != false && strlen(trim($kernelSecondTerm)) != 0) { + $string .= ','.$kernelSecondTerm; + if ($kernelThirdTerm != false && strlen(trim($kernelThirdTerm)) != 0) { + $string .= ','.$kernelThirdTerm; + } + } + } + + $kernel = ImagickKernel::fromBuiltIn( + $kernelType, + $string + ); + + return $kernel; +} + +function fromBuiltin($kernelType, $kernelFirstTerm, $kernelSecondTerm, $kernelThirdTerm) { + $diamondKernel = createFromBuiltin($kernelType, $kernelFirstTerm, $kernelSecondTerm, $kernelThirdTerm); + $imagick = renderKernel($diamondKernel); + + header("Content-Type: image/png"); + echo $imagick->getImageBlob(); +} + +fromBuiltin(\Imagick::KERNEL_DIAMOND, 2, false, false); + + +?> +]]> + + + + + + + + diff --git a/reference/imagick/imagickkernel/frommatrix.xml b/reference/imagick/imagickkernel/frommatrix.xml new file mode 100644 index 0000000000..86d3b22b70 --- /dev/null +++ b/reference/imagick/imagickkernel/frommatrix.xml @@ -0,0 +1,203 @@ + + + + + + + ImagickKernel::fromMatrix + 2次元の値の行列からカーネルを作成する + + + + &reftitle.description; + + public static ImagickKernelImagickKernel::fromMatrix + arraymatrix + arrayorigin + + + 2次元の値の行列からカーネルを作成します。各値は float (要素を使用する場合) + または 'false' (要素をスキップする場合) のいずれかでなければなりません。 + 両方の次元が奇数サイズの行列の場合、原点ピクセルはデフォルトでカーネルの + 中心になります。その他のすべてのカーネルサイズでは、原点ピクセルを + 指定する必要があります。 + + + + + + &reftitle.parameters; + + + array + + + カーネルを定義する値の行列 (すなわち2次元配列)。各要素は float 値か、 + その要素をカーネルで使用しない場合は FALSE でなければなりません。 + + + + + array + + + カーネルのどの要素を原点ピクセルとして使用するか。例えば + 3x3 の行列で原点を [2, 2] と指定すると、右下の要素が原点ピクセルになります。 + + + + + + + + &reftitle.returnvalues; + + 生成された ImagickKernel。 + + + + + + + + &reftitle.examples; + + + <function>ImagickKernel::fromMatrix</function> + + 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); + + /* 元のテキストレイヤーをシャドウレイヤーに合成 */ + $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(); +} + +?> +]]> + + + + + + + + diff --git a/reference/imagick/imagickkernel/scale.xml b/reference/imagick/imagickkernel/scale.xml new file mode 100644 index 0000000000..bcf605029a --- /dev/null +++ b/reference/imagick/imagickkernel/scale.xml @@ -0,0 +1,168 @@ + + + + + + + ImagickKernel::scale + 指定した量でカーネルリストをスケーリングする + + + + &reftitle.description; + + public voidImagickKernel::scale + floatscale + intnormalizeFlag + + + 指定したカーネルリストを指定した量でスケーリングします。 + カーネル値の合計の正規化あり、またはなし (指定されたフラグに従う) で行います。 + + この関数の正確な動作は使用される正規化の種類によって異なります。 + 詳細については http://www.imagemagick.org/api/morphology.php#ScaleKernelInfo + を参照してください。 + + + + + + + &reftitle.parameters; + + + + scale + + + + + + + + normalizeFlag + + + + Imagick::NORMALIZE_KERNEL_NONE + Imagick::NORMALIZE_KERNEL_VALUE + Imagick::NORMALIZE_KERNEL_CORRELATE + Imagick::NORMALIZE_KERNEL_PERCENT + + + + + + + + + + &reftitle.returnvalues; + + + + + + + + + + &reftitle.examples; + + + <function>ImagickKernel::scale</function> + + "; + + foreach ($matrix as $row) { + $output .= ""; + foreach ($row as $cell) { + $output .= ""; + if ($cell === false) { + $output .= "false"; + } + else { + $output .= round($cell, 3); + } + $output .= ""; + } + $output .= ""; + } + + $output .= ""; + + return $output; + } + + + $output = ""; + + $matrix = [ + [-1, 0, -1], + [ 0, 4, 0], + [-1, 0, -1], + ]; + + $kernel = \ImagickKernel::fromMatrix($matrix); + $kernelClone = clone $kernel; + + $output .= "Start kernel
"; + $output .= renderKernelTable($kernel->getMatrix()); + + + $output .= "Scaling with NORMALIZE_KERNEL_VALUE. The
"; + $kernel->scale(2, \Imagick::NORMALIZE_KERNEL_VALUE); + $output .= renderKernelTable($kernel->getMatrix()); + + + $kernel = clone $kernelClone; + $output .= "Scaling by percent
"; + $kernel->scale(2, \Imagick::NORMALIZE_KERNEL_PERCENT); + $output .= renderKernelTable($kernel->getMatrix()); + + $matrix2 = [ + [-1, -1, 1], + [ -1, false, 1], + [1, 1, 1], + ]; + + $kernel = \ImagickKernel::fromMatrix($matrix2); + $output .= "Scaling by correlate
"; + $kernel->scale(1, \Imagick::NORMALIZE_KERNEL_CORRELATE); + $output .= renderKernelTable($kernel->getMatrix()); + + return $output; +?> +]]> +
+
+
+
+ +
+ +