2013-10-15 7 views
6

Ich habe einige Diagramme mit D3js erstellt, die ich über JavaScript in ein PNG-Bild konvertieren möchte, so dass Benutzer das Diagramm herunterladen können.Konvertieren von SVG erstellt mit D3js zu PNG

Ich habe Lösungen gesehen, die das SVG in eine Arbeitsfläche konvertieren und die Zeichenfläche in ein Bild konvertieren. Das funktioniert nicht, weil die SVG Klassen verwendet, um die Elemente zu stylen (was ich wegen der Maintainability lieber nicht ändern würde), was dazu führt, dass die ganze Leinwand schwarz wird und sehr dicke Linien hat.

Ist es möglich, die SVG-Diagramme direkt in PNG zu konvertieren?

Die Seite ist in einem Ruby on Rails-Projekt, damit es nicht eine reine JavaScript-Lösung sein muss, aber ich würde die lieber mit JavaScript tun, so kann ich es auch in anderen Projekten umzusetzen.

+0

Sorry, ich habe noch nichts mit SVG gemacht, also könnte diese Antwort Unsinn sein :). Wollen Sie sagen, dass bei der Verwendung von Klassen und nicht Inline-Styles die Dinge beim Konvertieren in Canvas zusammenhängen? In diesem Fall ist es nicht eine Frage der programmatischen Anwendung der Stile aus der CSS-Klasse vor der Konvertierung in Canvas? – Owen

+0

Als ich diese Frage vor 2 Monaten gestellt habe, war das tatsächlich das Problem. Ich habe bereits eine Lösung implementiert, die dem entspricht, was Sie vorgeschlagen haben. Das Problem, auf das ich später gestoßen bin, ist, dass die meisten Browser das generierte Canvas/PNG nicht richtig darstellen. Dies führt dazu, dass Elemente fehlen und/oder das Bild schwarz wird. Ein Problem, das ich für den IE kennengelernt habe, ist, dass ich Daten-Uri nicht größer als 2.048 Zeichen übergeben kann, so dass ich nicht die ganze uri übergeben kann, um es zum Herunterladen zu präsentieren (nicht wirklich Frage bezogen). –

Antwort

2

Ihr svg Zur Anzeige innerhalb einer Leinwand, können Sie es zuerst konvertieren müssen einen Parser/Renderer-Dienstprogramm wie http://code.google.com/p/canvg/

(Code angepasst von: Konvertieren SVG Bild (JPEG, PNG, etc.) in der Browser)

// the canvg call that takes the svg xml and converts it to a canvas 
canvg('canvas', $("svg").html()); 

// the canvas calls to output a png 
var canvas = document.getElementById("canvas"); 
var img = canvas.toDataURL("image/png"); 
+0

Hmm, ich habe zwei Fragen dazu: Erstens: Muss ich alle 3 Bibliotheken implementieren (rgbcolor, stackblur, canvg)? Zweitens: Ich habe bemerkt, dass die Datei canvg.js ziemlich groß ist. Kennen Sie kleinere Bibliotheken? oder ist es möglich, nur die Nescesarry-Methoden zu identifizieren? Ich frage das, weil eine RoR-Anwendung alle JS-Dateien beim ersten Laden lädt, also würde eine andere große Bibliothek (wir haben bereits eine Menge JS) es beim ersten Laden langsamer machen. –

+0

Obwohl dies nicht meine "perfekte" Lösung ist, funktioniert es. Also werde ich es als Antwort akzeptieren. –

+0

Funktioniert canvg solution mit NodeJS, um SVG serverseitig in PNG zu konvertieren? Ich habe versucht mit Svg2png, aber es lief nicht gut auf Windows7 – amar