You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:13:15