2012-10-29 44 views
9

Tôi đang cố gắng sử dụng Image-Magick với PHP để chuyển đổi văn bản SVG thành hình ảnh PNG. SVG này là biểu đồ được tạo với NVD3 và tôi muốn cho phép người dùng tải xuống biểu đồ dưới dạng hình ảnh.readimageblob: Lỗi nghiêm trọng khi chuyển đổi SVG thành PNG

Về cơ bản, tôi đang gửi dữ liệu SVG, được mã hóa bằng JSON tới trình xử lý PHP được cho là xuất dưới dạng hình ảnh PNG.

Nhưng, điều này ném lên các lỗi sau:

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

Kịch bản PHP để chuyển đổi hình ảnh:

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

Ví dụ SVG, được tạo ra bởi NVD3: http://pastebin.com/Z3TvDK16

Đây là trên một máy chủ với PHP 5.3 và Imagick Ubuntu

+3

Rất có thể cài đặt Imagick của bạn thiếu đại biểu phù hợp. Xem [ImageMagick chuyển đổi SVG sang PNG không hoạt động với tính năng RSVG được bật] (http://stackoverflow.com/q/11592085) –

Trả lời

22

cấu trúc svg file văn bản cần được xác định cho readImageBlob để giải mã tệp. Chuẩn bị trước <?xml version="1.0" encoding="UTF-8" standalone="no"?> cho biến của bạn có văn bản svg.

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

Và bạn nên làm.

5

Và hãy nhớ rằng

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

phải là dòng đầu tiên trong một biến có chứa SVG text. Biết rằng có thể giúp bạn tiết kiệm một số cơn đau đầu.

Các vấn đề liên quan