如何使用PHP Imagick为图片添加内阴影?
PHP Imagick 实现左上侧内阴影效果
我需要用PHP Imagick扩展给图片添加左上侧内阴影,当前使用的ImageMagick版本为7.1.0-17 Q16-HDRI x64 2021-12-04。Imagick::shadowImage函数实现的是类似CSS外阴影的效果:
box-shadow: 3px 3px 6px 2px rgba(0,0,0,0.28);
但我的目标是实现类似以下CSS的左上侧内阴影效果:
box-shadow: inset 3px 3px 6px 2px rgba(0,0,0,0.28);
我参考相关思路写了一段代码,但生成的阴影出现在图片四边而非仅左上侧,经调整后得到了符合需求的实现代码。
初始代码(存在四边阴影问题)
<?php $path = realpath('oOU3n.jpg'); $image = new \Imagick($path); $sizes = $image->getImageGeometry(); $w = $sizes['width']; $h = $sizes['height']; $whitePixel = new \ImagickPixel('white'); $whiteImage = new \Imagick(); $whiteImage->newImage($w, $h, $whitePixel); $whiteImage->setImageBackgroundColor('black'); //$whiteImage->colorizeImage('red', 100, true); $m1 = \Imagick::VIRTUALPIXELMETHOD_BACKGROUND; $m2 = \Imagick::VIRTUALPIXELMETHOD_BLACK; $whiteImage->setImageVirtualPixelMethod($m1); $whiteImage->blurImage(0, 10); $whiteImage->compositeImage($image, \Imagick::COMPOSITE_MULTIPLY, 0, 0); $whiteImage->setImageFormat('png'); header('Content-Type: image/png'); echo $whiteImage->getImageBlob();
修正后代码(实现左上侧内阴影)
<?php $path = realpath('oOU3n.jpg'); $image = new \Imagick($path); $sizes = $image->getImageGeometry(); $w = $sizes['width']; $h = $sizes['height']; $whitePixel = new \ImagickPixel('white'); $whiteImage = new \Imagick(); $whiteImage->newImage($w, $h, $whitePixel); $whiteImage->setImageBackgroundColor('black'); $m = \Imagick::VIRTUALPIXELMETHOD_BLACK; $whiteImage->setImageVirtualPixelMethod($m); // 替换全方向模糊,用定向形态学卷积实现左上内阴影 $kernel1 = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_COMET, "0,10"); $kernel2 = \ImagickKernel::fromBuiltIn(\Imagick::KERNEL_COMET, "0,10+90"); $iterations = 1; $whiteImage->morphology(\Imagick::MORPHOLOGY_CONVOLVE, $iterations, $kernel1); $whiteImage->morphology(\Imagick::MORPHOLOGY_CONVOLVE, $iterations, $kernel2); $whiteImage->compositeImage($image, \Imagick::COMPOSITE_MULTIPLY, 0, 0); $whiteImage->setImageFormat('png'); header('Content-Type: image/png'); echo $whiteImage->getImageBlob();
关键调整说明
- 初始代码的
blurImage是全方向模糊,会让阴影均匀分布在四边; - 修正后改用形态学卷积:通过两个不同方向的COMET内核(分别对应右下、左下方向的光影模拟),配合
VIRTUALPIXELMETHOD_BLACK虚拟像素规则,只在图片左上区域生成内阴影; KERNEL_COMET参数0,10控制阴影的模糊强度,+90控制内核的方向,两者组合后精准模拟CSS inset的左上内阴影效果。
内容的提问来源于stack exchange,提问作者Pavel K
相关产品推荐
相关产品推荐

