如何使用PHP Imagick创建平铺水印并保留PNG透明通道
问题原因
PNG水印透明通道丢失是因为通过newPseudoImage生成平铺水印时,默认没有激活PNG自带的alpha通道,补充对应配置即可修复。
可用实现方案
方案1:基于伪图像Tile模式实现
$image = new \Imagick($inputFilename); $watermark = new \Imagick(); $watermark->newPseudoImage( $image->getImageWidth(), $image->getImageHeight(), "tile:$watermarkFilename" ); // 激活alpha通道,修复透明丢失问题 $watermark->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE); $image->setImageArtifact('compose:args', '45'); $image->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, 0, 0); $image->writeImage($outputFilename); // 销毁资源 $image->destroy(); $watermark->destroy();
方案2:基于VirtualPixelMethod平铺规则实现
$image = new \Imagick($inputFilename); // 直接加载水印原图 $watermark = new \Imagick($watermarkFilename); // 激活水印alpha通道 $watermark->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE); // 设置虚拟像素模式为平铺 $watermark->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TILE); // 裁剪出和原图尺寸一致的平铺水印图 $tiledWatermark = $watermark->cropImage($image->getImageWidth(), $image->getImageHeight(), 0, 0); $image->setImageArtifact('compose:args', '45'); $image->compositeImage($tiledWatermark, Imagick::COMPOSITE_DISSOLVE, 0, 0); $image->writeImage($outputFilename); // 销毁资源 $image->destroy(); $watermark->destroy(); $tiledWatermark->destroy();
注意事项
如果测试发现透明度不符合预期,可以把compose:args的参数调整为带百分号的'45%',适配不同版本的Imagick规则。两种方案最终效果和CLI调用composite命令完全一致。
内容的提问来源于stack exchange,提问作者dmuir
相关产品推荐
相关产品推荐

