2012-05-01 13 views
7

ImageMagickを使用してSVG文字列からjpegをラスタライズしようと2日間過ごした後、ついに私は諦めました。画像をレンダリングする際Inkscapeを使ってSVG文字列をjpgに変換する方法

私は、実際の変換が正常に動作し得ることができますが、ImageMagickのは正しく回転/変換する変換することはできませんようですが、元のSVGに異なる出力を残して、正しくます。

が、既知の問題であることと「Inkscapeのは」PHPでJPEG/PNGにSVGを変換するために使用するための最良の方法であることが表示され、さらに調査しました。

問題は、私のSVGデータがJSONを介してPHPスクリプトに送信されることです。 InkscapeコマンドラインにBLOBまたは文字列を入力して変換するにはどうすればよいですか?

ご意見ありがとうございました。

答えて

2

あなたはSVGの文字列を持っている、とあなたはAJAXを介してサーバにブラウザからそれを送信する場合、あなたはそれがInkscapeのコマンドラインから参照できるように、一時ファイルに書き込む必要があります。 Inkscapeのコマンドラインを使ってJPEGにレンダリングすることはできませんが、PNGに簡単にレンダリングすることができます。実際に別のフォーマットが必要な場合は、ImageMagickを使用して変換できます。

次のようなものが必要です:あなたは、ユーザーからの部分的/完全なSVGの入力を受け入れている場合

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

を、念頭に置いてクマは、あなたが心に留めする必要があるセキュリティ上の問題のかなりの数があります。必要に応じてこれを展開して幸いです。

+0

もちろん、私はそれについて考えることはできません。 SVG入力は、アプリケーション内でクライアント側で生成され(オブジェクトや画像のドラッグや変形など)、ユーザーは実際にSVGコードを入力することはありません。それはまだこれが私がよく知っているいくつかのセキュリティホールを残すと言いました。迅速で正確な答えをありがとう! – gordyr

+0

probsはありません。セキュリティホールについて知っている限り、私はユーザーがSVGドキュメントをアップロードするアプリケーションに取り組んでいます。興味深い「機能」を頻繁に探しています! – halfer

+0

私は、あなたがその人と戦っていることを想像することができます!ああ!...もう一度ありがとう:-) – gordyr

3

stdinを使用してSVG文字列をinkscapeに渡すことはできますが、コードの移植性は低くなります。

// 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); 
関連する問題