2012-10-29 33 views
9

Sto cercando di utilizzare Image-Magick con PHP per convertire il testo SVG in un'immagine PNG. Questo SVG è un grafico generato con NVD3 e vorrei consentire ai miei utenti di scaricarlo come immagine.readimageblob: Errore irreversibile durante la conversione di SVG in PNG

Fondamentalmente, sto inviando i dati SVG, codificati con JSON al gestore PHP che dovrebbe emetterlo come immagine PNG.

Ma, questo getta il seguente errore:

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

Lo script PHP per convertire l'immagine:

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

Esempio SVG, generato da NVD3: http://pastebin.com/Z3TvDK16

Questo è su un server di Ubuntu con PHP 5.3 e Imagick

+3

Molto probabilmente la tua installazione di Imagick manca il delegato giusto. Vedi [ImageMagick convertire da SVG a PNG che non funziona con RSVG abilitato] (http://stackoverflow.com/q/11592085) –

risposta

22

struttura dei file di testo in formato SVG deve essere specificato per readImageBlob per decodificare il file. Prepara <?xml version="1.0" encoding="UTF-8" standalone="no"?> alla variabile con testo svg.

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

E sei a posto.

5

e ricordare che

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

deve essere la prima linea in una variabile che contiene il testo SVG. Sapendo che potrebbe farti venire dei mal di testa.

Problemi correlati