我正在使用Raphael JS客户端将图表呈现为SVG。但是,我希望图表可以下载,SVG不允许这样做。首先,我尝试将svg渲染为png使用和数据uri:
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转储here(供参考)。
这是我正在处理的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显然是正确的...我猜。它在浏览器中正确呈现。我只是不确定如何调试这个读取函数。
答案 0 :(得分:1)
将SVG转换为PNG时,我有同样的ImagickException Unable to read image blob
。问题是&#39; ghostscript&#39;没有安装在我的服务器上。
apt-get install ghostscript
为我解决了这个问题。