2011-12-15 7 views
5

私のプロジェクトの1つでは、JUNG2を使用してアプレットに表示された非常に大きな複数の親の階層グラフを視覚化しています。私はグラフの全体/一部を高解像度の静止画にエクスポートする必要があります。なぜなら、スクリーンショットは印刷時には(特にグラフがズームアウトされていると)見えないからです。次のように高画質画像へのJUNGグラフのエクスポート

私は現在使用のコードは次のとおり

public void writeToDisk(File saveToFolder, String filename) { 
    //Dimension loDims = getGraphLayout().getSize(); 
    Dimension vsDims = getSize(); 

    int width = vsDims.width; 
    int height = vsDims.height; 
    Color bg = getBackground(); 

    BufferedImage im = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR); 
    Graphics2D graphics = im.createGraphics(); 
    graphics.setColor(bg); 
    graphics.fillRect(0,0, width, height); 
    paintComponent(graphics); 

    try{ 
     ImageIO.write(im,"png",new File(saveToFolder,filename)); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

これは、特に高解像度ではないPNG画像を作成します。だから私の質問は以下の通りです:

  1. PNGエクスポートの解像度を300dpiに上げることは可能ですか?
  2. EPSやPDF、SVGなどのベクトルベースの形式にグラフやそのスイングコンポーネントをエクスポートすることはできますか?私はベクトルベースの画像をJavaで管理するためにいくつかのライブラリ(VectorGraphics2DFreeHEP)を見つけましたが、それらを使用するとグラフの各頂点とエッジを「再描画」する必要があるかどうかわかりません。それは明らかにあまり望ましくありません...
  3. 私が逃したかもしれない他の選択肢はありますか?事前に

おかげで、

+0

たぶん、あなたはあなたの結果のラスタ​​に変換することができます/ビットマップイメージファイルを、後でAutotrace [http://autotrace.sourceforge.net/](http://autotrace.sourceforge.net/)のようなサードパーティライブラリを使用してベクターイメージファイルに変換します – ecle

+0

この問題を解決できましたか?次の回答のいずれも実際には動作していないので、@posdef – SacJn

+0

@SacJn私が以下に投稿した**答えはその時に働いたのですが、ライブラリがその解決策を破るように変更されたかどうかは言えません。私はもうこのプロジェクトに取り組んでいません。#orphanproject #programminginacademia :) – posdef

答えて

5

提案していただきありがとうございますが、私はFreeHEP Vector Graphics libraryの方法で作業しています。誰かが同じ質問に遭遇した場合のために私は以下のコードを共有しています。

上記のライブラリには、さまざまな形式のエクスポートを処理する非常に便利な組み込みのエクスポートメニューがあります。

protected void handlePopup(MouseEvent e) { 
     final VisualizationViewer<MyNode, MyEdge> vv = (VisualizationViewer<MyNode, MyEdge>)e.getSource(); 
     Point2D p = e.getPoint(); 
     GraphElementAccessor<MyNode, MyEdge> pickSupport = vv.getPickSupport(); 
     if(pickSupport != null) { 
      final MyNode v = pickSupport.getVertex(vv.getGraphLayout(), p.getX(), p.getY()); 

      // if clicked on a vertex -> show info popup 
      // else show contexual menu 
      if(v != null) { 
       JFrame popup = new JFrame("Node: " + v.getId()); 
       popup.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       ... 
      } else{ 
       JPopupMenu menu = new JPopupMenu(); 
       JMenuItem exportGraphMenuItem = new JMenuItem("Export graph to vector image..."); 
       exportGraphMenuItem.addActionListener(new ExportActionListener((WritingVisualizationViewer<V, E>) vv)); 
       menu.add(exportGraphMenuItem); 
       menu.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     } 
    } 

とアクションリスナー:

public class ExportActionListener implements ActionListener{ 

    private VisualizationViewer<V, E> wvv; 
    public ExportActionListener(VisualizationViewer<V, E> vv) { 
     this.wvv = vv; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     ExportDialog export = new ExportDialog(); 
     export.showExportDialog(wvv, "Export view as ...", wvv, "export"); 
    } 
} 
+1

そして、エクスポートダイアログを使わずに直接svgイメージを保存したい場合は、Properties p = new Properties(); p.setProperty( "PageSize"、 "A5"); VectorGraphics g =新しいSVGGraphics2D(新しいFile( "Output.svg")、新しいDimension(400,300)); g.setProperties(p); g.startExport(); wvv.print(g); g。 g。endExport(); – bikashg

+0

@bikashg:次のようにpdfまたはjpgファイルを生成しようとしました。 VectorGraphics g =新しいSVGGraphics2D(新しいFile( "Output.jpg")、新しいDimension(400,300)); しかし、それは動作しません。 – 2c00L

+0

@Ashfaqur:あなたはそのステラメントでグラフィックスオブジェクトを作成しました。さて、g.startExport()を使ってファイルに出力する必要があります。 wvv.print(g); g.endExport(); – bikashg

1

基本的にはPNGで十分。 BufferedImageの解像度の次元はピクセルであり、dpiではありません。したがって、より良い解決策を得るには、widthheightを2倍または3倍にする必要があります。

Graphics2Dは、JUNGグラフのために拡大縮小することもできます。

関連する問題