在我的一个项目中,我使用JUNG2可视化一个非常大的多父层次结构图,显示在applet中。我需要将图形的整个/部分导出为高分辨率静止图像,因为打印时屏幕截图看起来很可怕(特别是如果图形已经缩小)。
我目前使用的代码如下:
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();
}
}
这会创建分辨率不是特别高的PNG图像。所以我的问题如下:
提前致谢,
答案 0 :(得分:6)
感谢您的建议,但我已设法让FreeHEP Vector Graphics library以我想要的方式工作。我正在分享下面的代码,以防有人遇到相同的问题。
上面提到的库有一个非常好的内置导出菜单,它可以处理导出到一堆不同的格式。代码摘录自修改后的'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());
}
}
}
和动作监听器:
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 :(得分:1)
基本上PNG就足够了。 BufferedImage中的分辨率维度是像素,而不是dpi。因此,您需要将width
和height
加倍/三倍才能获得更好的分辨率。
Graphics2D也可以为JUNG图表进行扩展。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用Xchart,然后使用vectorgraphics2d将图片导出为SVG或PDF