JPanelをベクターグラフィックスにエクスポート
-
03-07-2019 - |
質問
JPanelの画像をベクターグラフィックファイルにエクスポートして、画面よりも高い解像度で編集および印刷できるようにします。基本的に、描画コマンドをベクターグラフィックファイルに保存する宛先Graphicsで paint()
関数を呼び出したいです。
これを行うための良い、簡単な方法は何ですか?どのライブラリが推奨されますか?どのベクトル形式が最適で、その理由は何ですか?
解決
Java EPS Graphics2Dパッケージをご覧ください。
多くのJavaプログラムは、Graphics2Dを使用して画面にデータを描画します。出力をpngまたはjpegファイルとして保存するのは簡単ですが、ドキュメントや紙に含めるためにEPSとしてエクスポートするのは少し難しくなります。
このパッケージを使用すると、EpsGraphics2DオブジェクトをGraphics2Dオブジェクトであるかのように使用できるため、プロセス全体が非常に簡単になります。唯一の違いは、実装されたすべてのメソッドがEPS出力を作成することです。つまり、JEPGやPNGファイルなど、ピクセルベースの画像のサイズを変更するときに表示されるギザギザのエッジにつながることなく、描画する図のサイズを変更できます。
他のヒント
Apache Batik を使用すると、Graphics2Dオブジェクトの特殊な実装にペイントしてからエクスポートできます。スケーラブルベクターグラフィックス(.svg)ファイル。その後、SVG対応ブラウザを使用して表示/処理/印刷できます(Firefoxがネイティブに処理し、ISTR、IEなどがプラグインを使用できます)。
SVGGraphics2D オブジェクト(文書化されたプロセスここ)
Pierreが言及したJava EPSは良さそうですが、そうでない場合は FreeHEPも参照してください。ベクトルグラフィック。高エネルギー物理学分野でJavaを再利用できるように書かれており、Graphics2Dの実装を通じて行われるベクトルグラフィックパッケージが含まれています。何年もの間、EPSを非常に成功裏にエクスポートするために使用してきました。
VectorGraphics2D ライブラリ(LGPL)を推奨できます。 Graphics2Dのすべての機能をサポートしているわけではありませんが、自分のプロジェクトで問題なく使用できました。さまざまなベクターファイル形式のjava.awt.Graphics2Dの実装を提供します。すべてのペイント操作をEPS、SVG、またはPDFファイルにエクスポートするだけです。
同じ要件を持つ人向けの追加ライブラリ:
- SVG、JFreeSVGの http://www.jfree.org/jfreesvg/
- PDF、OrsonPDFの http://object-refinery.com/orsonpdf/index.html
これらのGPLv3と JFreeChart およびオーソンチャート。
FreeHEPは非常にうまく機能しているようですが、もはやメンテナンスされていないようで、バグとフォーラムのページはなくなりました。ほんの一握りの行を使用すると、任意のコンポーネントをさまざまなスケーラブルで通常の画像形式に保存できるポップアップダイアログが表示されます。アルファチャンネル、回転したテキスト、曲線で囲まれた領域を使用したいくつかの挑戦的な画像があり、VectorGraphics2Dを使用することで完全に保存されました。
これまで見てきた唯一の問題は、jpeg saveで、これはすべての画像で黒く表示されます。これは、pngが機能し、すべてのベクトルモードが機能することを考えると、それほど重要ではありませんが、一部の人にとっては問題になると確信しています。
これらすべてのモードで保存するには、これだけのコードを追加する必要がありました:
public static void showImage(Component comp)
{
try
{
ExportDialog export = new ExportDialog();
export.showExportDialog( null, "Export view as ...", comp, "export" );
System.err.println("Image save complete");
}
catch(Exception e)
{
e.printStackTrace();
}
}
同様に追加する必要があるライブラリjarの束があります。
低レベルのJava APIはラスター(ピクセル)の観点から機能し、ベクター形式で保存されることはないため、これは基本的に直接は不可能です。 (java.awt.GraphicsのAPIを確認して、意味を確認してください。)
ラスターをベクター形式に変換する汎用プログラムがあります。これはクイック検索で見つけたものです。 http://autotrace.sourceforge.net/index.html
したがって、このようなプログラムを使用すると、問題を2つの小さな問題に分けることができます:
- JPanelをビットマップまたはファイルに変換します( http:// www。 jguru.com/faq/view.jsp?EID=242020 )
- ファイルに対して自動トレースを実行します。