6

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

私が現在使用しているコードは次のとおりです。

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. 私が見逃したかもしれない他の選択肢はありますか?

前もって感謝します、

4

4 に答える 4

6

提案に感謝しますが、FreeHEPVectorGraphicsライブラリを希望どおりに機能させることができました。誰かが同じ質問に遭遇した場合に備えて、以下のコードを共有しています。

上記の名前のライブラリには、さまざまな形式へのエクスポートを処理する非常に優れた組み込みのエクスポートメニューがあります。変更された「ModelGraphMouse」クラスからのコードの抜粋:

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");
    }
}
于 2011-12-19T10:29:16.723 に答える
1

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

Graphics2Dは、JUNGグラフに対してもスケーリングできます。

于 2011-12-15T10:28:58.047 に答える
0

そのためにBatikを使用したいかもしれません:http://xmlgraphics.apache.org/batik/using/svg-generator.html

于 2012-04-20T15:29:04.237 に答える
0

Xchartを使用してから、vectorgraphics2dを使用して画像をSVGまたはPDFにエクスポートできます。

于 2018-03-20T05:12:14.797 に答える