使用PHP和ImageMagick实现类Photoshop灰度图层遮罩功能
代码存在的问题
你的代码主要有三处错误导致无法实现预期效果:
- 蒙版对象错误设置了GIF格式,GIF为索引色模式,会丢失灰度层级精度,还会干扰后续合成的透明度计算,作为中间产物的蒙版不需要指定输出格式。
- 最终生成的图像没有显式开启Alpha通道,默认新建的纯色Imagick对象不携带Alpha通道,无法写入透明信息。
- 合成蒙版时没有指定作用于Alpha通道,合成逻辑不能正确写入透明度属性。
修正后代码
function grayscaleMaskTest () { //创建黑白蒙版 $mask = new Imagick(); $mask->newImage(300, 300, "#ffffff"); $mask->setImageType(IMAGICK::IMGTYPE_GRAYSCALE); //绘制黑色圆形 $draw = new ImagickDraw(); $draw->setStrokeWidth(1); $draw->setStrokeOpacity(1); $draw->setStrokeColor(new ImagickPixel("#000000")); $draw->setFillColor(new ImagickPixel("#000000")); $draw->circle(300/2, 300/2, 300/2, 300/2 + 100); $mask->drawImage($draw); // 关闭蒙版自带Alpha通道,避免干扰合成 $mask->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE); //创建最终图像 $final = new Imagick(); $final->newImage(300, 300, "#FF0000"); // 显式开启最终图像的Alpha通道 $final->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE); // 指定合成操作作用于Alpha通道 $final->compositeImage($mask, IMAGICK::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $final->writeImage('C:\Users\Mike\Documents\images\final.png'); }
逻辑说明
修正后完全匹配Photoshop图层蒙版的规则:蒙版白色区域对应原图完全不透明,黑色区域对应完全透明,中间灰度对应半透明效果。如果需要反过来的遮罩逻辑(黑透白遮),只需要在合成前调用$mask->negateImage(false);对蒙版做反相处理即可。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

