Экспорт графиков JUNG в изображения высокого разрешения (желательно векторные)
В одном из моих проектов я использую 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, которые не имеют особо высокого разрешения. Итак, мои вопросы таковы:
- Можно ли увеличить разрешение экспорта PNG до 300 dpi?
- Можно ли без особых хлопот экспортировать график или любой другой компонент свинга в векторные форматы, такие как EPS, PDF или SVG? Я нашел несколько библиотек ( VectorGraphics2D, FreeHEP) для управления векторными изображениями в Java, однако я не уверен, что их использование будет означать, что мне придется "перерисовывать" каждую вершину и ребро графа. Это явно не очень желательно...
- Есть ли другие альтернативы, которые я мог бы пропустить?
Заранее спасибо,
4 ответа
Спасибо за предложения, но мне удалось заставить библиотеку FreeHEP Vector Graphics работать так, как я хочу. Я делюсь приведенным ниже кодом на случай, если кто-то столкнется с такими же вопросами.
Вышеупомянутая библиотека имеет очень хорошее встроенное меню экспорта, которое обрабатывает экспорт во множество различных форматов. Отрывок кода из модифицированного класса "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");
}
}
В основном PNG достаточно. Размерность разрешения в BufferedImage - пиксели, а не точки на дюйм. Так что вам нужно удвоить / утроить свой width
а также height
чтобы получить лучшее разрешение.
Graphics2D может масштабироваться и для графов JUNG.
Вы можете использовать Xchart, а затем экспортировать изображения с помощью vectorgraphics2d в SVG или PDF
Возможно, вы захотите использовать батик для этого: http://xmlgraphics.apache.org/batik/using/svg-generator.html