PHP readImageBlob from SVG


PHP readImageBlob from SVG

我正在使用Raphael JS客户端将图表渲染为SVG。但是,我希望图表可以下载,而SVG不允许这样做。首先,我尝试使用和数据uri:将svg渲染为png

var $svg = this.$chart.children("svg");
var img = new Image();
img.setAttribute("download", "chart.png");
var that = this;
img.onload = function() {
    that.$chart.append(img);
};
img.src = "data:image/svg+xml;utf8,"+$svg[0].outerHTML;

这不起作用,因为我使用的图像和渐变没有渲染。

现在我正在进行一个API调用,将SVG作为POST数据发送,并尝试使用imagick将SVG转换为PNG。SVG转储可以在这里找到(供参考)。

以下是我正在编写的PHP脚本:

header('Content-Type: image/png');
$svg = "<?xml version='"1.0'" encoding='"UTF-8'" standalone='"no'"?>" . urldecode($_POST["imagedata"]);
error_log($svg);
$image = new IMagick();
$image->setBackgroundColor(new ImagickPixel('transparent'));
$image->readImageBlob(urldecode($svg));
$image->setImageFormat("png32");
echo $image->getImageBlob();

上面的GIST是error_log调用的输出。当这个脚本被调用时,我在AJAX调用中得到一个500错误,PHP服务器给出了这个错误:

'nFatal error: Uncaught exception 'ImagickException' with message 'Unable to read image blob' in :'nStack trace:'n#0 file.php(30): Imagick->readImageBlob()'n#1 {main}

我希望通过多种方式帮助解决这个问题。转换为图像的更好方法,调试"错误"svg文件的方法(可能通过readImageBlob的错误日志?),等等

最终,我只是没有足够的信息来了解readingImageBlob出现了什么问题。SVG显然是正确的。。。我想。它在浏览器中正确渲染。我只是不知道如何调试这个读取函数。

将SVG转换为PNG时,我使用了相同的ImagickException Unable to read image blob。问题是我的服务器上没有安装"ghostscript"。

apt-get install ghostscript为我解决了这个问题。