2011-12-15 13 views
5

In uno dei miei progetti utilizzo JUNG2 per visualizzare un grafo di gerarchia multicomparto molto grande, visualizzato in un'applet. Avrei bisogno di esportare l'intero/parti del grafico in immagini fisse ad alta risoluzione, dal momento che le schermate appaiono orribili quando stampate (specialmente se il grafico è stato ingrandito).Esportazione di grafici JUNG in immagini ad alta risoluzione (preferibilmente basate su vettori)

Il codice che uso attualmente è la seguente:

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(); 
    } 
} 

Questo crea immagini PNG non particolarmente alta risoluzione. Quindi le mie domande sono le seguenti:

  1. È possibile aumentare la risoluzione di esportazione PNG a 300 dpi?
  2. È possibile esportare il grafico, o qualsiasi componente di swing per quella materia, in formati vettoriali come EPS, PDF o SVG senza troppi problemi? Ho trovato diverse librerie (VectorGraphics2D, FreeHEP) per la gestione di immagini vettoriali basate su Java, tuttavia non sono sicuro che usarle significherebbe che devo "ri-disegnare" ogni vertice e spigolo nel grafico. Ovviamente non è molto desiderabile ...
  3. Ci sono altre alternative che potrei aver perso?

Grazie in anticipo,

+0

Forse, è possibile convertire il vostro raster risultante/file immagine bitmap in un file immagine vettoriale successivamente utilizzando una libreria di terze parti come Autotrace [http://autotrace.sourceforge.net/](http://autotrace.sourceforge.net/) – ecle

+0

Sei riuscito a risolvere questo problema? Perché nessuna delle seguenti risposte funziona effettivamente @posdef – SacJn

+0

@SacJn la risposta che ho postato qui sotto ** ha funzionato ** al momento, non posso dire se le librerie sono cambiate in un modo che rompe quella soluzione però. Non sto più lavorando a quel progetto #orphanproject #programminginacademia :) – posdef

risposta

5

Grazie per i suggerimenti, ma sono riuscito a ottenere FreeHEP Vector Graphics library lavorando nel modo che voglio. Sto condividendo il codice qui sotto nel caso qualcuno incontri le stesse domande.

La libreria sopra menzionata ha un menu di esportazione integrato molto carino, che gestisce l'esportazione in una serie di formati diversi. Codice estratto dalla classe modificata'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()); 
      } 
     } 
    } 

e l'ascoltatore di azione:

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

E se vuoi solo salvare direttamente l'immagine svg (senza la finestra di esportazione), Properties p = new Properties(); p.setProperty ("PageSize", "A5"); VectorGraphics g = nuovo SVGGraphics2D (nuovo file ("Output.svg"), nuova dimensione (400,300)); g.setProperties (p); g.startExport(); wvv.print (g); g.endExport(); – bikashg

+0

@bikashg: Ho provato a farlo per generare un file pdf o jpg come segue: VectorGraphics g = nuovo SVGGraphics2D (nuovo file ("Output.jpg"), nuova dimensione (400,300)); Ma non funziona. – 2c00L

+0

@Ashfaqur: hai creato l'oggetto grafico solo con quello stmento. Ora, è necessario stamparlo su un file usando g.startExport(); wvv.print (g); g.endExport(); – bikashg

1

Fondamentalmente un PNG sufficiente rilevare. La dimensione della risoluzione in un'immagine Buffered è pixel, non dpi. Quindi devi raddoppiare/triplicare il tuo width e height per ricevere una risoluzione migliore.

Graphics2D potrebbe scalare anche per i grafici JUNG.

Problemi correlati