2012-05-02 2 views
6

Я искал решения для моего вопроса, но ничего не делает именно то, что я хочу.JUNG: сохранить весь график (не только видимую часть) в качестве изображения

Что я хочу сделать, это сохранить весь график JUNG (с пользовательским вершинным и краевым рендерингом) для изображения (PNG или JPEG). Когда я сохраняю VisualizationViewer в BufferedImage, он принимает только видимую часть. Я хочу сохранить весь график, так что это не вариант.

Есть ли у кого-нибудь идея о том, как отобразить весь мой график?

Заранее благодарен!

ответ

11

Я, наконец, нашел решение своей проблемы, используя VisualizationImageServer. Вот пример того, как создать изображение из целой JUNG графа, для других борются с ним:

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

И, если вам нужно сохранить векторную графику (вместо PNG), увидеть это: http://stackoverflow.com/questions/8518390/exporting-jung -graphs-to-hi-res-images-предпочтительно-vector-based – bikashg

+0

@ dylan202 Сохраненное изображение не отражает цвет, форму или видимость. Вы беспокоились об этих вещах и нашли решение? – SacJn

1

Вы можете взглянуть на класс StandardPrint я ставлю вместе некоторое время назад:

http://tus.svn.sourceforge.net/viewvc/tus/tjacobs/print/

Вы можете оказать какой-либо компонент (или что-нибудь, используя SpecialPrint) к изображению, используя предварительный просмотр ()

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

Там нет такого метода под названием «getGraphLayout» класс Graph, но из visualizationviewer ,

+0

Точно! Я исправил это :) – dylan202

1

Мой опыт съемки изображений, как предположил dylan202, заключался в том, что качество изображений не соответствовало значению. Поскольку мне нужны были изображения для моей презентации.

Еще один способ получить высококачественные изображения вашей сети Jung - использовать библиотеку VectorGraphics от FreeHEP.

Я использовал эту библиотеку для создания изображений в pdf-файле. Впоследствии я сделал снимки изображения из pdf-файла для презентации.

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

Также возможно сгенерировать файлы JPEG или другого типа. Например, чтобы генерировать SVG файлы нужно только одна строка должна быть изменена:

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

Для получения дополнительной информации см manual.

Увеличенный снимок из файла PDF Zoomed in snapshot from the PDF file