2011-12-15 30 views
5

Trong một dự án của tôi, tôi sử dụng JUNG2 để hiển thị biểu đồ phân cấp nhiều bậc cha mẹ rất lớn, được hiển thị trong một applet. Tôi sẽ cần phải xuất toàn bộ/phần của biểu đồ thành hình ảnh tĩnh có độ phân giải cao, vì ảnh chụp màn hình trông ghê tởm khi được in (đặc biệt nếu biểu đồ đã được thu nhỏ).Xuất đồ thị JUNG sang hình ảnh có độ phân giải cao (tốt nhất là vector)

Mã Tôi hiện đang sử dụng như sau:

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(); 
    } 
} 

Điều này tạo ra hình ảnh PNG mà không đặc biệt độ phân giải cao. Vì vậy, câu hỏi của tôi như sau:

  1. Có thể đẩy độ phân giải xuất PNG lên 300 dpi không?
  2. Có thể xuất đồ thị hoặc bất kỳ thành phần xoay nào cho vấn đề đó, với các định dạng dựa trên vector như EPS, PDF hoặc SVG mà không có quá nhiều rắc rối? Tôi đã tìm thấy một số thư viện (VectorGraphics2D, FreeHEP) để quản lý hình ảnh dựa trên vector trong Java, tuy nhiên tôi không chắc chắn nếu sử dụng chúng có nghĩa là tôi phải "vẽ lại" từng đỉnh và cạnh trong biểu đồ. Điều đó rõ ràng không phải là rất mong muốn ...
  3. Có bất kỳ lựa chọn thay thế nào khác mà tôi có thể đã bỏ lỡ không?

Cảm ơn trước,

+0

Có lẽ, bạn có thể chuyển đổi raster kết quả của bạn/tệp hình ảnh bitmap vào tệp hình ảnh vector sau này bằng cách sử dụng thư viện của bên thứ ba như Autotrace [http://autotrace.sourceforge.net/] (http://autotrace.sourceforge.net/) – ecle

+0

Bạn có thể giải quyết vấn đề này không? Bởi vì không có câu trả lời nào sau đây thực sự hoạt động @posdef – SacJn

+0

@SacJn câu trả lời tôi đã đăng bên dưới ** đã ** làm việc tại thời điểm đó, tôi không thể nói nếu các thư viện đã thay đổi theo cách phá vỡ giải pháp đó. Tôi không làm việc trên dự án đó nữa #orphanproject #programminginacademia :) – posdef

Trả lời

5

Cảm ơn các đề xuất nhưng tôi đã cố gắng để có được FreeHEP Vector Graphics library hoạt động theo cách tôi muốn. Tôi đang chia sẻ mã bên dưới trong trường hợp bất kỳ ai chạy vào cùng một câu hỏi.

Thư viện được đặt tên trên có trình đơn xuất tích hợp sẵn rất đẹp, xử lý xuất sang nhiều định dạng khác nhau. Mã đoạn trích từ lớp'ModelGraphMouse' chỉnh sửa:

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()); 
      } 
     } 
    } 

và người nghe hành động:

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

Và nếu bạn chỉ muốn lưu trực tiếp hình ảnh svg (không có hộp thoại xuất khẩu), Properties p = new Properties(); p.setProperty ("PageSize", "A5"); VectorGraphics g = new SVGGraphics2D (tệp mới ("Output.svg"), thứ nguyên mới (400,300)); g.setProperties (p); g.startExport(); wvv.print (g); g.endExport(); – bikashg

+0

@bikashg: Tôi đã cố gắng thực hiện điều đó để tạo tệp pdf hoặc jpg như sau: VectorGraphics g = new SVGGraphics2D (tệp mới ("Output.jpg"), thứ nguyên mới (400,300)); Nhưng nó không hoạt động. – 2c00L

+0

@Ashfaqur: Bạn chỉ tạo đối tượng đồ họa với stament đó. Bây giờ, bạn cần in nó vào một tệp bằng cách sử dụng g.startExport(); wvv.print (g); g.endExport(); – bikashg

1

Về cơ bản một PNG đủ. Kích thước của độ phân giải trong BufferedImage là pixel, không phải dpi. Vì vậy, bạn cần phải tăng gấp đôi/gấp ba lần số widthheight để nhận được độ phân giải tốt hơn.

Graphics2D cũng có thể mở rộng cho biểu đồ JUNG.

Các vấn đề liên quan