6

在我的一个项目中,我使用 JUNG2 来可视化一个非常大的多父层次结构图,显示在一个小程序中。我需要将图形的全部/部分导出为高分辨率静止图像,因为屏幕截图在打印时看起来很可怕(尤其是在图形被缩小的情况下)。

我目前使用的代码如下:

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 图像。所以我的问题如下:

  1. 是否可以将 PNG 导出分辨率提高到 300 dpi?
  2. 是否可以轻松地将图形或任何摆动组件导出为基于矢量的格式,例如 EPS、PDF 或 SVG?我找到了几个库(VectorGraphics2DFreeHEP)用于在 Java 中管理基于矢量的图像,但是我不确定使用它们是否意味着我必须“重新绘制”图中的每个顶点和边。这显然不是很可取...
  3. 还有其他我可能错过的选择吗?

提前致谢,

4

4 回答 4

6

感谢您的建议,但我已经设法让FreeHEP 矢量图形库按照我想要的方式工作。我将分享下面的代码,以防有人遇到同样的问题。

上面提到的库有一个非常好的内置导出菜单,它可以将导出处理为一堆不同的格式。修改后的“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");
    }
}
于 2011-12-19T10:29:16.723 回答
1

基本上一个PNG就足够了。BufferedImage 中的分辨率维度是像素,而不是 dpi。因此,您需要将您的两倍/三倍widthheight获得更好的分辨率。

Graphics2D 也可以针对 JUNG 图进行缩放。

于 2011-12-15T10:28:58.047 回答
0

您可能想为此使用蜡染:http: //xmlgraphics.apache.org/batik/using/svg-generator.html

于 2012-04-20T15:29:04.237 回答
0

您可以使用 Xchart,然后使用 vectorgraphics2d 将图片导出为 SVG 或 PDF

于 2018-03-20T05:12:14.797 回答