当前位置: 首页 > 后端技术 > PHP

PHP-ImageMagick与浏览器CSSHSBFilter滤镜色差消除(超大坑)

时间:2023-03-29 20:33:52 PHP

一开始我以为Imagick类中的modulateImage($brightness,$saturate,$hue)方法是对接CSSFilter的,有没有色差,结果没有。翻看ImageMagick文档,转换公式很多,比如$hue是百分比,CSS是旋转角度,这不符合CSS甚至正常思维。通过国外网友的回答,找到了W3C的Web标准。他们一方面列出了色相、饱和度、亮度的实现原理和公式,另一方面给出了SVG标签。我实现了他们给的公式,但是发现浏览器和服务器还是有色差的。最后通过阅读Chromium的源码发现他是通过SVG渲染器实现HSB滤镜的。这个好办,通过Imagick类读取SVG格式的文件就解决了问题。但是中间还有一个坑。家里配置的PHP8+ImageMagick7显示结果正确,但是公司服务器出现问题——SVGFilter标签没有渲染。也查阅了很多国外资料,发现是linux配置的问题。我还看到CentOS中默认的转换命令(ImageMagick6)可以正确输出从SVG到PNG的转换,但7.0.10不能。于是phpize重新编译ImagickforPHP并指定ImageMagick的目录,输出imagick.so,作为php的扩展。至此,结果是正确的。