2013-10-15 8 views
6

Mam kilka wykresów utworzonych za pomocą D3js, które chcę przekonwertować na obraz PNG za pomocą JavaScript, aby użytkownicy mogli pobrać wykres.Konwertowanie SVG utworzonego za pomocą D3js do PNG

Widziałem rozwiązania, które konwertują SVG na płótno i konwertują płótno na obraz. To nie zadziała, ponieważ SVG używa klas do stylizowania elementów (co raczej nie chciałbym zmieniać ze względu na łatwość), co powoduje, że całe płótno staje się czarne z bardzo grubymi liniami.

Czy można bezpośrednio przekonwertować wykresy SVG na format PNG?

Strona znajduje się wewnątrz projektu Ruby on Rails, więc nie musi być czystym rozwiązaniem JavaScript, ale wolałbym to zrobić z JavaScriptem, aby móc zaimplementować go również w innych projektach.

+0

Niestety, nie zrobiłem jeszcze nic z SVG, więc ta odpowiedź może być nonsensem :). Czy mówisz o tym, używając klas, a nie wbudowanych stylów, które są pomijane podczas konwersji na płótno? W takim przypadku, czy nie chodzi o programowe stosowanie stylów z klasy css przed konwersją na płótno? – Owen

+0

Kiedy dodałem to pytanie 2 miesiące temu, to był rzeczywiście problem. Zaimplementowałem już rozwiązanie similair do tego, co zasugerowałeś. Problemem, który napotkałem po tym, jest to, że większość przeglądarek nie renderuje poprawnie wygenerowanego płótna/PNG. W wyniku tego brakuje elementów i/lub obraz staje się czarny. Problem, który napotkałem w IE, polega na tym, że nie mogę przekazać danych-uri o długości większej niż 2048 znaków, więc nie mogę przekazać całego pakietu uri, aby zaprezentować go do pobrania (w zasadzie niezwiązany z pytaniami). –

Odpowiedz

2

Aby wyświetlić SVG w płótnie, trzeba najpierw przekonwertować go za pomocą narzędzia parser/renderer takich jak http://code.google.com/p/canvg/

(kod dostosowany od: Konwersja SVG do obrazu (JPEG, PNG, itp) w przeglądarka)

// 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, mam dwa pytania na ten temat: po pierwsze: czy muszę zaimplementować wszystkie 3 biblioteki (rgbcolor, stackblur, canvg) ?, po drugie: zauważyłem, że plik canvg.js jest dość duży. Czy znasz jakieś mniejsze biblioteki? lub czy możliwe jest zidentyfikowanie tylko metod nescesarry? Pytam o to, ponieważ aplikacja RoR ładuje wszystkie pliki JS przy pierwszym obciążeniu, więc inna duża biblioteka (mamy już dużo JS) spowolniłaby to przy pierwszym ładowaniu. –

+0

Chociaż nie jest to moje "idealne" rozwiązanie, działa. Więc przyjmuję to jako odpowiedź. –

+0

Czy rozwiązanie canvg współpracuje z NodeJS, aby przekonwertować SVG na PNG po stronie serwera? Próbowałem z svg2png, ale nie działało dobrze na Windows7 – amar

Powiązane problemy