JavaFXアプリケーションでSVG画像を表示する方法はありますか?
ここにいくつかのオプションがあります:
- WebViewを作成し、svgイメージをWebViewのWebEngineにロードします。
- e(fx) clipseプロジェクトには、svgからfxmlへのコンバーターが含まれています(リンクは現在無効です:()。
- このNetBeansプラグインは、svgをfxmlに変換します(リンクは現在無効です:()。
- Batikやsvgsalamanderなどのawtベースのライブラリを使用して、結果のBufferedImageをJavaFXImageに変換できます。
- JavaFX 2.2には、いくつかの最小限のSVGPath文字列(完全なSVG仕様ではない)のサポートがネイティブに含まれています。
- JavaFX Canvas GraphicsContextコマンドを使用して、svgをレンダリングするコンバーターを作成できます。
- FranzXaverはSVGLoaderを提供します。その使用法は、次の回答で示されています。JavaFXのボタンにSVGファイルをロードする
または、少なくともjavafxからSVGイメージをエクスポートできますか?
この機能は、JavaFXSceneGraphからsvgへのコンバーターのように聞こえます。理論的には可能ですが、まだ誰もがそのようなツールを作成していることを私は知りません。
関数Node.snapshot()は、何らかの形で役立ちますか?
Node.snapshot()は、JavaFXシーングラフからsvgイメージをエクスポートするのに役立ちません。これは、svgがベクトルベースの形式であり、ノードスナップショットがビットマップ形式であるためです。
Batikを調べましたが、javafx.ImageViewではなくBufferedImagesに変換されるため、うまくいきませんでした。
SwingFXUtilsを使用して、 awtBufferedImagesとjavafxイメージを簡単に変換できます。
パフォーマンスの観点から、どちらをお勧めしますか?
複雑なsvgの場合、fxmlからレンダリングするのではなく、ビットマップ画像またはキャンバスグラフィックスコンテキストへのレンダリングのパフォーマンスが向上する可能性があります。これは、シーングラフが非常に単純になり、ノードがはるかに少なくなるためです。つまり、javafxランタイムの作業が大幅に少なくなります。単純なsvg(<1000ノードが生成される)の場合、おそらくそれほど重要ではありません。
javafx.scene.shape.SVGPathのインスタンスの作成についてSVGをFXMLに変換していますか?
部分的に。完全なSVG仕様は、基本的な形状よりもはるかに多くの領域をカバーしています。さらに、グラデーション、エフェクト、アニメーションなどをSVGで実行できます。したがって、ソースSVGイメージにこれらの追加アイテムが含まれている場合は、それらもFXMLに変換する必要があります(可能な限り、FXMLに変換するのが難しいスクリプトなどのSVGのいくつかの側面があります)。
私の推測では、SVG仕様のサイズと複雑さが、現在JavaFXコアAPIに完全なSVGイメージシステムの直接サポートが含まれておらず、代わりにSVGPathなどの限定された同様の機能のみが提供されている理由の1つです。JavaFXコアAPIにネイティブにSVGを実装することは、他の望ましいアイテムと比較した場合、比較的少ない報酬で高コストでした。
もしそうなら、#2(と#3)と#5はまったく同じではないでしょうか?
いいえ。#2および#3で参照されているNetBeansおよびEclipseツールは、SVG仕様の追加の側面をFXMLの同等物(グラデーション、効果、変換など)に変換したため、#5で説明したSVGPath機能よりも機能的でした。