2011-12-15 77 views
5

在我的一個項目中,我使用JUNG2來顯示一個非常大的多父層次結構圖,顯示在一個小程序中。我需要將圖形的全部/部分導出爲高分辨率靜止圖像,因爲在打印時截圖看起來很可怕(特別是如果圖形已縮小)。將JUNG圖導出到高分辨率圖像(最好是基於矢量)

我目前使用的代碼如下:

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等基於矢量的格式,而無需太多麻煩?我發現了幾個用於管理Java中基於矢量的圖像的庫(VectorGraphics2D,FreeHEP),但我不確定是否使用它們意味着我必須「重新繪製」圖中的每個頂點和邊。這顯然不是很理想......
  3. 有沒有其他的選擇,我可能錯過了?

由於提前,

+0

也許,你可以把你生成的柵格/位圖圖像文件轉換成矢量圖像文件後使用第三方庫,如Autotrace [http://autotrace.sourceforge.net/](http://autotrace.sourceforge.net/) – ecle 2011-12-15 11:22:58

+0

你能解決這個問題?因爲以下答案實際上都不起作用@posdef – SacJn 2017-03-20 10:01:47

回答

5

感謝您的建議,但我設法讓FreeHEP Vector Graphics library以我想要的方式工作。如果有人遇到相同的問題,我將分享下面的代碼。

上面提到的庫有一個非常好的內置導出菜單,它處理導出到一堆不同的格式。

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

基本上一個PNG就足夠了。 BufferedImage中分辨率的尺寸是像素,而不是dpi。所以你需要加倍/加倍你的widthheight才能獲得更好的分辨率。

對於JUNG圖形,Graphics2D也可以縮放。