2011-12-15 2 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, без лишних хлопот? Я нашел несколько библиотек (VectorGraphics2D, FreeHEP) для управления векторными изображениями на Java, однако я не уверен, что использование их будет означать, что я должен «повторно рисовать» каждую вершину и ребро на графике. Это явно не очень желательно ...
  3. Есть ли другие альтернативы, которые я мог пропустить?

Спасибо заранее,

+0

Может быть, вы можете преобразовать полученный растр/файл растрового изображения в файл векторного изображения позже, используя стороннюю библиотеку, такую ​​как Autotrace [http://autotrace.sourceforge.net/](http://autotrace.sourceforge.net/) – ecle

+0

Вы смогли решить эту проблему? Поскольку ни один из следующих ответов на самом деле не работает @posdef – SacJn

+0

@SacJn ответ, который я опубликовал ниже ** сделал ** работать в то время, я не могу сказать, изменились ли библиотеки таким образом, что это разрывает это решение. Я больше не работаю над этим проектом #orphanproject #programminginacademia :) – posdef

ответ

5

Спасибо за предложения, но мне удалось получить 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

И если вы просто хотите напрямую сохранить изображение svg (без диалогового окна экспорта), Properties p = new Properties(); p.setProperty ("PageSize", "A5"); VectorGraphics g = новый SVGGraphics2D (новый файл («Output.svg»), новый размер (400 300)); g.setProperties (p); g.startExport(); wvv.print (g); г.endExport(); – bikashg

+0

@bikashg: Я пытался сделать это для создания файла pdf или jpg следующим образом: VectorGraphics g = новый SVGGraphics2D (новый файл («Output.jpg»), новый размер (400 300)); Но это не сработает. – 2c00L

+0

@Ashfaqur: Вы создали только графический объект с этим строем. Теперь вам нужно распечатать его в файл с помощью g.startExport(); wvv.print (г); g.endExport(); – bikashg

1

В основном PNG хватает. Размерность разрешения в BufferedImage - это пиксели, а не dpi. Поэтому вам нужно удвоить/утроить ваши width и height, чтобы получить лучшее разрешение.

Graphics2D может также масштабироваться для графиков JUNG.