2011-12-15 22 views
5

En uno de mis proyectos utilizo JUNG2 para visualizar un gráfico de jerarquía de múltiples padres muy grande, que se muestra en un applet. Tendría que exportar la totalidad/partes del gráfico a imágenes fijas de alta resolución, ya que las capturas de pantalla se ven horribles cuando se imprimen (especialmente si el gráfico se ha reducido).Exportación de gráficos JUNG a imágenes de alta resolución (preferiblemente basadas en vectores)

El código que uso actualmente es el siguiente:

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

Esto crea imágenes PNG que no son particularmente alta resolución. Entonces mis preguntas son las siguientes:

  1. ¿Es posible subir la resolución de exportación PNG a 300 ppp?
  2. ¿Es posible exportar el gráfico, o cualquier componente oscilante para el caso, a formatos basados ​​en vectores como EPS, PDF o SVG sin demasiada molestia? He encontrado varias bibliotecas (VectorGraphics2D, FreeHEP) para administrar imágenes basadas en vectores en Java, sin embargo, no estoy seguro si usarlas significaría que tengo que "volver a dibujar" cada vértice y borde en el gráfico. Eso obviamente no es muy deseable ...
  3. ¿Hay alguna otra alternativa que podría haber pasado por alto?

Gracias de antemano,

+0

Tal vez, usted puede convertir su trama resultante/el archivo de imagen de mapa de bits en un archivo de imagen vectorial después usando una biblioteca de terceros como Autotrace [http://autotrace.sourceforge.net/](http://autotrace.sourceforge.net/) – ecle

+0

¿Pudo resolver este problema? Debido a que ninguna de las siguientes respuestas realmente funciona @posdef – SacJn

+0

@SacJn, la respuesta que he publicado debajo ** no funcionó ** en ese momento, no puedo decir si las bibliotecas han cambiado de una manera que rompe esa solución. Ya no estoy trabajando en ese proyecto #orphanproject #programminginacademia :) – posdef

Respuesta

5

Gracias por las sugerencias, pero he logrado que FreeHEP Vector Graphics library funcione como yo quiero. Estoy compartiendo el código a continuación en caso de que alguien se encuentre con las mismas preguntas.

La biblioteca mencionada anteriormente tiene un muy buen menú de exportación incorporado, que maneja la exportación a varios formatos diferentes. extracto de código de la clase'ModelGraphMouse' modificación:

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

y el oyente de acción:

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

Y si solo quieres guardar directamente la imagen svg (sin el cuadro de diálogo de exportación), Properties p = new Properties(); p.setProperty ("Tamaño de página", "A5"); VectorGraphics g = new SVGGraphics2D (nuevo archivo ("Output.svg"), nueva dimensión (400,300)); g.setProperties (p); g.startExport(); wvv.print (g); g.endExport(); – bikashg

+0

@bikashg: Intenté hacer eso para generar un archivo pdf o jpg de la siguiente manera: VectorGraphics g = new SVGGraphics2D (nuevo archivo ("Output.jpg"), new Dimension (400,300)); Pero no funciona. – 2c00L

+0

@Ashfaqur: Usted solo creó el objeto gráfico con esa estructura. Ahora, necesita imprimirlo en un archivo usando g.startExport(); wvv.print (g); g.endExport(); – bikashg

1

Básicamente un PNG basta. La dimensión de resolución en una imagen Buffered es píxeles, no ppp. Por lo tanto, necesita duplicar/triplicar su width y height para recibir una mejor resolución.

Graphics2D también podría escalar para los gráficos JUNG.

Cuestiones relacionadas