Salvando um JPanel como imagem

8 respostas
L

Olá galera!!!

Estou com o seguinte problema:

Tenho um extends JPanel que foi pintando com o paintComponent (override).
Queria salvar a imagem que fiz neste painel em um arquivo jpeg.

Bem, a dúvida é essa: Como e onde faço isso???
Se tiverem algum exemplo, melhor ainda…

Obrigado!!

8 Respostas

V
  1. Crie uma BufferedImage, coma as dimensões do painel:
  1. Obtenha o contexto gráfico dessa imagem:
  1. Faça o painel desenhar sobre essa imagem:
  1. Apague o contexto gráfico (isso não apagará a imagem):
  1. Salve a imagem no disco:
L

Muito obrigado ViniGodoy, mas não deu certo.

Vou mandar o código:

public class JuncaoPainel extends JFrame {

    private JPanel dadosP, fundoP;
    private PainelDesenho desenhosP;

       

    public JuncaoPainel() throws IOException {
        setTitle("Computação Gráfica   -   TP1");

        // é declarado null para dar liberdade para posicioná-los
        dadosP = new JPanel(null);
        desenhosP = new PainelDesenho();
        fundoP = new JPanel(null);

        // coloca o novo tamanho dos paineis e os posiciona
        dadosP.setBounds(0, 0, 400, 300);
        desenhosP.setBounds(400, 0, 400, 300);

        
        desenhosP.setBackground(Color.white);
        fundoP.setBackground(new Color(0, 142, 222));

        // cria um tipo de borda
        Border b1 = new LineBorder(Color.black, 2);

        // coloca borda nos paineis
        desenhosP.setBorder(b1);
        dadosP.setBorder(b1);


       
        // adiciona os paineis no frame
        add(fundoP);
        fundoP.add(dadosP);
        fundoP.add(desenhosP);

        // para visualisar os panels
        desenhosP.setVisible(true);
        dadosP.setVisible(true);




        BufferedImage imagem = new BufferedImage(desenhosP.getWidth(), desenhosP.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D graphics = imagem.createGraphics();
        desenhosP.paintComponent(graphics);
        graphics.dispose();
        ImageIO.write(imagem, "jpg", new File("painel.jpg"));
    }

   
}

Essa classe pinta o alguns desenhos no painel

public class PainelDesenho extends JPanel {


    public PainelDesenho(){

    }


    

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        setForeground(Color.blue);
        g.fillRect(0, 0, 50, 50);

        setForeground(Color.green);
        g.fillRect(50, 50, 100, 100);

        setForeground(Color.red);
        g.fillOval(100, 100, 150, 150);    
        
        
    }


}

Sai apenas uma imagem meio laranja na imagem de saída.
Se alguém puder me ajudar, agradeço!!!

V

Você pode tentar fazer o seguinte:

a) Chamar o método paint, ao invés do paintComponent:
desenhosP.paint(graphics);
b) Se ainda não der certo, separar a parte de pintura, para poder chama-la separadamente:
public void draw(Graphics g) {
      Graphics2D g2d = (Graphics2D) g.create();
      setForeground(Color.blue);  
      g2d.fillRect(0, 0, 50, 50);  
   
      setForeground(Color.green);  
      g2d.fillRect(50, 50, 100, 100);  
   
      setForeground(Color.red);  
      g2d.fillOval(100, 100, 150, 150);      
      g2d.dispose();
   }

  @Override  
     public void paintComponent(Graphics g) {  
         super.paintComponent(g);  
         draw(g);  
     }

//Mais tarde
desenhosP.draw(graphics);
L

Resolvido o problema!!!

Mundando para RGB

BufferedImage imagem = new BufferedImage(desenhosP.getWidth(), desenhosP.getHeight(), BufferedImage.TYPE_INT_RGB);

E adicionando isso:

Graphics2D g2d = (Graphics2D) g.create();

Ahhh… e claro, usem:

g2d.setPaint(Color.blue);

Ao invés de (substitua todos):

setForeground(Color.blue);

Só um problema, a imagem não fica com boa qualidade… se alguém souber de alguma forma de melhorar isso, poste aqui, ok?!

Valeww ViniGodoy!!!

V

Pode postar um screenshot do painel e da imagem para eu ver a diferença? Talvez seja só uma questão de ajustar os rendering hints.

L

A da esquerda foi com print screen, a da direita foi salva conforme o código postado anteriormente:

V

Tente outro formato, como png. A impressão que dá é que o Java está usando um grau de compactação muito alto no JPEG.

V

Veja se isso aqui te resolve também:
http://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression-quality-when-saving-images-in-java

Ele explica como eliminar a compressão do jpeg.

Criado 11 de novembro de 2009
Ultima resposta 19 de nov. de 2009
Respostas 8
Participantes 2