2012-10-29 29 views
9

Próbuję użyć Image-Magick z PHP, aby przekonwertować tekst SVG na obraz PNG. Ten SVG to wykres wygenerowany przy użyciu NVD3 i chciałbym, aby moi użytkownicy mogli pobrać go jako obraz.readimageblob: Błąd krytyczny podczas konwersji SVG do PNG

Zasadniczo wysyłam dane SVG, zakodowane za pomocą JSON-a do programu obsługi PHP, który ma wyprowadzić go jako obraz PNG.

Ale to rzuca się następujący błąd:

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(' 

skrypt PHP do konwersji obrazu:

<?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); 

Przykład SVG generowane przez NVD3: http://pastebin.com/Z3TvDK16

ten znajduje się na serwerze Ubuntu PHP 5.3 i Imagick

+3

Najprawdopodobniej w instalacji Imagick brakuje właściwego uczestnika. Zobacz [ImageMagick przekonwertować SVG do PNG nie działa z włączonym RSVG] (http://stackoverflow.com/q/11592085) –

Odpowiedz

22

struktura SVG plik tekstowy musi być określona dla readImageBlob dekodować plik. Przygotuj <?xml version="1.0" encoding="UTF-8" standalone="no"?> do zmiennej posiadającej tekst svg.

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

I jesteś dobry, by iść.

5

I pamiętaj, że

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

musi być pierwszy wiersz w zmiennej, która zawiera tekst SVG. Wiedząc, że może to uratować niektóre bóle głowy.

Powiązane problemy