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

Я искал решения моего вопроса, но ничто не делает именно то, что я хочу.

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

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

спасибо вперед!

4 ответов


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

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
}

вы, возможно, захотите взглянуть на класс печати я собрал некоторое время назад:

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

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


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

другой способ получить высококачественные изображения вашей сети Юнга-использовать 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); 

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

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


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.