2010-10-04 11 views
6

So come ottenere un BufferedImage da JComponent, ma come ottenere un BufferedImage da un componente in java? L'enfasi qui è un oggetto del tipo "Componente" piuttosto che di JComponent.Come ottenere un'immagine Buffered da un componente in java?

Ho provato il seguente metodo, ma restituisce un'immagine completamente nera, cosa c'è che non va?

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

Che cosa si intende per "ottenere un BufferedImage da JComponent"? – aioobe

+0

Dai un'occhiata alla mia nuova risposta. Ora funziona. (Testato) –

risposta

1

Si potrebbe provare a utilizzare Component.paintAll.

È anche possibile passare un riferimento a un oggetto grafico (proveniente dall'immagine bufferizzata) a SwingUtilities.paintComponent.

+0

Sono con voi che l'intenzione della Q non è stata chiarita. Sarebbe stato bello se tu avessi menzionato il caso d'uso particolare per cui la tua risposta è adatta. –

8

Component ha un metodo paint(Graphics). Questo metodo si dipingerà sulla grafica passata. Questo è ciò che useremo per creare il BufferedImage, perché BufferedImage ha il pratico metodo getGraphics(). Ciò restituisce un oggetto Graphics che è possibile utilizzare per disegnare sullo BufferedImage.

UPDATE: Ma dobbiamo preconfigurare la grafica per il metodo paint. Questo è quello che ho trovato su di rendering del componente AWT a java.sun.com:

Quando AWT richiama questo metodo, il parametro oggetto Graphics è pre-configurato con l'appropriata Stato per disegnare su questo particolare componente:

  • Il colore dell'oggetto grafico è impostato sulla proprietà in primo piano del componente.
  • Il font dell'oggetto Graphics è impostato sulla proprietà font del componente.
  • La traduzione dell'oggetto grafico è impostata in modo tale che la coordinata (0,0) rappresenti l'angolo in alto a sinistra del componente.
  • Il rettangolo di clip dell'oggetto grafico è impostato sull'area del componente che deve essere ridipinto.

Quindi, questo è il nostro metodo risultante:

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

Com'è diverso da come lo faresti per un 'Componente'? Penso che la domanda abbia bisogno di alcuni chiarimenti. – aioobe

+0

Lo provo, ancora non ha funzionato, forse perché il componente che ho passato è un oggetto WebBrowser di JDIC, ​​è un componente non leggero, come ho detto nella mia altra domanda, sai come farlo funzionare? Qualcuno mi ha suggerito di usare CellRenderPane, ma non so come usarlo nel mio caso, nessun codice di esempio? – Frank

+0

+1 risposta execellent –