PHP/ImageMagick和浏览器CSS HSB Filter滤镜色差消除(超大坑)

起初,我以为Imagick类里面modulateImage($brightness, $saturate, $hue)方法跟CSS的Filter是对接并且不存在色差的,结果不是。翻了翻ImageMagick的文档,里面有很多转换公式,比如$hue色相是个百分比,而CSS是个旋转角度,和CSS甚至正常思路都是不接轨的。

通过国外网友的回答,我找到W3C的Web标准。一方面,他们列出了色相、饱和度和亮度的实现原理和公式,另一方面给了SVG的标签。我实现了他们给出的公式,但是发现浏览器端和服务器端还是出现了色差。

最后,我通过阅读Chromium的源代码发现他通过SVG渲染器来实现HSB滤镜。这就好办了,通过Imagick类读取SVG格式的文件就解决了问题。但中间又遇到了一个坑,在家里配置的PHP 8+ImageMagick 7都出现正确的结果,但在公司的服务器就出现了问题——SVG Filter标签不渲染。

又查阅了很多国外的资料,发现是Linux配置的问题。又看到CentOS中默认的convert指令(ImageMagick 6)能够正确输出SVG到PNG的转换,而7.0.10不行。所以phpize并重新编译Imagick for PHP并指定ImageMagick的目录,输出imagick.so,作为php的扩展。

此时,结果正确。

你可能感兴趣的