10

我正在尝试使用带有 PHP 的 Image-Magick 将 SVG 文本转换为 PNG 图像。这个 SVG 是用NVD3生成的图表,我想允许我的用户将它作为图像下载。

基本上,我将使用 JSON 编码的 SVG 数据发送到 PHP 处理程序,该处理程序应该将其输出为 PNG 图像。

但是,这会引发以下错误:

Fatal error: Uncaught exception 'ImagickException' with message 'no decode delegate for this image format `' @ blob.c/BlobToImage/347' in svg2png.php:4 Stack trace: #0 svg2png.php(4): Imagick->readimageblob('

用于转换图像的PHP 脚本:

<?php
    /* Derived in part from: http://stackoverflow.com/a/4809562/937891 */
    $svg=json_decode($_REQUEST["svgData"]);
    $im=new Imagick();
    $im->readImageBlob($svg);
    $im->setImageFormat("png24");
    header("Content-Type: image/png");
    $thumbnail = $im->getImageBlob();
    echo $thumbnail;
?>

HTML:

<form id="exportSpendTrendTrigger" method="POST" action="svg2png.php" target="_blank">
    <input id="exportSpendTrendSvgData" type="hidden" name="svgData" />
    <input type="submit" class="btn" value="Export" />
</form>
<div id="spendtrend">
    <svg></svg>
</div>

jQuery:

exportSpendTrend = function (e) {
    //Show the user the PNG-image version for download
    $("#exportSpendTrendSvgData").val( JSON.stringify($("#spendtrend").html().trim()) );
}

$("#exportSpendTrendTrigger").on("submit", exportSpendTrend);

由 NVD3 生成的SVG示例: http ://pastebin.com/Z3TvDK16

这是在带有 PHP 5.3 和 Imagick 的 Ubuntu 服务器上

4

2 回答 2

28

需要指定 svg 文件文本结构readImageBlob来解码文件。<?xml version="1.0" encoding="UTF-8" standalone="no"?>在您的变量前添加 svg 文本。

$svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'.$svg;

你很高兴。

于 2013-03-25T12:03:31.123 回答
7

记住这一点

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

必须是包含 SVG 文本的变量中的第一行。知道这一点可能会为您省去一些麻烦。

于 2013-09-27T16:53:41.823 回答