2010-10-04 13 views
6

Sé cómo obtener una Imagen Buffered de JComponent, pero ¿cómo obtener una Imagen Buffered desde un Componente en Java? El énfasis aquí es un objeto del tipo "Componente" en lugar de JComponent.¿Cómo obtener una Imagen Buffered desde un Componente en Java?

He intentado el siguiente método, pero devuelve una imagen totalmente negra, ¿qué hay de malo en ello?

public static BufferedImage Get_Component_Image(Component myComponent,Rectangle region) throws IOException 
    { 
    BufferedImage img = new BufferedImage(myComponent.getWidth(), myComponent.getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics g = img.getGraphics(); 
    myComponent.paint(g); 
    g.dispose(); 
    return img; 
    } 
+1

¿Qué quiere decir por "conseguir un BufferedImage de JComponent"? – aioobe

+0

Mira mi nueva respuesta. Ahora funciona. (Probado) –

Respuesta

1

Puede intentar usar Component.paintAll.

También puede pasar una referencia a un objeto Graphics (que proviene de su imagen almacenada) SwingUtilities.paintComponent.

+0

Estoy contigo que la intención de la Q no ha sido aclarada. Hubiera sido bueno si hubieras mencionado el caso de uso particular para el cual tu respuesta es adecuada. –

8

Component tiene un método paint(Graphics). Ese método se pintará en los gráficos pasados. Esto es lo que vamos a usar para crear el BufferedImage, porque BufferedImage tiene el práctico método getGraphics(). Eso devuelve un Graphics -objeto que puede usar para dibujar en el BufferedImage.

ACTUALIZACIÓN: Pero tenemos que preconfigurar los gráficos para el método de pintura. Eso es lo que he encontrado sobre el componente AWT representación en java.sun.com:

Cuando AWT invoca este método, el parámetro objeto Graphics es preconfigurado con el estado apropiado para dibujar sobre este particular componente:

  • El color del objeto Graphics se establece en la propiedad de primer plano del componente.
  • La fuente del objeto Graphics se establece en la propiedad de fuente del componente.
  • La traducción del objeto Graphics se establece de forma que la coordenada (0,0) represente la esquina superior izquierda del componente.
  • El rectángulo del clip del objeto Graphics se establece en el área del componente que necesita repintar.

Por lo tanto, este es nuestro método resultante:

public static BufferedImage componentToImage(Component component, Rectangle region) throws IOException 
{ 
    BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); 
    Graphics g = img.getGraphics(); 
    g.setColor(component.getForeground()); 
    g.setFont(component.getFont()); 
    component.paintAll(g); 
    if (region == null) 
    { 
     region = new Rectangle(0, 0, img.getWidth(), img.getHeight()); 
    } 
    return img.getSubimage(region.x, region.y, region.width, region.height); 
} 
+1

¿En qué se diferencia esto de cómo lo haría con un 'Componente'? Creo que la pregunta necesita alguna aclaración. – aioobe

+0

Lo intento, todavía no funcionó, tal vez porque el Componente I que le envié es un objeto WebBrowser de JDIC, ​​es un Componente no liviano, como mencioné en mi otra pregunta, ¿sabe cómo hacer que funcione? Alguien sugirió que use CellRenderPane, pero no sé cómo usarlo en mi caso, ¿algún código de muestra? – Frank

+0

+1 excelente respuesta –

Cuestiones relacionadas