2012-05-02 8 views
6

Ho cercato soluzioni alla mia domanda, ma nulla fa esattamente quello che voglio.JUNG: salva l'intero grafico (non solo la parte visibile) come immagine

Quello che voglio fare è salvare un intero grafico JUNG (con rendering di vertici e bordi personalizzati) su un'immagine (PNG o JPEG). Quando salvi VisualizationViewer su BufferedImage, prende solo la parte visibile. Voglio salvare l'intero grafico, quindi non è un'opzione.

Qualcuno ha un'idea su come rendere il mio intero grafico a un'immagine?

Grazie in anticipo!

risposta

11

Ho finalmente trovato la soluzione al mio problema, utilizzando un VisualizationImageServer. Ecco un esempio di come creare un'immagine da un intero grafico JUNG, per gli altri alle prese con esso:

import edu.uci.ics.jung.visualization.VisualizationImageServer; 

... 

// Create the VisualizationImageServer 
// vv is the VisualizationViewer containing my graph 
VisualizationImageServer<Node, Edge> vis = 
    new VisualizationImageServer<Node, Edge>(vv.getGraphLayout(), 
     vv.getGraphLayout().getSize()); 

// Configure the VisualizationImageServer the same way 
// you did your VisualizationViewer. In my case e.g. 

vis.setBackground(Color.WHITE); 
vis.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<Edge>()); 
vis.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Node, Edge>()); 
vis.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>()); 
vis.getRenderer().getVertexLabelRenderer() 
    .setPosition(Renderer.VertexLabel.Position.CNTR); 

// Create the buffered image 
BufferedImage image = (BufferedImage) vis.getImage(
    new Point2D.Double(vv.getGraphLayout().getSize().getWidth()/2, 
    vv.getGraphLayout().getSize().getHeight()/2), 
    new Dimension(vv.getGraphLayout().getSize())); 

// Write image to a png file 
File outputfile = new File("graph.png"); 

try { 
    ImageIO.write(image, "png", outputfile); 
} catch (IOException e) { 
    // Exception handling 
} 
+0

E, se è necessario salvare una grafica vettoriale (invece di PNG), vedere questo: http://stackoverflow.com/questions/8518390/exporting-jung -graphs-to-hi-res-images-preferibilmente-basato su vettore – bikashg

+0

@ dylan202 L'immagine salvata non riflette alcun colore, forma o visibilità. Ti sei preoccupato di queste cose e hai trovato una soluzione? – SacJn

0
BufferedImage image = (BufferedImage) vis.getImage(
new Point2D.Double(graph.getGraphLayout().getSize().getWidth()/2, 
graph.getGraphLayout().getSize().getHeight()/2), 
new Dimension(graph.getGraphLayout().getSize())); 

Non c'è un metodo quali denominato "getGraphLayout" della classe di grafico, ma di un visualizationviewer .

+0

Esattamente! L'ho corretto :) – dylan202

1

La mia esperienza con l'acquisizione di immagini come suggerito da dylan202 era che la qualità delle immagini non era all'altezza. Dal momento che avevo bisogno delle immagini per la mia presentazione.

Un altro modo per ottenere immagini di alta qualità della rete Jung è utilizzare la libreria VectorGraphics da FreeHEP.

Ho usato questa libreria per generare immagini in un file pdf. Successivamente ho scattato delle istantanee dell'immagine dal pdf alla mia presentazione.

JPanel panel = new JPanel(); 
panel.setLayout(new FlowLayout()); 
panel.setBackground(Color.WHITE); 
panel.add(vv); 

Properties p = new Properties(); 
p.setProperty("PageSize","A4"); 

// vv is the VirtualizationViewer 

VectorGraphics g = new PDFGraphics2D(new File("Network.pdf"), vv);     

g.setProperties(p); 
g.startExport(); 
panel.print(g); 
g.endExport(); 

È anche possibile generare JPEG o altri tipi di file. Ad esempio, per generare i file SVG solo una linea deve essere cambiata:

VectorGraphics g = new SVGGraphics2D(new File("Network.svg"), vv); 

Per ulteriori informazioni vedere il manual.

zoom in un'istantanea dal file PDF Zoomed in snapshot from the PDF file