2012-05-01 30 views
7

Po spędzeniu dwóch dni na próbie rasteryzacji plików jpg z SVG za pomocą ImageMagick w końcu się poddałem.Jak przekonwertować ciąg SVG na jpg z Inkscape

Mimo że udało mi się uzyskać faktyczną konwersję działa poprawnie, wydaje się, że Imagemagick nie może poprawnie przekonwertować funkcji transformacji/obracania poprawnie podczas renderowania obrazu, pozostawiając wynik inny niż oryginalny SVG.

Po przeprowadzeniu dalszych badań okazało się, że jest to znany problem i że "Inkscape" jest najlepszą metodą do konwersji SVG do jpeg/png w PHP.

Problem polega na tym, że moje dane SVG są wysyłane do mojego skryptu PHP przez JSON. Jak mogę uzyskać kroplę lub ciąg znaków w linii poleceń Inkscape, aby ją przekonwertować?

Wielkie dzięki za wszelkie sugestie.

Odpowiedz

2

Jeśli masz ciąg SVG i przesyłasz go z przeglądarki na serwer za pośrednictwem AJAX, musisz zapisać go w pliku tymczasowym, aby można było się do niego odwołać z wiersza poleceń Inkscape. Nie można renderować do formatu JPEG za pomocą wiersza poleceń Inkscape, ale można renderować do PNG w łatwy sposób, a jeśli naprawdę potrzebujesz innego formatu, możesz oczywiście przekonwertować używając ImageMagick.

Musisz coś takiego:

/path/to/inkscape \ 
    --without-gui \ 
    --export-png=/path/to/output.png \ 
    /tmp/file/input.svg 

Jeśli akceptując pełne/częściowe wejście SVG od użytkownika pamiętać, istnieje spora liczba kwestii bezpieczeństwa trzeba pamiętać. Chętnie się na to rozwinie, jeśli będzie to konieczne.

+0

Oczywiście nie mogę uwierzyć, że o tym nie myślałem. Dane wejściowe SVG to cała strona wygenerowana przez klienta w aplikacji (przeciąganie i przekształcanie obiektów/obrazów itp.), Więc użytkownik nigdy nie może sam wprowadzić kodu SVG. To powiedziawszy, nadal pozostawia wiele luk w zabezpieczeniach, o których dobrze wiem. Dzięki za szybką i precyzyjną odpowiedź! – gordyr

+0

Brak problemów. Tak długo jak wiesz o lukach w zabezpieczeniach - pracuję nad aplikacją, w której użytkownicy ładują dokument SVG i często znajduję ciekawe "funkcje"! – halfer

+0

Mogę sobie tylko wyobrazić, o co ci chodzi z tym! ouch! ... Jeszcze raz dziękuję :-) – gordyr

3

Możesz przekazać ciąg SVG do inkscape przy użyciu stdin, ale kod jest mniej przenośny.

// Open Inkscape process 
$process = proc_open(
    '/path/to/inkscape -z -f /dev/fd/0 -e /path/to/output' 
    array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), 
    $pipes 
); 

// Write svg to stdin 
fwrite($pipes[0], $svg); 

// Close process 
foreach ($pipes as $pipe) fclose($pipe); 
proc_close($process); 
Powiązane problemy