ImageMagick SVG 到 PNG 的转换去除了渐变

jam*_*ckp 2 php svg imagemagick imagick imagemagick-convert

我正在尝试允许用户通过 CMS 上传 SVG 图像并生成后备 PNG,以便当 CMS 在前端显示内容时,会为旧浏览器显示 PNG 后备。

问题是当我上传 SVG 时,PNG 输出有点偏离,渐变似乎丢失,如下面的屏幕截图所示。

左边的 SVG 右边的 PNG

在这些测试中,我只是使用 ImageMagick 命令行,如下所示,但已经使用 Imagick 通过 CMS 上传进行了尝试,结果相同。

convert gallardo.svg gallardo.png
Run Code Online (Sandbox Code Playgroud)

Imagick 版本按照其他线程的建议将背景设置为透明,但 PNG 输出与命令行相同。

class ResampleSvgUpload extends DataExtension {

    function onAfterUpload() {
        if($this->isSvg()){
            $this->resample();
        }
    }

    function onAfterWrite() {
        if($this->isSvg()){
            $this->resample();
        }
    }

    function isSvg() {
        $extension = strtolower($this->owner->getExtension());
        return ($extension == 'svg') ? true : false;
    }

    function resample() {
        $original = $this->owner->getFullPath();
        $resampled = $original . '.png';    
        $imagick = new Imagick($original);
        $imagick->setBackgroundColor(new ImagickPixel('transparent'));
        $imagick->setImageFormat('png');
        $imagick->writeImage($resampled);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用:

  • ImageMagick 6.9.0-3
  • 幻影3.1.0RC2
  • PHP 5.3.29
  • OSX 优胜美地 10.10

Dan*_*ack 5

ImageMagick 本身不进行 SVG 的转换,而是将该任务委托给第 3 方程序。您可以通过将-verbose选项添加到 convert 命令来查找正在使用的程序。

该问题几乎肯定是由该底层程序中的错误引起的 - 当您升级到它的更新版本时,该问题有望消失。

  • 这解决了这个问题 - 我用“brew重新安装 imagemagick --with-librsvg librsvg --use-rsvg”重新安装了 ImageMagick 并且转换现在可以正常工作 (2认同)