2012-05-02 6 views
6

私の質問に対する解決策を探していましたが、私が欲しいものは何もありません。JUNG:画像全体としてグラフ(可視部分だけでなく)を保存します。

私がしたいことは、画像(PNGまたはJPEG)にJungグラフ(カスタム頂点とエッジレンダリングを使用)を保存することです。 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-based-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())); 

グラフクラスのが、visualizationviewerの「getGraphLayout」という名前のこのような方法何がありません。

+0

正確に!私はそれを訂正した:) – dylan202

1

dylan202の示唆した方法で画像をキャプチャした私の経験では、画像の品質はマークまでではありませんでした。私は私のプレゼンテーションのためにイメージが必要だったので。

Jungネットワークの高品質画像を取得する別の方法は、FreeHEPのVectorGraphicsライブラリを使用することです。

私はこのライブラリを使用して、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などのファイルを生成することもできます。唯一の1行を変更する必要があるSVGファイルを生成するために例えば :詳細については

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

manualを参照してください。

PDFファイル Zoomed in snapshot from the PDF file

関連する問題